当前位置:首页 > JavaScript

js实现光圈效果

2026-03-01 09:32:16JavaScript

实现光圈效果的JavaScript方法

光圈效果可以通过多种方式实现,包括CSS动画、Canvas绘图或WebGL。以下是几种常见的实现方法:

使用CSS和JavaScript结合

通过CSS定义动画效果,JavaScript控制触发时机:

js实现光圈效果

.aura {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  position: absolute;
  box-shadow: 0 0 20px 10px rgba(0, 150, 255, 0.5);
  animation: pulse 2s infinite;
}

@keyframes pulse {
  0% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.2); opacity: 0.7; }
  100% { transform: scale(1); opacity: 1; }
}
const element = document.createElement('div');
element.className = 'aura';
document.body.appendChild(element);

使用Canvas绘制动态光圈

Canvas提供了更灵活的控制方式:

js实现光圈效果

const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

let radius = 0;
let growing = true;

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  ctx.beginPath();
  ctx.arc(canvas.width/2, canvas.height/2, radius, 0, Math.PI*2);
  ctx.strokeStyle = `rgba(0, 150, 255, ${1 - radius/200})`;
  ctx.lineWidth = 10;
  ctx.stroke();

  if(growing) {
    radius += 2;
    if(radius > 200) growing = false;
  } else {
    radius -= 2;
    if(radius < 10) growing = true;
  }

  requestAnimationFrame(animate);
}

animate();

使用WebGL实现高级光圈效果

对于更复杂的光圈效果,WebGL是更好的选择:

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

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

// 片段着色器
const fsSource = `
  precision mediump float;
  uniform vec2 uResolution;
  uniform float uTime;

  void main() {
    vec2 uv = gl_FragCoord.xy / uResolution;
    float dist = distance(uv, vec2(0.5));
    float glow = 0.05 / dist * sin(uTime);
    gl_FragColor = vec4(0.0, 0.5, 1.0, glow);
  }
`;

// 编译着色器程序
const shaderProgram = initShaderProgram(gl, vsSource, fsSource);
// 绘制逻辑
function render(time) {
  // 设置uniform
  gl.uniform1f(gl.getUniformLocation(shaderProgram, 'uTime'), time/1000);
  // 绘制
  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  requestAnimationFrame(render);
}
requestAnimationFrame(render);

使用GSAP动画库

GSAP可以简化动画实现:

import { gsap } from 'gsap';

const circle = document.createElement('div');
circle.style.cssText = `
  width: 100px; height: 100px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(0,150,255,0.8) 0%, transparent 70%);
  position: absolute;
`;
document.body.appendChild(circle);

gsap.to(circle, {
  scale: 1.5,
  opacity: 0.5,
  duration: 2,
  repeat: -1,
  yoyo: true,
  ease: "sine.inOut"
});

实现光圈效果的注意事项

  • 性能优化:对于大量光圈效果,建议使用Canvas或WebGL而非DOM元素
  • 移动端适配:考虑触摸事件触发光圈效果
  • 颜色自定义:可以通过HSL颜色模型或渐变实现多彩光圈
  • 交互增强:光圈效果可以响应鼠标位置或触摸位置

以上方法可以根据具体需求选择或组合使用,CSS方法最简单,Canvas方法更灵活,WebGL方法性能最好但实现复杂度最高。

标签: 光圈效果
分享给朋友:

相关文章

css制作卷边效果

css制作卷边效果

使用伪元素和渐变实现卷边效果 通过CSS伪元素和线性渐变可以模拟纸张卷边的视觉效果。这种方法不需要额外元素,仅通过::before或::after伪元素实现。 .element { positi…

uniapp 卡片效果

uniapp 卡片效果

uniapp 实现卡片效果的方法 使用 view 和 CSS 样式 通过 view 组件结合 CSS 样式可以快速实现卡片效果。设置圆角、阴影和边距来增强视觉层次感。 <view cl…

vue实现折叠效果

vue实现折叠效果

使用 v-show 或 v-if 实现基础折叠 通过 Vue 的指令 v-show 或 v-if 控制元素的显示与隐藏。v-show 通过 CSS 的 display 属性切换,v-if 直接操作 D…

vue实现效果更新

vue实现效果更新

Vue 实现效果更新的方法 Vue 提供了多种方式实现动态效果更新,主要依赖其响应式系统和生命周期钩子。以下是几种常见的方法: 数据绑定与响应式更新 Vue 的核心是数据驱动视图。通过修改数据,视图…

vue实现翻牌效果

vue实现翻牌效果

实现翻牌效果的基本思路 翻牌效果通常指卡片正面和背面的翻转动画,可以通过CSS 3D变换和Vue的过渡系统实现。核心是利用transform-style: preserve-3d和rotateY旋转完…

vue实现动画效果

vue实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置的过渡系统 Vue 的 <tra…