html--龟派气功

html 复制代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style>
  body {
  background: #000;
  overflow: hidden;
}

canvas {
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
}

canvas.interactive {
  cursor: none;
}
  </style>
 </HEAD>

 <BODY>
   <canvas id="canvas"></canvas>
   <script>
   var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Canvas = function () {
  function Canvas(element, ctx, w, h) {
    _classCallCheck(this, Canvas);

    this.element = element;
    this.ctx = ctx;
    this.width = w;
    this.height = h;

    this.interactive = false;
    this.playing = true;

    this.point = {
      value: 150,
      speed: 0.25,
      limit: 70,
      floor: 10,
      up: true,
      animating: false
    };

    this.multiplier = {
      value: 1,
      speed: 0.005,
      limit: 20,
      floor: 1,
      up: true,
      animating: true
    };

    this.center = {
      x: w / 2,
      y: h / 2,
      targetX: w / 2,
      targetY: h / 2,
      easing: 0.02
    };

    this.radius = {
      val: h / 2.2,
      targetVal: h / 2.2,
      easing: 0.02
    };

    document.body.addEventListener('click', this.click.bind(this));
    document.body.addEventListener('mousemove', this.move.bind(this));
    document.body.addEventListener('keyup', this.keyup.bind(this));

    this.hue = 160;
  }

  _createClass(Canvas, [{
    key: 'click',
    value: function click(e) {
      this.interactive = !this.interactive;

      if (!this.interactive) {
        this.center.targetX = this.width / 2;
        this.center.targetY = this.height / 2;
        this.radius.targetVal = this.height / 2.2;

        this.element.classList.remove('interactive');
      } else {
        this.element.classList.add('interactive');
      }
    }
  }, {
    key: 'move',
    value: function move(e) {
      if (!this.interactive) {
        return;
      }

      var h3 = this.height / 3;

      this.center.targetX = e.pageX;
      this.center.targetY = Math.max(e.pageY, h3);

      this.radius.targetVal = h3 + e.pageY * 0.8;
    }
  }, {
    key: 'keyup',
    value: function keyup(e) {
      if (e.which != 32) {
        return;
      }

      this.playing = !this.playing;

      if (this.playing && this.drawLoop) {
        this.drawLoop();
      }
    }
  }, {
    key: 'update',
    value: function update() {
      this.clear();

      this.animate(this.point);
      this.animate(this.multiplier);
      this.ease(this.center);
      this.ease(this.radius);

      this.hue += 0.3;

      var h = this.hue % 360;

      this.ctx.fillStyle = 'hsl(' + h + ',70%,20%)';
      this.ctx.strokeStyle = 'hsla(' + h + ',80%,60%,0.2)';
      this.ctx.globalCompositeOperation = 'lighter';
    }
  }, {
    key: 'clear',
    value: function clear() {
      this.ctx.globalCompositeOperation = 'source-over';
      this.ctx.fillStyle = 'rgba(0,0,0,0.1)';
      this.ctx.rect(0, 0, this.width, this.height);
      this.ctx.fill();
    }
  }, {
    key: 'draw',
    value: function draw() {
      var radius = this.radius.val;

      var w2 = this.center.x,
          h2 = this.center.y;

      this.ctx.beginPath();
      this.ctx.shadowBlur = 0;
      this.ctx.shadowColor = 'black';

      var points = this.point.value;
      var multiplier = this.multiplier.value;

      for (var p = 0; p < points; p++) {
        var t = p / points * Math.PI * 2;
        var t2 = p * multiplier / points * Math.PI * 2;
        var x = radius * Math.cos(t) + w2;
        var y = radius * Math.sin(t) + h2;
        var x2 = radius * Math.cos(t2) + w2;
        var y2 = radius * Math.sin(t2) + h2;

        this.ctx.moveTo(x, y);
        this.ctx.lineTo(x2, y2);
      }

      this.ctx.arc(w2, h2, radius, 0, 2 * Math.PI);

      this.ctx.stroke();
      this.ctx.closePath();
    }
  }, {
    key: 'animate',
    value: function animate(object) {
      if (!object.animating) {
        return;
      }

      if (object.up) {
        object.value += object.speed;
      } else {
        object.value -= object.speed;
      }

      if (object.value > object.limit) {
        object.up = false;
      } else if (object.value < object.floor) {
        object.up = true;
      }
    }
  }, {
    key: 'ease',
    value: function ease(object) {
      if (object.val) {
        var dv = object.targetVal - object.val;
        object.val += dv * object.easing;

        return;
      }

      var dx = object.targetX - object.x;
      var dy = object.targetY - object.y;
      object.x += dx * object.easing;
      object.y += dy * object.easing;
    }
  }, {
    key: 'random',
    value: function random(from, to) {
      return from + Math.rand() * (to - from);
    }
  }, {
    key: 'resize',
    value: function resize(w, h) {
      this.width = w;
      this.height = h;
      this.center.targetX = w / 2;
      this.center.targetY = h / 2;

      this.radius.targetVal = h / 2.2;
    }
  }]);

  return Canvas;
}();

(function (_) {
  var canvasElement = document.getElementById('canvas'),
      ctx = canvasElement.getContext('2d');

  var w = canvasElement.width = window.innerWidth,
      h = canvasElement.height = window.innerHeight,
      density = 1;

  var canvas = new Canvas(canvasElement, ctx, w, h);

  function setup() {
    window.addEventListener('resize', resize);

    density = window.devicePixelRatio != undefined ? window.devicePixelRatio : 1.0;

    canvasElement.width = w * density;
    canvasElement.height = h * density;

    canvas.width = w;
    canvas.height = h;
    canvas.drawLoop = draw;

    ctx.scale(density, density);

    draw();
  }

  function draw() {
    canvas.update();
    canvas.draw();

    if (canvas.playing) {
      window.requestAnimationFrame(draw);
    }
  }

  function resize() {
    w = canvasElement.width = window.innerWidth;
    h = canvasElement.height = window.innerHeight;

    canvasElement.width = w * density;
    canvasElement.height = h * density;

    canvas.resize(w, h);

    ctx.scale(density, density);
  }

  setup();
})();
   </script>
 </BODY>
</HTML>
相关推荐
tERS ERTS2 分钟前
头歌答案--爬虫实战
java·前端·爬虫
当时只道寻常9 分钟前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen10 分钟前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘10 分钟前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei12 分钟前
Web Streams 简介
前端·javascript
悟空瞎说13 分钟前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida26213 分钟前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
xiaominlaopodaren14 分钟前
Three.js 渲染原理-透明渲染为什么这么难
前端
米丘16 分钟前
vue3.x 内置指令有哪些?
前端·vue.js