当前位置:首页 > JavaScript

js实现光圈

2026-03-02 04:15:07JavaScript

实现光圈效果的方法

光圈效果可以通过多种方式实现,以下是几种常见的方法:

使用CSS和JavaScript创建动态光圈

通过CSS定义光圈样式,JavaScript控制动画效果:

// 创建光圈元素
const halo = document.createElement('div');
halo.style.position = 'absolute';
halo.style.width = '100px';
halo.style.height = '100px';
halo.style.borderRadius = '50%';
halo.style.boxShadow = '0 0 20px 10px rgba(255, 255, 255, 0.5)';
halo.style.opacity = '0';
document.body.appendChild(halo);

// 动画控制
function animateHalo(x, y) {
  halo.style.left = `${x - 50}px`;
  halo.style.top = `${y - 50}px`;
  halo.style.opacity = '1';

  setTimeout(() => {
    halo.style.opacity = '0';
  }, 500);
}

// 跟随鼠标移动
document.addEventListener('mousemove', (e) => {
  animateHalo(e.clientX, e.clientY);
});

使用Canvas绘制光圈

Canvas提供了更灵活的绘图能力:

const canvas = document.createElement('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');

function drawHalo(x, y) {
  const gradient = ctx.createRadialGradient(x, y, 0, x, y, 50);
  gradient.addColorStop(0, 'rgba(255, 255, 255, 0.8)');
  gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');

  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();
  ctx.arc(x, y, 50, 0, Math.PI * 2);
  ctx.fillStyle = gradient;
  ctx.fill();
}

document.addEventListener('mousemove', (e) => {
  drawHalo(e.clientX, e.clientY);
});

使用WebGL实现高级光圈效果

对于更复杂的光圈效果,可以使用WebGL:

// 初始化WebGL上下文
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');

// 顶点着色器
const vsSource = `
  attribute vec2 position;
  void main() {
    gl_Position = vec4(position, 0.0, 1.0);
  }
`;

// 片段着色器
const fsSource = `
  precision highp float;
  uniform vec2 center;
  uniform float time;
  void main() {
    vec2 uv = gl_FragCoord.xy / vec2(800.0, 600.0);
    float dist = distance(uv, center);
    float halo = smoothstep(0.2, 0.0, dist);
    gl_FragColor = vec4(1.0, 1.0, 1.0, halo * (0.5 + 0.5 * sin(time)));
  }
`;

// 编译着色器程序
const shaderProgram = initShaderProgram(gl, vsSource, fsSource);

// 渲染循环
function render(time) {
  gl.clear(gl.COLOR_BUFFER_BIT);
  // 更新uniforms并绘制
  requestAnimationFrame(render);
}

光圈效果的优化技巧

性能优化

对于频繁更新的光圈效果,使用requestAnimationFrame进行动画循环,避免直接操作DOM。Canvas和WebGL版本通常比纯CSS版本性能更好。

视觉效果增强

添加颜色变化、大小变化或透明度动画可以使光圈效果更生动。可以使用GSAP等动画库简化复杂动画的实现。

响应式设计

确保光圈效果在不同屏幕尺寸上正常工作,通过监听resize事件调整Canvas大小或重新计算位置。

js实现光圈

window.addEventListener('resize', () => {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
});

以上方法可以根据具体需求选择或组合使用,CSS方法最简单但功能有限,Canvas提供了平衡的灵活性和性能,WebGL则适合需要最高性能或最复杂效果的场景。

标签: 光圈js
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…