canvas动画效果新年祝福话语

html代码

 <ul id="ul"></ul>

css代码

* {
      margin: 0;
      padding: 0;
    }
    ul {
      list-style: none;
      position: relative;
    }
    ul.slow li {
      transition: 2.4s all;
    }
    li {
      width: var(--rect-width);
      height: var(--rect-width);
      position: absolute;
      transition: 2s all;
      left: 0;
      top: 0;
      background: black;
      opacity: 0;
      transform: translate(500px, 100px);
    }

js代码

"use strict";
const rectWidth = parseFloat(document.documentElement.style.getPropertyValue('--rect-width'));
const canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 20;

const ctx = canvas.getContext('2d');
ctx.font = '100 18px monospace';
ctx.textBaseline = 'top';
ctx.textAlign = 'center';
const ul = document.getElementById('ul');

function drawText(text) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  const gradient = ctx.createLinearGradient(10, 0, canvas.width - 10, 0);
  gradient.addColorStop(0, 'red');
  gradient.addColorStop(1 / 6, 'orange');
  gradient.addColorStop(2 / 6, 'yellow');
  gradient.addColorStop(3 / 6, 'green');
  gradient.addColorStop(4 / 6, 'blue');
  gradient.addColorStop(5 / 6, 'indigo');
  gradient.addColorStop(1, 'violet');
  ctx.fillStyle = gradient;
  ctx.fillText(text, canvas.width / 2, 2);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  let iLi = 0;
  for (let column = 0; column < imageData.width; column++) {
    for (let row = 0; row < imageData.height; row++) {
      const idx = ((row * imageData.width) + column) * 4;
      if (imageData.data[idx + 3] > 0) {
        const li = ul.children[iLi++];
        li.style.opacity = '1';
        li.style.transform = `translate(
          ${column * rectWidth}px,
          ${row * rectWidth}px)
          scale(1.5)`;
        li.style.background =
          `rgba(${imageData.data[idx]},${imageData.data[idx + 1]},${imageData.data[idx + 2]},${imageData.data[idx + 3] / 255})`;
      }
    }
  }
  while (iLi < 2000) {
    const li = ul.children[iLi++];
    li.style.opacity = '0';
  }
}

const timeout = t => new Promise(resolve => setTimeout(resolve, t));

void async function main() {
  const duration = 2500;
  {
    let i = 2000;
    const fragment = document.createDocumentFragment();
    while (i-- > 0) {
      fragment.appendChild(document.createElement('li'));
    }
    ul.appendChild(fragment);
  }

  await timeout(100);

  drawText('新年愿望');
  await timeout(duration);

  drawText('身体健康');
  await timeout(duration);

  drawText('有很多钱');
  await timeout(duration);

  ul.classList.add('slow');
  drawText('新年快乐!');
}();

效果图

 

转载于:https://www.cnblogs.com/vaelcy/p/10305071.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值