当前位置:首页 > HTML

h5如何实现蜡烛点亮

2026-01-14 22:23:24HTML

实现蜡烛点亮的H5方法

在H5中实现蜡烛点亮效果,可以通过CSS动画、Canvas绘图或结合JavaScript交互来实现。以下是几种常见的方法:

h5如何实现蜡烛点亮

使用CSS动画和JavaScript

通过CSS定义火焰动画,配合JavaScript控制点击事件来切换蜡烛状态。

h5如何实现蜡烛点亮

<div class="candle">
  <div class="wick"></div>
  <div class="flame"></div>
</div>
.candle {
  position: relative;
  width: 60px;
  height: 120px;
  background: #f5a623;
  border-radius: 5px;
}

.wick {
  position: absolute;
  top: -10px;
  left: 50%;
  transform: translateX(-50%);
  width: 4px;
  height: 15px;
  background: #333;
}

.flame {
  position: absolute;
  top: -30px;
  left: 50%;
  transform: translateX(-50%);
  width: 20px;
  height: 40px;
  background: #ffde7d;
  border-radius: 50% 50% 20% 20%;
  opacity: 0;
  animation: flicker 1s infinite alternate;
}

@keyframes flicker {
  0% { transform: translateX(-50%) scale(1); opacity: 1; }
  100% { transform: translateX(-50%) scale(1.1); opacity: 0.8; }
}
document.querySelector('.candle').addEventListener('click', function() {
  const flame = document.querySelector('.flame');
  flame.style.opacity = flame.style.opacity === '1' ? '0' : '1';
});

使用Canvas绘制动态火焰

通过Canvas绘制更真实的火焰效果,利用粒子系统模拟火焰动态。

<canvas id="candleCanvas" width="200" height="300"></canvas>
const canvas = document.getElementById('candleCanvas');
const ctx = canvas.getContext('2d');
let isLit = false;

function drawFlame() {
  if (!isLit) return;

  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制蜡烛
  ctx.fillStyle = '#f5a623';
  ctx.fillRect(80, 100, 40, 150);

  // 绘制火焰
  const gradient = ctx.createRadialGradient(100, 80, 5, 100, 80, 20);
  gradient.addColorStop(0, 'white');
  gradient.addColorStop(0.5, 'yellow');
  gradient.addColorStop(1, 'orange');

  ctx.beginPath();
  ctx.moveTo(100, 60);
  ctx.bezierCurveTo(105, 40, 95, 40, 100, 60);
  ctx.fillStyle = gradient;
  ctx.fill();

  requestAnimationFrame(drawFlame);
}

canvas.addEventListener('click', () => {
  isLit = !isLit;
  drawFlame();
});

使用第三方动画库

利用GSAP或Anime.js等动画库实现更复杂的火焰效果。

<div id="candle" class="candle">
  <div class="flame"></div>
</div>
import { gsap } from 'gsap';

const candle = document.getElementById('candle');
const flame = document.querySelector('.flame');
let lit = false;

candle.addEventListener('click', () => {
  lit = !lit;

  if (lit) {
    gsap.to(flame, {
      opacity: 1,
      scale: 1.2,
      duration: 0.5,
      yoyo: true,
      repeat: -1
    });
  } else {
    gsap.to(flame, {
      opacity: 0,
      duration: 0.5
    });
  }
});

注意事项

  • 移动端适配需考虑touch事件替代click事件
  • 性能优化:Canvas动画需注意帧率控制
  • 视觉效果:可添加环境光变化增强沉浸感
  • 音效配合:点火/熄灭时可添加相应音效

以上方法可根据项目需求选择简单CSS实现或复杂Canvas效果,后者能提供更逼真的视觉体验但开发成本较高。

分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…

vue如何实现原理

vue如何实现原理

Vue 的核心实现原理 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化。以下分模块详细说明其实现机制。 响应式系统 Vue 2.x 使用 Object.defineProper…

vue如何实现分离

vue如何实现分离

Vue 实现组件分离的方法 Vue 可以通过多种方式实现组件分离,提升代码的可维护性和复用性。以下是几种常见的方法: 单文件组件 (SFC) Vue 的单文件组件(.vue 文件)将模板、脚本和样式…

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序的步骤 在 Vue 中实现冒泡排序,可以通过数据绑定和计算属性来动态展示排序过程。以下是一个完整的实现示例。 示例代码 <template> <div>…

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过…