繁体   English   中英

问题实现 codepen.io 鼠标轨迹

[英]Issue implementing codepen.io mouse trail

我试图实现这个

https://codepen.io/Mertl/pen/XWdyRwJ变成一个雨果模板https://themes.gohugo.io/somrat/

我不知道把 html 文件放在哪里; 仅将没有 cursor 部分放入 style.css; 并将.js复制到script.js中,当我这样做时,localhost网站上没有任何反应,感谢您提供任何帮助<3

代码:(html、css 和 js)

<canvas id="canvas"></canvas>

body,
html {
  margin: 0px;
  padding: 0px;
  position: fixed;
  background: rgb(30, 30, 30);
  cursor: none;
}

window.onload = function () {
  //functions definition

  //class definition
  class segm {
    constructor(x, y, l) {
      this.b = Math.random()*1.9+0.1;
      this.x0 = x;
      this.y0 = y;
      this.a = Math.random() * 2 * Math.PI;
      this.x1 = this.x0 + l * Math.cos(this.a);
      this.y1 = this.y0 + l * Math.sin(this.a);
      this.l = l;
    }
    update(x, y) {
      this.x0 = x;
      this.y0 = y;
      this.a = Math.atan2(this.y1 - this.y0, this.x1 - this.x0);
      this.x1 = this.x0 + this.l * Math.cos(this.a);
      this.y1 = this.y0 + this.l * Math.sin(this.a);
    }
  }
  class rope {
    constructor(tx, ty, l, b, slq, typ) {
      if(typ == "l"){
        this.res = l / 2;
      }else{
        this.res = l / slq;
      }
      this.type = typ;
      this.l = l;
      this.segm = [];
      this.segm.push(new segm(tx, ty, this.l / this.res));
      for (let i = 1; i < this.res; i++) {
        this.segm.push(
          new segm(this.segm[i - 1].x1, this.segm[i - 1].y1, this.l / this.res)
        );
      }
      this.b = b;
    }
    update(t) {
      this.segm[0].update(t.x, t.y);
      for (let i = 1; i < this.res; i++) {
        this.segm[i].update(this.segm[i - 1].x1, this.segm[i - 1].y1);
      }
    }
    show() {
      if(this.type == "l"){
      c.beginPath();
      for (let i = 0; i < this.segm.length; i++) {
        c.lineTo(this.segm[i].x0, this.segm[i].y0);
      }
      c.lineTo(
        this.segm[this.segm.length - 1].x1,
        this.segm[this.segm.length - 1].y1
      );
      c.strokeStyle = "white";
      c.lineWidth = this.b;
      c.stroke();

      c.beginPath();
      c.arc(this.segm[0].x0, this.segm[0].y0, 1, 0, 2 * Math.PI);
      c.fillStyle = "white";
      c.fill();

      c.beginPath();
      c.arc(
        this.segm[this.segm.length - 1].x1,
        this.segm[this.segm.length - 1].y1,
        2,
        0,
        2 * Math.PI
      );
      c.fillStyle = "white";
      c.fill();
      }else{
      for (let i = 0; i < this.segm.length; i++) {
        c.beginPath();
        c.arc(this.segm[i].x0, this.segm[i].y0, this.segm[i].b, 0, 2*Math.PI);
        c.fillStyle = "white";
      c.fill();
      }
        c.beginPath();
      c.arc(
        this.segm[this.segm.length - 1].x1,
        this.segm[this.segm.length - 1].y1,
        2, 0, 2*Math.PI
      );
      c.fillStyle = "white";
      c.fill();
      }
    }
  }

  //setting up canvas
  let c = init("canvas").c,
    canvas = init("canvas").canvas,
    w = (canvas.width = window.innerWidth),
    h = (canvas.height = window.innerHeight),
    ropes = [];

  //variables definition
  let nameOfVariable = "value",
    mouse = {},
    last_mouse = {},
    rl = 50,
    randl = [],
    target = { x: w/2, y: h/2 },
    last_target = {},
    t = 0,
    q = 10,
    da = [],
    type = "l";

  for (let i = 0; i < 100; i++) {
    if(Math.random() > 0.25){
        type = "l";
      }else{
        type = "o";
      }
    ropes.push(
      new rope(
        w / 2,
        h / 2,
        (Math.random() * 1 + 0.5) * 500,
        Math.random() * 0.4 + 0.1,
        Math.random()*15+5,
        type
      )
    );
    randl.push(Math.random() * 2 - 1);
    da.push(0);
  }

  //place for objects in animation
  function draw() {
    
    if (mouse.x) {
      target.errx = mouse.x - target.x;
      target.erry = mouse.y - target.y;
    } else {
      target.errx =
        w / 2 +
        (h / 2 - q) *
          Math.sqrt(2) *
          Math.cos(t) /
          (Math.pow(Math.sin(t), 2) + 1) -
        target.x;
      target.erry =
        h / 2 +
        (h / 2 - q) *
          Math.sqrt(2) *
          Math.cos(t) *
          Math.sin(t) /
          (Math.pow(Math.sin(t), 2) + 1) -
        target.y;
    }

    target.x += target.errx / 10;
    target.y += target.erry / 10;

    t += 0.01;
    
    for (let i = 0; i < ropes.length; i++) {
      if (randl[i] > 0) {
        da[i] += (1 - randl[i]) / 10;
      } else {
        da[i] += (-1 - randl[i]) / 10;
      }
      ropes[i].update({
        x:
          target.x +
          randl[i] * rl * Math.cos((i * 2 * Math.PI) / ropes.length + da[i]),
        y:
          target.y +
          randl[i] * rl * Math.sin((i * 2 * Math.PI) / ropes.length + da[i])
      });
      ropes[i].show();
    }
    last_target.x = target.x;
    last_target.y = target.y;
  }

  //mouse position
  canvas.addEventListener(
    "mousemove",
    function (e) {
      last_mouse.x = mouse.x;
      last_mouse.y = mouse.y;

      mouse.x = e.pageX - this.offsetLeft;
      mouse.y = e.pageY - this.offsetTop;
    },
    false
  );
  
  canvas.addEventListener("mouseleave", function(e) {
    mouse.x = false;
    mouse.y = false;
  });

  //animation frame
  function loop() {
    window.requestAnimFrame(loop);
    c.clearRect(0, 0, w, h);
    draw();
  }

  //window resize
  window.addEventListener("resize", function () {
    (w = canvas.width = window.innerWidth),
      (h = canvas.height = window.innerHeight);
    loop();
  });

  //animation runner
  loop();
  setInterval(loop, 1000 / 60);
};

