open/lib/CanvasNest.js

178 lines
7.8 KiB
JavaScript
Raw Permalink Normal View History

2025-01-18 17:03:48 +08:00
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
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; }; }(); /**
* Created by hustcc on 18/6/23.
* Contract: i@hust.cc
*/
var _sizeSensor = require('size-sensor');
var _utils = require('./utils');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CanvasNest = function () {
function CanvasNest(el, config) {
var _this = this;
_classCallCheck(this, CanvasNest);
this.randomPoints = function () {
return (0, _utils.range)(_this.c.count).map(function () {
return {
x: Math.random() * _this.canvas.width,
y: Math.random() * _this.canvas.height,
xa: 2 * Math.random() - 1, // 随机运动返现
ya: 2 * Math.random() - 1,
max: 6000 // 沾附距离
};
});
};
this.el = el;
this.c = _extends({
zIndex: -1, // z-index
opacity: 0.5, // opacity
color: '0,0,0', // color of lines
pointColor: '0,0,0', // color of points
count: 99 }, config);
this.canvas = this.newCanvas();
this.context = this.canvas.getContext('2d');
this.points = this.randomPoints();
this.current = {
x: null, // 当前鼠标x
y: null, // 当前鼠标y
max: 20000 // 圈半径的平方
};
this.all = this.points.concat([this.current]);
this.bindEvent();
this.requestFrame(this.drawCanvas);
}
_createClass(CanvasNest, [{
key: 'bindEvent',
value: function bindEvent() {
var _this2 = this;
(0, _sizeSensor.bind)(this.el, function () {
_this2.canvas.width = _this2.el.clientWidth;
_this2.canvas.height = _this2.el.clientHeight;
});
this.onmousemove = window.onmousemove;
window.onmousemove = function (e) {
_this2.current.x = e.clientX - _this2.el.offsetLeft + document.scrollingElement.scrollLeft; // 当存在横向滚动条时x坐标再往右移动滚动条拉动的距离
_this2.current.y = e.clientY - _this2.el.offsetTop + document.scrollingElement.scrollTop; // 当存在纵向滚动条时y坐标再往下移动滚动条拉动的距离
_this2.onmousemove && _this2.onmousemove(e);
};
this.onmouseout = window.onmouseout;
window.onmouseout = function () {
_this2.current.x = null;
_this2.current.y = null;
_this2.onmouseout && _this2.onmouseout();
};
}
}, {
key: 'newCanvas',
value: function newCanvas() {
if (getComputedStyle(this.el).position === 'static') {
this.el.style.position = 'relative';
}
var canvas = document.createElement('canvas'); // 画布
canvas.style.cssText = (0, _utils.canvasStyle)(this.c);
canvas.width = this.el.clientWidth;
canvas.height = this.el.clientHeight;
this.el.appendChild(canvas);
return canvas;
}
}, {
key: 'requestFrame',
value: function requestFrame(func) {
var _this3 = this;
this.tid = (0, _utils.requestAnimationFrame)(function () {
return func.call(_this3);
});
}
}, {
key: 'drawCanvas',
value: function drawCanvas() {
var _this4 = this;
var context = this.context;
var width = this.canvas.width;
var height = this.canvas.height;
var current = this.current;
var points = this.points;
var all = this.all;
context.clearRect(0, 0, width, height);
// 随机的线条和当前位置联合数组
var e = void 0,
i = void 0,
d = void 0,
x_dist = void 0,
y_dist = void 0,
dist = void 0; // 临时节点
// 遍历处理每一个点
points.forEach(function (r, idx) {
r.x += r.xa;
r.y += r.ya; // 移动
r.xa *= r.x > width || r.x < 0 ? -1 : 1;
r.ya *= r.y > height || r.y < 0 ? -1 : 1; // 碰到边界,反向反弹
context.fillStyle = 'rgba(' + _this4.c.pointColor + ')';
context.fillRect(r.x - 0.5, r.y - 0.5, 1, 1); // 绘制一个宽高为1的点
// 从下一个点开始
for (i = idx + 1; i < all.length; i++) {
e = all[i];
// 当前点存在
if (null !== e.x && null !== e.y) {
x_dist = r.x - e.x; // x轴距离 l
y_dist = r.y - e.y; // y轴距离 n
dist = x_dist * x_dist + y_dist * y_dist; // 总距离, m
dist < e.max && (e === current && dist >= e.max / 2 && (r.x -= 0.03 * x_dist, r.y -= 0.03 * y_dist), // 靠近的时候加速
d = (e.max - dist) / e.max, context.beginPath(), context.lineWidth = d / 2, context.strokeStyle = 'rgba(' + _this4.c.color + ',' + (d + 0.2) + ')', context.moveTo(r.x, r.y), context.lineTo(e.x, e.y), context.stroke());
}
}
});
this.requestFrame(this.drawCanvas);
}
}, {
key: 'destroy',
value: function destroy() {
// 清除事件
(0, _sizeSensor.clear)(this.el);
// mouse 事件清除
window.onmousemove = this.onmousemove; // 回滚方法
window.onmouseout = this.onmouseout;
// 删除轮询
(0, _utils.cancelAnimationFrame)(this.tid);
// 删除 dom
this.canvas.parentNode.removeChild(this.canvas);
}
}]);
return CanvasNest;
}();
CanvasNest.version = '2.0.4';
exports.default = CanvasNest;
module.exports = exports['default'];