HTML5 新魔法:打造梦幻水波涟漪动画

职场   2024-08-17 15:38   浙江  

作品简介

今天要给大家分享一个非常酷的HTML5网格涟漪动画。整个动画主要采用了CSS3的动画特性和颜色渐变特性,它的特点是:

  • 可通过大量带图标的小六边形快速生成一个大六边形。
  • 点击任何一个小六边形,即可从该六边形所在位置激起一层涟漪,就像水波一样。
  • 涟漪波动过程中,通过CSS的模糊特效使每个六边形出现模糊的效果,让动画更加逼真。

下面这段JS代码是激起涟漪动画的核心实现:

const ripple = (target) => {
    if (container.classList.contains("show-ripple")) {
      return;
    }
    const targetRect = target.getBoundingClientRect();
    const data = hexagonElements
      .map((element) => {
        const rect = element.getBoundingClientRect();
        const centerX = rect.x + rect.width / 2;
        const centerY = rect.y + rect.height / 2;
        const distance = Math.round(
          Math.sqrt(
            Math.pow(rect.x - targetRect.x, 2) +
              Math.pow(rect.y - targetRect.y, 2)
          )
        );
        return { element, rect, centerX, centerY, distance };
      })
      .sort((a, b) =>
        a.distance > b.distance ? 1 : a.distance < b.distance ? -1 : 0
      );

    const [max] = data.slice(-1);
    data.forEach((item) =>
      item.element.style.setProperty(
        "--ripple-factor",
        `${(item.distance * 100/ max.distance}`
      )
    );
    container.classList.toggle("show-ripple");
    const cleanUp = () => {
      requestAnimationFrame(() => {
        container.classList.remove("show-ripple");
        data.forEach((item) =>
          item.element.style.removeProperty("--ripple-factor")
        );
        max.element.removeEventListener("animationend", cleanUp);
      });
    };
    max.element.addEventListener("animationend", cleanUp);
  };

我们对hexagonElements数组中的每个六边形元素进行距离的调整,通过距离的连续微小变化来实现波动的效果。同时对六边形DOM元素进行动态CSS类的变换,实现波动过程中每个六边形的样式变化。

源码下载

需要完整源码的朋友可以在公众号主页回复“5070”获取下载链接。

请大家注意,源码仅供用于学习,请勿用于商业用途。

END


更多动画

纯 SVG + CSS 打造动感加载动画

超具科技感的 SVG 消息提醒动画按钮

HTML5 3D 相册长廊,基于 GSAP 动画库

丝滑的 SVG 复选框动画按钮 现代科幻风格

前端新世界
关注前端技术,分享互联网热点
 最新文章