2024年3月7日星期四

hexo添加鼠标动作效果

  1. 在themes\next\source\js下新建文件夹cursor

  2. 在文件夹cursor下新建两个js文件

    1. cherry.js

      (function cherry() {
          var possibleColors = ["#D61C59", "#E7D84B", "#1B8798"]
          var width = window.innerWidth;
          var height = window.innerHeight;
          var cursor = {x: width/2, y: width/2};
          var particles = [];
          
          function init() {
            bindEvents();
            loop();
          }  
          // Bind events that are needed
          function bindEvents() {
            document.addEventListener('mousemove', onMouseMove);
            document.addEventListener('touchmove', onTouchMove);
            document.addEventListener('touchstart', onTouchMove);
            
            window.addEventListener('resize', onWindowResize);
          }  
          function onWindowResize(e) {
            width = window.innerWidth;
            height = window.innerHeight;
          } 
          function onTouchMove(e) {
            if( e.touches.length > 0 ) {
              for( var i = 0; i < e.touches.length; i++ ) {
                addParticle( e.touches[i].clientX, e.touches[i].clientY, possibleColors[Math.floor(Math.random()*possibleColors.length)]);
              }
            }
          }
          function onMouseMove(e) {    
            cursor.x = e.clientX;
            cursor.y = e.clientY;
            
            addParticle( cursor.x, cursor.y, possibleColors[Math.floor(Math.random()*possibleColors.length)]);
          }
          function addParticle(x, y, color) {
            var particle = new Particle();
            particle.init(x, y, color);
            particles.push(particle);
          }
          function updateParticles() {
            for( var i = 0; i < particles.length; i++ ) {
              particles[i].update();
            }
            for( var i = particles.length -1; i >= 0; i-- ) {
              if( particles[i].lifeSpan < 0 ) {
                particles[i].die();
                particles.splice(i, 1);
              }
            }
          }
          function loop() {
            requestAnimationFrame(loop);
            updateParticles();
          }
          function Particle() {
            this.character = "*";
            this.lifeSpan = 120; //ms
            this.initialStyles ={
              "position": "fixed",
              "top": "0", //必须加
              "display": "block",
              "pointerEvents": "none",
              "z-index": "10000000",
              "fontSize": "20px",
              "will-change": "transform"
            };
            this.init = function(x, y, color) {
              this.velocity = {
                x:  (Math.random() < 0.5 ? -1 : 1) * (Math.random() / 2),
                y: 1
              };
              this.position = {x: x - 10, y: y - 20};
              this.initialStyles.color = color;
              console.log(color);
        
              this.element = document.createElement('span');
              this.element.innerHTML = this.character;
              applyProperties(this.element, this.initialStyles);
              this.update();
              
              document.body.appendChild(this.element);
            };
            this.update = function() {
              this.position.x += this.velocity.x;
              this.position.y += this.velocity.y;
              this.lifeSpan--;
              this.element.style.transform = "translate3d(" + this.position.x + "px," + this.position.y + "px,0) scale(" + (this.lifeSpan / 120) + ")";
            }
            this.die = function() {
              this.element.parentNode.removeChild(this.element);
            }
          }
          function applyProperties( target, properties ) {
            for( var key in properties ) {
              target.style[ key ] = properties[ key ];
            }
          }
          init();
        })();
      
    2. explosion.min.js

      "use strict";
      function updateCoords(e) {
          pointerX = (e.clientX || e.touches[0].clientX) - canvasEl.getBoundingClientRect().left,
          pointerY = e.clientY || e.touches[0].clientY - canvasEl.getBoundingClientRect().top
      }
      function setParticuleDirection(e) {
          var t = anime.random(0, 360) * Math.PI / 180,
          a = anime.random(50, 180),
          n = [ - 1, 1][anime.random(0, 1)] * a;
          return {
              x: e.x + n * Math.cos(t),
              y: e.y + n * Math.sin(t)
          }
      }
      function createParticule(e, t) {
          var a = {};
          return a.x = e,
          a.y = t,
          a.color = colors[anime.random(0, colors.length - 1)],
          a.radius = anime.random(16, 32),
          a.endPos = setParticuleDirection(a),
          a.draw = function() {
              ctx.beginPath(),
              ctx.arc(a.x, a.y, a.radius, 0, 2 * Math.PI, !0),
              ctx.fillStyle = a.color,
              ctx.fill()
          },
          a
      }
      function createCircle(e, t) {
          var a = {};
          return a.x = e,
          a.y = t,
          a.color = "#F00",
          a.radius = 0.1,
          a.alpha = 0.5,
          a.lineWidth = 6,
          a.draw = function() {
              ctx.globalAlpha = a.alpha,
              ctx.beginPath(),
              ctx.arc(a.x, a.y, a.radius, 0, 2 * Math.PI, !0),
              ctx.lineWidth = a.lineWidth,
              ctx.strokeStyle = a.color,
              ctx.stroke(),
              ctx.globalAlpha = 1
          },
          a
      }
      function renderParticule(e) {
          for (var t = 0; t < e.animatables.length; t++) {
              e.animatables[t].target.draw()
          }
      }
      function animateParticules(e, t) {
          for (var a = createCircle(e, t), n = [], i = 0; i < numberOfParticules; i++) {
              n.push(createParticule(e, t))
          }
          anime.timeline().add({
              targets: n,
              x: function(e) {
                  return e.endPos.x
              },
              y: function(e) {
                  return e.endPos.y
              },
              radius: 0.1,
              duration: anime.random(1200, 1800),
              easing: "easeOutExpo",
              update: renderParticule
          }).add({
              targets: a,
              radius: anime.random(80, 160),
              lineWidth: 0,
              alpha: {
                  value: 0,
                  easing: "linear",
                  duration: anime.random(600, 800)
              },
              duration: anime.random(1200, 1800),
              easing: "easeOutExpo",
              update: renderParticule,
              offset: 0
          })
      }
      function debounce(e, t) {
          var a;
          return function() {
              var n = this,
              i = arguments;
              clearTimeout(a),
              a = setTimeout(function() {
                  e.apply(n, i)
              },
              t)
          }
      }
      var canvasEl = document.querySelector(".fireworks");
      if (canvasEl) {
          var ctx = canvasEl.getContext("2d"),
          numberOfParticules = 30,
          pointerX = 0,
          pointerY = 0,
          tap = "mousedown",
          colors = ["#FF1461", "#18FF92", "#5A87FF", "#FBF38C"],
          setCanvasSize = debounce(function() {
              canvasEl.width = 2 * window.innerWidth,
              canvasEl.height = 2 * window.innerHeight,
              canvasEl.style.width = window.innerWidth + "px",
              canvasEl.style.height = window.innerHeight + "px",
              canvasEl.getContext("2d").scale(2, 2)
          },
          500),
          render = anime({
              duration: 1 / 0,
              update: function() {
                  ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)
              }
          });
          document.addEventListener(tap,
          function(e) {
              "sidebar" !== e.target.id && "toggle-sidebar" !== e.target.id && "A" !== e.target.nodeName && "IMG" !== e.target.nodeName && (render.play(), updateCoords(e), animateParticules(pointerX, pointerY))
          },
          !1),
          setCanvasSize(),
          window.addEventListener("resize", setCanvasSize, !1)
      }
      "use strict";
      function updateCoords(e) {
          pointerX = (e.clientX || e.touches[0].clientX) - canvasEl.getBoundingClientRect().left,
          pointerY = e.clientY || e.touches[0].clientY - canvasEl.getBoundingClientRect().top
      }
      function setParticuleDirection(e) {
          var t = anime.random(0, 360) * Math.PI / 180,
          a = anime.random(50, 180),
          n = [ - 1, 1][anime.random(0, 1)] * a;
          return {
              x: e.x + n * Math.cos(t),
              y: e.y + n * Math.sin(t)
          }
      }
      function createParticule(e, t) {
          var a = {};
          return a.x = e,
          a.y = t,
          a.color = colors[anime.random(0, colors.length - 1)],
          a.radius = anime.random(16, 32),
          a.endPos = setParticuleDirection(a),
          a.draw = function() {
              ctx.beginPath(),
              ctx.arc(a.x, a.y, a.radius, 0, 2 * Math.PI, !0),
              ctx.fillStyle = a.color,
              ctx.fill()
          },
          a
      }
      function createCircle(e, t) {
          var a = {};
          return a.x = e,
          a.y = t,
          a.color = "#F00",
          a.radius = 0.1,
          a.alpha = 0.5,
          a.lineWidth = 6,
          a.draw = function() {
              ctx.globalAlpha = a.alpha,
              ctx.beginPath(),
              ctx.arc(a.x, a.y, a.radius, 0, 2 * Math.PI, !0),
              ctx.lineWidth = a.lineWidth,
              ctx.strokeStyle = a.color,
              ctx.stroke(),
              ctx.globalAlpha = 1
          },
          a
      }
      function renderParticule(e) {
          for (var t = 0; t < e.animatables.length; t++) {
              e.animatables[t].target.draw()
          }
      }
      function animateParticules(e, t) {
          for (var a = createCircle(e, t), n = [], i = 0; i < numberOfParticules; i++) {
              n.push(createParticule(e, t))
          }
          anime.timeline().add({
              targets: n,
              x: function(e) {
                  return e.endPos.x
              },
              y: function(e) {
                  return e.endPos.y
              },
              radius: 0.1,
              duration: anime.random(1200, 1800),
              easing: "easeOutExpo",
              update: renderParticule
          }).add({
              targets: a,
              radius: anime.random(80, 160),
              lineWidth: 0,
              alpha: {
                  value: 0,
                  easing: "linear",
                  duration: anime.random(600, 800)
              },
              duration: anime.random(1200, 1800),
              easing: "easeOutExpo",
              update: renderParticule,
              offset: 0
          })
      }
      function debounce(e, t) {
          var a;
          return function() {
              var n = this,
              i = arguments;
              clearTimeout(a),
              a = setTimeout(function() {
                  e.apply(n, i)
              },
              t)
          }
      }
      var canvasEl = document.querySelector(".fireworks");
      if (canvasEl) {
          var ctx = canvasEl.getContext("2d"),
          numberOfParticules = 30,
          pointerX = 0,
          pointerY = 0,
          tap = "mousedown",
          colors = ["#FF1461", "#18FF92", "#5A87FF", "#FBF38C"],
          setCanvasSize = debounce(function() {
              canvasEl.width = 2 * window.innerWidth,
              canvasEl.height = 2 * window.innerHeight,
              canvasEl.style.width = window.innerWidth + "px",
              canvasEl.style.height = window.innerHeight + "px",
              canvasEl.getContext("2d").scale(2, 2)
          },
          500),
          render = anime({
              duration: 1 / 0,
              update: function() {
                  ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)
              }
          });
          document.addEventListener(tap,
          function(e) {
              "sidebar" !== e.target.id && "toggle-sidebar" !== e.target.id && "A" !== e.target.nodeName && "IMG" !== e.target.nodeName && (render.play(), updateCoords(e), animateParticules(pointerX, pointerY))
          },
          !1),
          setCanvasSize(),
          window.addEventListener("resize", setCanvasSize, !1)
      };
      
  3. 在themes\next\layout下新建文件夹_custom

  4. 在新建文件夹_custom下新建一个custom.swig文件

    [%- if theme.cursor_effect %]
      [%- if theme.cursor_effect.type == "explosion" %]
        <canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas>
        <script src="//cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script>
        <script src="/js/cursor/explosion.min.js"></script>
      [%- elseif theme.cursor_effect.type == "cherry" %]
        <script src="/js/cursor/cherry.js"></script>
      [%- endif %]
    [%- endif %]
    
    
  5. 在themes\next\layout下的_layout.swig文件中添加以下代码

    {% include '_custom/custom.swig' %}
    
  6. 在themes\next_config.yml中添加以下代码

    # cherry: 樱花 | explosion:爆炸 
    cursor_effect:
      enabled: true
      type: cherry 
    
  7. 大功告成

没有评论:

发表评论

为你写诗

 竹意 赋竹几时诗意浓,风雪知我意朦胧 寒风凛冽吹竹叶,大雪纷飞映竹容 月下竹影摇清梦,雪中竹枝舞星穹 书篇小竹诉音避,愿留诗意在竹中 一潦西流水 甲辰 霜月 望 于沪