限时优惠活动
亲爱的苦力吧用户,我们为了回馈新老用户一直以来的鼎力支持,即日起(2025-02-06至2025-03-06)凡是购买苦力吧VIP/充值K币的新老用户,都直接可获得买一送一的优惠馈赠。例如:购买一个月的VIP会员可直接获得两个月的VIP会员;充值100K币可直接获得200K币,以此类推!有任何疑问可联系在线客服,感谢各位用户对苦力吧素材的信任与厚爱,我们将一如既往的给大家上新更多优质的素材源码,祝大家开工大吉、工作顺利、心想事成。

js鼠标点击页面触发烟花动画特效

所属分类: 网页特效-动画效果    2024-01-26 11:50:05

js鼠标点击页面触发烟花动画特效 ie兼容6
 查看演示  登录后下载 温馨提示
登录会员即可享受免费下载
 我要建站

js鼠标点击页面触发烟花动画特效(共2个文件)

    • click-spark.js
    • index.html

使用方法

  • code
  • source
  1. class ClickSpark extends HTMLElement {
  2. constructor() {
  3. super();
  4. this.attachShadow({ mode: "open" });
  5. this.root = document.documentElement;
  6. this.svg;
  7. }
  8. get activeEls() {
  9. return this.getAttribute("active-on");
  10. }
  11. connectedCallback() {
  12. this.setupSpark();
  13. this.root.addEventListener("click", (e) => {
  14. if (this.activeEls && !e.target.matches(this.activeEls)) return;
  15. this.setSparkPosition(e);
  16. this.animateSpark();
  17. });
  18. }
  19. animateSpark() {
  20. let sparks = [...this.svg.children];
  21. let size = parseInt(sparks[0].getAttribute("y1"));
  22. let offset = size / 2 + "px";
  23. let keyframes = (i) => {
  24. let deg = `calc(${i} * (360deg / ${sparks.length}))`;
  25. return [
  26. {
  27. strokeDashoffset: size * 3,
  28. transform: `rotate(${deg}) translateY(${offset})`,
  29. },
  30. {
  31. strokeDashoffset: size,
  32. transform: `rotate(${deg}) translateY(0)`,
  33. },
  34. ];
  35. };
  36. let options = {
  37. duration: 660,
  38. easing: "cubic-bezier(0.25, 1, 0.5, 1)",
  39. fill: "forwards",
  40. };
  41. sparks.forEach((spark, i) => spark.animate(keyframes(i), options));
  42. }
  43. setSparkPosition(e) {
  44. let rect = this.root.getBoundingClientRect();
  45. this.svg.style.left = e.clientX - rect.left - this.svg.clientWidth / 2 + "px";
  46. this.svg.style.top = e.clientY - rect.top - this.svg.clientHeight / 2 + "px";
  47. }
  48. setupSpark() {
  49. let template = `
  50. <style>
  51. :host {
  52. display: contents;
  53. }
  54. svg {
  55. pointer-events: none;
  56. position: absolute;
  57. rotate: -20deg;
  58. stroke: var(--click-spark-color, currentcolor);
  59. }
  60. line {
  61. stroke-dasharray: 30;
  62. stroke-dashoffset: 30;
  63. transform-origin: center;
  64. }
  65. </style>
  66. <svg width="30" height="30" viewBox="0 0 100 100" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="4">
  67. ${Array.from({ length: 8 }, (_) => `<line x1="50" y1="30" x2="50" y2="4"/>`).join("")}
  68. </svg>
  69. `;
  70. this.shadowRoot.innerHTML = template;
  71. this.svg = this.shadowRoot.querySelector("svg");
  72. }
  73. }
  74. customElements.define("click-spark", ClickSpark);
class ClickSpark extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
    this.root = document.documentElement;
    this.svg;
  }

  get activeEls() {
    return this.getAttribute("active-on");
  }

  connectedCallback() {
    this.setupSpark();

    this.root.addEventListener("click", (e) => {
      if (this.activeEls && !e.target.matches(this.activeEls)) return;

      this.setSparkPosition(e);
      this.animateSpark();
    });
  }

  animateSpark() {
    let sparks = [...this.svg.children];
    let size = parseInt(sparks[0].getAttribute("y1"));
    let offset = size / 2 + "px";

    let keyframes = (i) => {
      let deg = `calc(${i} * (360deg / ${sparks.length}))`;

      return [
        {
          strokeDashoffset: size * 3,
          transform: `rotate(${deg}) translateY(${offset})`,
        },
        {
          strokeDashoffset: size,
          transform: `rotate(${deg}) translateY(0)`,
        },
      ];
    };

    let options = {
      duration: 660,
      easing: "cubic-bezier(0.25, 1, 0.5, 1)",
      fill: "forwards",
    };

    sparks.forEach((spark, i) => spark.animate(keyframes(i), options));
  }

  setSparkPosition(e) {
    let rect = this.root.getBoundingClientRect();

    this.svg.style.left = e.clientX - rect.left - this.svg.clientWidth / 2 + "px";
    this.svg.style.top = e.clientY - rect.top - this.svg.clientHeight / 2 + "px";
  }

  setupSpark() {
    let template = `
      <style>
        :host {
          display: contents;
        }
        
        svg {
          pointer-events: none;
          position: absolute;
          rotate: -20deg;
          stroke: var(--click-spark-color, currentcolor);
        }

        line {
          stroke-dasharray: 30;
          stroke-dashoffset: 30;
          transform-origin: center;
        }
      </style>
      <svg width="30" height="30" viewBox="0 0 100 100" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="4">
        ${Array.from({ length: 8 }, (_) => `<line x1="50" y1="30" x2="50" y2="4"/>`).join("")}
      </svg>
    `;

    this.shadowRoot.innerHTML = template;
    this.svg = this.shadowRoot.querySelector("svg");
  }
}

customElements.define("click-spark", ClickSpark);

站长提示:
1. 苦力吧素材官方QQ群:950875342
2. 平台上所有素材资源,需注册登录会员方能正常下载。
3. 会员用户积极反馈网站、素材资源BUG或错误问题,每次奖励2K币
4. PHP源码类素材,如需协助安装调试,或你有二次开发需求,可联系苦力吧客服。
5. 付费素材资源,需充值后方能下载,如有任何疑问可直接联系苦力吧客服
相关资源 / 动画效果

jquery单击图片触发CSS3翻转显示文本文字特效

一款鼠标点击图片动画翻转显示DIV文本特效,使用CSS3转换来翻转DOM元素。基于Bootstrap,在鼠标点击时翻转卡片显示背面信息。
  动画效果
 6333  0

jquery可全屏或边栏进度条式的loader加载提示插件

一个轻量级且易于使用的jQuery插件,用于在页面上创建全屏加载指示器或底部加载栏。
  动画效果
 8362  0

纯CSS3鼠标悬停图片翻转动画特效

一款图片悬停翻转动画效果,鼠标悬停在图片上,即可触发图片翻转动画。
  动画效果
 8265  0

html5 canvas预期年化收益率圆环进度条效果

html5 canvas预期年化收益率圆环进度条效果
  动画效果
 4438  0

评论数(0) 回复有机会获得K币 用户协议

^_^ 还没有人评论,快来抢个沙发!
😀
  • 😀
  • 😊
  • 😂
  • 😍
  • 😑
  • 😷
  • 😵
  • 😛
  • 😣
  • 😱
  • 😋
  • 😎
  • 😵
  • 😕
  • 😶
  • 😚
  • 😜
  • 😭
发表评论