js实现光圈
实现光圈效果的JavaScript方法
在JavaScript中实现光圈效果可以通过Canvas或CSS结合动画来完成。以下是两种常见的方法:
Canvas实现光圈效果

const canvas = document.getElementById('haloCanvas');
const ctx = canvas.getContext('2d');
let radius = 0;
const maxRadius = 100;
function drawHalo() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 创建径向渐变
const gradient = ctx.createRadialGradient(
canvas.width/2, canvas.height/2, radius * 0.7,
canvas.width/2, canvas.height/2, radius
);
gradient.addColorStop(0, 'rgba(255, 255, 255, 0.8)');
gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
ctx.fillStyle = gradient;
ctx.beginPath();
ctx.arc(canvas.width/2, canvas.height/2, radius, 0, Math.PI * 2);
ctx.fill();
radius += 1;
if (radius > maxRadius) radius = 0;
requestAnimationFrame(drawHalo);
}
drawHalo();
CSS动画实现光圈效果

<div class="halo"></div>
<style>
.halo {
width: 100px;
height: 100px;
border-radius: 50%;
position: absolute;
background: radial-gradient(
circle,
rgba(255,255,255,0.8) 0%,
rgba(255,255,255,0) 70%
);
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
transform: scale(0.8);
opacity: 0.8;
}
70% {
transform: scale(1.3);
opacity: 0;
}
100% {
transform: scale(0.8);
opacity: 0;
}
}
</style>
光圈效果增强技巧
调整颜色和透明度可以创建不同风格的光圈效果。对于更自然的效果,可以使用多层渐变:
// 多层光圈示例
function drawMultiHalo() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < 3; i++) {
const currentRadius = radius + i * 20;
const gradient = ctx.createRadialGradient(
canvas.width/2, canvas.height/2, currentRadius * 0.6,
canvas.width/2, canvas.height/2, currentRadius
);
gradient.addColorStop(0, `rgba(100, 200, 255, ${0.8 - i*0.2})`);
gradient.addColorStop(1, 'rgba(100, 200, 255, 0)');
ctx.fillStyle = gradient;
ctx.beginPath();
ctx.arc(canvas.width/2, canvas.height/2, currentRadius, 0, Math.PI * 2);
ctx.fill();
}
radius += 0.5;
if (radius > maxRadius) radius = 0;
requestAnimationFrame(drawMultiHalo);
}
性能优化建议
对于需要频繁更新的光圈动画,考虑以下优化措施:
- 使用
requestAnimationFrame而不是setInterval - 尽量减少每帧绘制的操作数量
- 对于静态光圈,可以预渲染为图像
- 在CSS实现中,使用
will-change: transform提升性能
这些方法可以根据具体需求进行调整,创建从简单到复杂的不同光圈视觉效果。






