当前位置:首页 > JavaScript

js实现晚霞

2026-02-01 11:34:39JavaScript

实现晚霞效果的 JavaScript 方法

使用 Canvas 绘制渐变晚霞

通过 HTML5 Canvas 可以创建动态的晚霞效果,利用径向渐变和线性渐变模拟天空颜色变化:

js实现晚霞

const canvas = document.getElementById('sunsetCanvas');
const ctx = canvas.getContext('2d');

function drawSunset() {
  // 创建天空渐变
  const skyGradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
  skyGradient.addColorStop(0, '#FF7F50');  // 深橙色
  skyGradient.addColorStop(0.5, '#FF4500'); // 橙红色
  skyGradient.addColorStop(1, '#8B0000');  // 深红色

  ctx.fillStyle = skyGradient;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // 绘制太阳
  ctx.beginPath();
  ctx.arc(canvas.width/2, canvas.height/2, 50, 0, Math.PI * 2);
  const sunGradient = ctx.createRadialGradient(
    canvas.width/2, canvas.height/2, 10,
    canvas.width/2, canvas.height/2, 50
  );
  sunGradient.addColorStop(0, '#FFFF00');
  sunGradient.addColorStop(1, '#FFA500');
  ctx.fillStyle = sunGradient;
  ctx.fill();
}

drawSunset();

使用 CSS 动画创建晚霞背景

通过 CSS 关键帧动画可以实现颜色渐变的晚霞效果:

js实现晚霞

// 动态创建样式元素
const style = document.createElement('style');
style.textContent = `
  .sunset-sky {
    height: 100vh;
    background: linear-gradient(to bottom, #FF7F50, #FF4500, #8B0000);
    animation: sunsetGlow 10s infinite alternate;
  }

  @keyframes sunsetGlow {
    0% { background-color: #FF7F50; }
    50% { background-color: #FF4500; }
    100% { background-color: #8B0000; }
  }
`;
document.head.appendChild(style);

// 应用到页面元素
document.body.innerHTML = '<div class="sunset-sky"></div>';

使用 Three.js 创建 3D 晚霞

对于更逼真的效果,可以使用 WebGL 库 Three.js:

import * as THREE from 'three';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建天空盒
const skyGeometry = new THREE.SphereGeometry(500, 60, 40);
const skyMaterial = new THREE.ShaderMaterial({
  vertexShader: `
    varying vec3 vWorldPosition;
    void main() {
      vec4 worldPosition = modelMatrix * vec4(position, 1.0);
      vWorldPosition = worldPosition.xyz;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
  `,
  fragmentShader: `
    uniform vec3 topColor;
    uniform vec3 bottomColor;
    varying vec3 vWorldPosition;

    void main() {
      float h = normalize(vWorldPosition).y;
      gl_FragColor = vec4(mix(bottomColor, topColor, max(pow(h, 0.8), 0.0)), 1.0);
    }
  `,
  uniforms: {
    topColor: { value: new THREE.Color(0xFF4500) },
    bottomColor: { value: new THREE.Color(0x8B0000) }
  },
  side: THREE.BackSide
});

const sky = new THREE.Mesh(skyGeometry, skyMaterial);
scene.add(sky);

// 动画循环
function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

使用粒子系统模拟云彩

通过粒子系统可以增强晚霞的真实感:

const particles = new THREE.BufferGeometry();
const particleCount = 5000;
const positions = new Float32Array(particleCount * 3);

for (let i = 0; i < particleCount; i++) {
  const i3 = i * 3;
  positions[i3] = (Math.random() - 0.5) * 1000;
  positions[i3 + 1] = Math.random() * 200 + 100;
  positions[i3 + 2] = (Math.random() - 0.5) * 1000;
}

particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));
const particleMaterial = new THREE.PointsMaterial({
  color: 0xFF7F50,
  size: 5,
  transparent: true,
  opacity: 0.7
});

const particleSystem = new THREE.Points(particles, particleMaterial);
scene.add(particleSystem);

这些方法可以根据需求单独使用或组合使用,创建不同风格的晚霞视觉效果。Canvas 方法适合简单的二维效果,CSS 动画实现简单但效果有限,Three.js 则能创建更复杂的三维场景。

标签: 晚霞js
分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现交换

js实现交换

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

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…