Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • CSS

    • CSS绘制三角形
    • CSS排版上下文
    • CSS伪类
    • CSS伪元素
    • CSS实现列表元素分割线
    • CSS使用skew
    • CSS让物体居中
    • CSS绘制太极图
    • CSS使用实体替代预留符号
    • 动态修改after或before的content
    • CSS旋转border
    • CSS绘制空心五角星
    • CSS时钟
    • CSS图片手风琴伸缩效果
    • CSS的选择器
    • CSS波浪border
    • CSS内切圆角
    • CSS文字环绕
    • CSS outline使用详解
    • CSS使用transform缩放scale不生效
    • CSS使用linear-gradient或生成虚线
    • CSS 图片srcset属性
    • CSS object-fit属性详解
    • CSS 使用filter对颜色就行处理
    • CSS选择器的优先级
    • css与scss文件引入问题
    • CSS实现圆角梯形
    • 使用filter实现聚光灯效果
    • 利用backface-visibility hidden实现3d翻转双面card
    • 正方体3d旋转
    • 修改浏览器自动填充的背景颜色
    • CSS修改选中文字颜色
    • CSS实现打字机效果
    • marquee文字弹跳
    • logo文字图片倒影
    • 纯CSS实现popup弹窗
    • ie兼容inline-block
    • 浏览器默认样式
    • CSS效果-文字
    • CSS效果-按钮
    • css3 transition属性对linear-gradient渐变色无效
    • 不同预处理器下的样式穿透
    • 属性顺序
    • CSS重绘与回流
    • img标签与before和after
    • CSS实现文本两端对齐
    • CSS filter的contrast属性和blur属性奇特的结合
    • CSS不常用属性记录
    • CSS sprite雪碧图制作与使用
  • JavaScript

  • 工具

  • Vue

  • antdv踩坑记录

  • Vue3

  • 前端
  • CSS
kros
2024-03-09

使用filter实现聚光灯效果

废话不多说,先上效果

light

实现很简单,首先准备两张重叠图片底部图片显示灰度,上方图片显示原图并利用css的filter属性裁剪出圆形部分,即可实现如上效果,代码如下:

<div id="box">
  <img class="bg" ondragstart="return false;" src="https://i.pinimg.com/736x/a4/96/00/a496008c58815f0e1677ba24013f19bb.jpg" />
  <img id="filter-bg" class="bg-check" ondragstart="return false;" src="https://i.pinimg.com/736x/a4/96/00/a496008c58815f0e1677ba24013f19bb.jpg" />
</div>

1
2
3
4
5
div {
  position: relative;
  img {
    width: 500px;
    height: 300px;
    object-fit: cover;
    user-select: none;
    
  }
  .bg {
    filter: grayscale(95%);
  }
  .bg-check {
    position: absolute;
    left: 0;
    top: 0;
    clip-path: circle(50px at 142px 55px);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在js中,利用和拖拽一样的写法在鼠标点击、拖动时重新设置裁剪位置clip-path

let box = document.getElementById('box')
let sX, sY;
let clipEle = document.getElementById('filter-bg')
box.addEventListener('mousedown', (e) => {
  console.log('mousedown')
  sX = e.clientX;
  sY = e.clientY;
  console.log(sX, sY)
  clipEle.style.clipPath = `circle(50px at ${sX}px ${sY}px)`
  box.addEventListener('mousemove', mouseMove)
  box.addEventListener('mouseup', mouseUp)
})

function mouseMove(e) {
  sX = e.clientX;
  sY = e.clientY;
 clipEle.style.clipPath = `circle(50px at ${sX}px ${sY}px)`
}

function mouseUp() {
  // 移除鼠标移动和释放事件的监听
  box.removeEventListener('mousemove', mouseMove);
  box.removeEventListener('mouseup', mouseUp);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
上次更新: 2025/09/05, 8:09:00
CSS实现圆角梯形
利用backface-visibility hidden实现3d翻转双面card

← CSS实现圆角梯形 利用backface-visibility hidden实现3d翻转双面card→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev