如何用CSS自定义属性实现聚光灯效果

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何用CSS自定义属性实现聚光灯效果》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用CSS自定义属性实现聚光灯效果》有用,将其分享出去将是对创作者最好的鼓励。

CSS自定义属性也就是我们常说的CSS变量,它允许我们在样式表中定义可复用、可动态修改的属性值,结合CSS的裁剪、渐变和动画能力,可以很方便地实现聚光灯效果。这种效果可以模拟灯光照射的效果,让页面内容呈现出层次感,提升视觉吸引力。

如何用CSS自定义属性实现聚光灯效果

CSS自定义属性基础

CSS自定义属性以--开头命名,通常定义在根伪类:root中,这样可以在整个文档中复用。定义之后通过var()函数来调用自定义属性的值。

下面是一个简单的自定义属性定义示例:

:root {
  /* 定义聚光灯的位置自定义属性 */
  --spotlight-x: 50%;
  --spotlight-y: 50%;
  /* 定义聚光灯的半径 */
  --spotlight-radius: 150px;
}

.box {
  /* 调用自定义属性 */
  background: radial-gradient(
    circle at var(--spotlight-x) var(--spotlight-y),
    rgba(255, 255, 255, 0.8) 0%,
    rgba(255, 255, 255, 0) var(--spotlight-radius)
  );
}

聚光灯效果实现原理

聚光灯效果的核心逻辑是通过径向渐变radial-gradient生成一个中心亮、边缘暗的圆形区域,再通过clip-path或者背景叠加的方式,让这个亮区只显示在指定范围内。而CSS自定义属性的作用就是动态控制这个亮区的位置和大小,配合@keyframes动画就可以实现聚光灯移动的效果。

基础聚光灯效果实现

首先我们创建一个容器,给容器添加一个暗色的背景,再叠加一个径向渐变的半透明层,通过自定义属性控制渐变的中心位置,就可以得到基础的聚光灯效果。

<style>
:root {
  --spot-x: 50%;
  --spot-y: 50%;
  --spot-r: 120px;
}

.spotlight-container {
  position: relative;
  width: 800px;
  height: 400px;
  background: #1a1a2e;
  overflow: hidden;
  margin: 0 auto;
}

.spotlight-mask {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: radial-gradient(
    circle at var(--spot-x) var(--spot-y),
    rgba(255, 255, 255, 0.9) 0%,
    rgba(255, 255, 255, 0.1) 60%,
    transparent var(--spot-r)
  );
  pointer-events: none;
}

.content {
  position: relative;
  z-index: 1;
  color: #fff;
  padding: 40px;
  font-size: 18px;
  line-height: 1.6;
}
</style>

<div class="spotlight-container">
  <div class="spotlight-mask"></div>
  <div class="content">
    <h3>聚光灯效果展示</h3>
    <p>这是一段被聚光灯照射的内容,亮区会跟随自定义属性定义的位置变化。</p>
  </div>
</div>

添加动画让聚光灯移动

我们可以通过@keyframes定义动画,在动画的不同阶段修改自定义属性的值,让聚光灯在容器内移动。同时给遮罩层添加animation属性应用动画。

<style>
:root {
  --spot-x: 50%;
  --spot-y: 50%;
  --spot-r: 120px;
}

/* 定义聚光灯移动的动画 */
@keyframes moveSpotlight {
  0% {
    --spot-x: 20%;
    --spot-y: 30%;
  }
  25% {
    --spot-x: 70%;
    --spot-y: 20%;
  }
  50% {
    --spot-x: 80%;
    --spot-y: 70%;
  }
  75% {
    --spot-x: 30%;
    --spot-y: 80%;
  }
  100% {
    --spot-x: 20%;
    --spot-y: 30%;
  }
}

.spotlight-container {
  position: relative;
  width: 800px;
  height: 400px;
  background: #1a1a2e;
  overflow: hidden;
  margin: 0 auto;
}

.spotlight-mask {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: radial-gradient(
    circle at var(--spot-x) var(--spot-y),
    rgba(255, 255, 255, 0.9) 0%,
    rgba(255, 255, 255, 0.1) 60%,
    transparent var(--spot-r)
  );
  pointer-events: none;
  /* 应用动画,持续8秒,无限循环,线性速度 */
  animation: moveSpotlight 8s linear infinite;
}

.content {
  position: relative;
  z-index: 1;
  color: #fff;
  padding: 40px;
  font-size: 18px;
  line-height: 1.6;
}
</style>

<div class="spotlight-container">
  <div class="spotlight-mask"></div>
  <div class="content">
    <h3>动态聚光灯效果</h3>
    <p>聚光灯会按照预设的轨迹在容器内循环移动,所有位置变化都通过CSS自定义属性控制。</p>
  </div>
</div>

交互式聚光灯效果

如果希望聚光灯跟随鼠标移动,只需要监听容器的mousemove事件,计算鼠标在容器内的相对位置,再动态修改根元素上的自定义属性即可,不需要修改CSS样式逻辑。

// 获取聚光灯容器
const container = document.querySelector('.spotlight-container');
// 监听鼠标移动事件
container.addEventListener('mousemove', (e) => {
  // 计算鼠标在容器内的相对位置百分比
  const x = ((e.clientX - container.getBoundingClientRect().left) / container.offsetWidth) * 100;
  const y = ((e.clientY - container.getBoundingClientRect().top) / container.offsetHeight) * 100;
  // 修改CSS自定义属性
  document.documentElement.style.setProperty('--spot-x', `${x}%`);
  document.documentElement.style.setProperty('--spot-y', `${y}%`);
});

对应的CSS部分只需要保留之前的遮罩层样式,不需要修改动画相关代码,就可以实现鼠标跟随的聚光灯效果。

注意事项

  • CSS自定义属性的动画支持需要浏览器兼容,现代浏览器基本都支持该特性,如果需要兼容旧版本浏览器可以做降级处理。
  • 聚光灯的半径和透明度可以根据实际需求调整自定义属性的值,灵活控制效果强度。
  • 如果页面中有多个聚光灯效果,可以给不同的容器定义不同的自定义属性前缀,避免属性冲突。

CSS自定义属性聚光灯效果clip_pathlinear_gradientanimation修改时间:2026-06-04 07:09:11

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。