html wave的实现

图片描述

如何实现wave动画?求demo

我理解的关键点:
1、色彩的均匀渐变,比较柔和,没有明显的过渡层
2、不同频率的正弦波

我的实现:

图片描述

效果相差很大!

let canvas1 = document.querySelector('#canvas1');
let ctx = canvas1.getContext('2d');
canvas1.width = canvas1.parentNode.offsetWidth;
canvas1.height = 150;

window.requestAnimFrame = (function () {
  return window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    function (callback) {
      window.setTimeout(callback, 1000 / 60);
    };
})();

let step = 0;
let line1 = ctx.createLinearGradient(30, 0, 120, 0);
let line2 = ctx.createLinearGradient(90, 0, 180, 0);
let line3 = ctx.createLinearGradient(160, 0, 250, 0);

line1.addColorStop(0.2, 'rgba(93,204,189, 0.4)');
line1.addColorStop(0.4, 'rgba(108,204,198, 0.4)');
line1.addColorStop(0.6, 'rgba(104,194,202, 0.4)');
line1.addColorStop(0.8, 'rgba(101,187,205, 0.4)');
line1.addColorStop(1, 'rgba(79,174,201, 0.4)');

line2.addColorStop(0.2, 'rgba(93,204,189, 0.4)');
line2.addColorStop(0.4, 'rgba(108,204,198, 0.4)');
line2.addColorStop(0.6, 'rgba(104,194,202, 0.4)');
line2.addColorStop(0.8, 'rgba(101,187,205, 0.4)');
line2.addColorStop(1, 'rgba(79,174,201, 0.4)');

line3.addColorStop(0.2, 'rgba(93,204,189, 0.4)');
line3.addColorStop(0.4, 'rgba(108,204,198, 0.4)');
line3.addColorStop(0.6, 'rgba(104,194,202, 0.4)');
line3.addColorStop(0.8, 'rgba(101,187,205, 0.4)');
line3.addColorStop(1, 'rgba(79,174,201, 0.4)');

let lines = [line1, line2, line3];

function loop() {
  ctx.clearRect(0, 0, canvas1.width, canvas1.height);
  step++;
  for (let j = lines.length - 1; j >= 0; j--) {
    ctx.fillStyle = lines[j];
    let angle = (step + j * 45) * Math.PI / 180;
    let deltaHeight = Math.sin(angle) * 30;
    let deltaHeightRight = Math.cos(angle) * 30;
    ctx.beginPath();
    ctx.moveTo(0, canvas1.height / 2 + deltaHeight);
    ctx.bezierCurveTo(canvas1.width / 2, canvas1.height / 2 + deltaHeight - 50, canvas1.width / 2, canvas1.height / 2 + deltaHeightRight - 50, canvas1.width, canvas1.height / 2 + deltaHeightRight);
    ctx.lineTo(canvas1.width, canvas1.height);
    ctx.lineTo(0, canvas1.height);
    ctx.lineTo(0, canvas1.height / 2 + deltaHeight);
    ctx.closePath();
    ctx.fill();
  }
  requestAnimFrame(loop);
}

loop();

阅读 2.9k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题