open/lib/CanvasNest.js

178 lines
7.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'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'];