尝试像这样实现

 window.init = function(elemid) { let canvas = document.getElementById(elemid), c = canvas.getContext("2d"), w = (canvas.width = window.innerWidth), h = (canvas.height = window.innerHeight); c.fillStyle = "rgba(30,30,30,1)"; c.fillRect(0, 0, w, h); return {c:c,canvas:canvas}; } window.requestAnimFrame = function() { return ( window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { window.setTimeout(callback); } ); }; window.spaceworm = function () { //functions definition //class definition class segm { constructor(x, y, l) { this.b = Math.random()*1.9+0.1; this.x0 = x; this.y0 = y; this.a = Math.random() * 2 * Math.PI; this.x1 = this.x0 + l * Math.cos(this.a); this.y1 = this.y0 + l * Math.sin(this.a); this.l = l; } update(x, y) { this.x0 = x; this.y0 = y; this.a = Math.atan2(this.y1 - this.y0, this.x1 - this.x0); this.x1 = this.x0 + this.l * Math.cos(this.a); this.y1 = this.y0 + this.l * Math.sin(this.a); } } class rope { constructor(tx, ty, l, b, slq, typ) { if(typ == "l"){ this.res = l / 2; }else{ this.res = l / slq; } this.type = typ; this.l = l; this.segm = []; this.segm.push(new segm(tx, ty, this.l / this.res)); for (let i = 1; i < this.res; i++) { this.segm.push( new segm(this.segm[i - 1].x1, this.segm[i - 1].y1, this.l / this.res) ); } this.b = b; } update(t) { this.segm[0].update(tx, ty); for (let i = 1; i < this.res; i++) { this.segm[i].update(this.segm[i - 1].x1, this.segm[i - 1].y1); } } show() { if(this.type == "l"){ c.beginPath(); for (let i = 0; i < this.segm.length; i++) { c.lineTo(this.segm[i].x0, this.segm[i].y0); } c.lineTo( this.segm[this.segm.length - 1].x1, this.segm[this.segm.length - 1].y1 ); c.strokeStyle = "white"; c.lineWidth = this.b; c.stroke(); c.beginPath(); c.arc(this.segm[0].x0, this.segm[0].y0, 1, 0, 2 * Math.PI); c.fillStyle = "white"; c.fill(); c.beginPath(); c.arc( this.segm[this.segm.length - 1].x1, this.segm[this.segm.length - 1].y1, 2, 0, 2 * Math.PI ); c.fillStyle = "white"; c.fill(); }else{ for (let i = 0; i < this.segm.length; i++) { c.beginPath(); c.arc(this.segm[i].x0, this.segm[i].y0, this.segm[i].b, 0, 2*Math.PI); c.fillStyle = "white"; c.fill(); } c.beginPath(); c.arc( this.segm[this.segm.length - 1].x1, this.segm[this.segm.length - 1].y1, 2, 0, 2*Math.PI ); c.fillStyle = "white"; c.fill(); } } } //setting up canvas let c = init("canvas").c, canvas = init("canvas").canvas, w = (canvas.width = window.innerWidth), h = (canvas.height = window.innerHeight), ropes = []; //variables definition let nameOfVariable = "value", mouse = {}, last_mouse = {}, rl = 50, randl = [], target = { x: w/2, y: h/2 }, last_target = {}, t = 0, q = 10, da = [], type = "l"; for (let i = 0; i < 100; i++) { if(Math.random() > 0.25){ type = "l"; }else{ type = "o"; } ropes.push( new rope( w / 2, h / 2, (Math.random() * 1 + 0.5) * 500, Math.random() * 0.4 + 0.1, Math.random()*15+5, type ) ); randl.push(Math.random() * 2 - 1); da.push(0); } //place for objects in animation function draw() { if (mouse.x) { target.errx = mouse.x - target.x; target.erry = mouse.y - target.y; } else { target.errx = w / 2 + (h / 2 - q) * Math.sqrt(2) * Math.cos(t) / (Math.pow(Math.sin(t), 2) + 1) - target.x; target.erry = h / 2 + (h / 2 - q) * Math.sqrt(2) * Math.cos(t) * Math.sin(t) / (Math.pow(Math.sin(t), 2) + 1) - target.y; } target.x += target.errx / 10; target.y += target.erry / 10; t += 0.01; for (let i = 0; i < ropes.length; i++) { if (randl[i] > 0) { da[i] += (1 - randl[i]) / 10; } else { da[i] += (-1 - randl[i]) / 10; } ropes[i].update({ x: target.x + randl[i] * rl * Math.cos((i * 2 * Math.PI) / ropes.length + da[i]), y: target.y + randl[i] * rl * Math.sin((i * 2 * Math.PI) / ropes.length + da[i]) }); ropes[i].show(); } last_target.x = target.x; last_target.y = target.y; } //mouse position canvas.addEventListener( "mousemove", function (e) { last_mouse.x = mouse.x; last_mouse.y = mouse.y; mouse.x = e.pageX - this.offsetLeft; mouse.y = e.pageY - this.offsetTop; }, false ); canvas.addEventListener("mouseleave", function(e) { mouse.x = false; mouse.y = false; }); //animation frame function loop() { window.requestAnimFrame(loop); c.clearRect(0, 0, w, h); draw(); } //window resize window.addEventListener("resize", function () { (w = canvas.width = window.innerWidth), (h = canvas.height = window.innerHeight); loop(); }); //animation runner loop(); setInterval(loop, 1000 / 60); }; window.onload = spaceworm;
 body, html { margin: 0px; padding: 0px; position: fixed; background: rgb(30, 30, 30); cursor: none; }
 <canvas id="canvas"></canvas>





暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM