当前位置:首页 > JavaScript

js实现光圈

2026-01-31 13:00:32JavaScript

实现光圈效果的JavaScript方法

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

Canvas实现光圈效果

js实现光圈

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动画实现光圈效果

js实现光圈

<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提升性能

这些方法可以根据具体需求进行调整,创建从简单到复杂的不同光圈视觉效果。

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promis…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…