You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
7.9 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.NavCanvas = void 0;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var NavCanvas =
/*#__PURE__*/
function () {
function NavCanvas(el, tabSelector) {
var selectedTabIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
_classCallCheck(this, NavCanvas);
this.j = 0.85;
this.k = 10;
this.l = 4;
this.pattern = null;
this.tabWidthList = [];
this.tabHeight = 0;
this.opt = {
currentIndex: 0,
nextIndex: 1,
speed: 1,
timer: 0,
width: 200,
height: 100,
animating: false,
curDisX: 0,
distance: 0
};
this.canvas = document.getElementById(el);
this.tabs = document.querySelectorAll(tabSelector);
var opt = this.opt;
this.calcTabs();
this.initCanvas(this.canvas, opt.width, opt.height);
this.createPattern(this.canvas);
this.startDraw(0);
this.toggle(selectedTabIndex);
}
_createClass(NavCanvas, [{
key: "initCanvas",
value: function initCanvas(canvas, width, height) {
var ctx = canvas.getContext('2d');
var _window = window,
devicePixelRatio = _window.devicePixelRatio;
canvas.width = width * devicePixelRatio;
canvas.height = height * devicePixelRatio;
canvas.style.width = "".concat(width, "px");
canvas.style.height = "".concat(height, "px");
ctx.scale(devicePixelRatio, devicePixelRatio);
}
}, {
key: "calcTabs",
value: function calcTabs() {
var opt = this.opt,
tabs = this.tabs;
var ws = [];
var totalWidth = 0;
tabs.forEach(function (node) {
ws.push(totalWidth);
totalWidth += node.offsetWidth;
});
ws[0] = -20;
ws.push(totalWidth);
this.tabWidthList = ws;
this.tabHeight = tabs[0].offsetHeight + 0;
opt.height = this.tabHeight + 20;
opt.width = window.innerWidth;
}
}, {
key: "createPattern",
value: function createPattern(canvas) {
var w = 140;
var h = 63;
var r = 1;
var imgCanvas = document.createElement('canvas');
imgCanvas.width = w;
imgCanvas.height = h;
imgCanvas.style.width = "".concat(w / r, "px");
imgCanvas.style.height = "".concat(h / r, "px");
var ctx = imgCanvas.getContext('2d');
ctx.scale(r, r);
ctx.lineWidth = 0.4;
for (var g = 3, _h = 0.8, j = 1; j < 30; j++) {
ctx.strokeStyle = "RGBA(22, 120, 160, ".concat(_h, ")");
ctx.beginPath();
ctx.moveTo(0, j * g);
ctx.lineTo(w, j * g);
ctx.stroke();
ctx.closePath();
if (j > 10) {
_h -= 0.1;
}
}
this.pattern = canvas.getContext('2d').createPattern(imgCanvas, 'repeat-x');
}
}, {
key: "calcAvgSpeed",
value: function calcAvgSpeed(a) {
var l = this.l,
j = this.j,
k = this.k;
var b = (l * j * a + k * (1 - j) * a) / (k * l * 20);
return Math.max(Math.abs(b), 2.5) * Math.sign(b);
}
}, {
key: "getCurSpeed",
value: function getCurSpeed(a, b) {
var l = this.l,
j = this.j,
k = this.k,
opt = this.opt;
return Math.abs(a) > Math.abs(j * b) ? l * opt.speed : k * opt.speed;
}
}, {
key: "calCurve",
value: function calCurve(ctx, a, b, c, d, e) {
ctx.bezierCurveTo(a + e, b, c - e, d, c, d);
}
}, {
key: "drawHightlight",
value: function drawHightlight(index) {
var opt = this.opt;
var ctx = this.canvas.getContext('2d');
var d = 0.3;
ctx.clearRect(0, 0, 2 * opt.width, 2 * opt.height);
ctx.shadowColor = 'rgba(36, 131, 255, 1)';
ctx.shadowBlur = 5;
ctx.strokeStyle = '#004CB3';
ctx.lineWidth = 0.8;
ctx.fillStyle = 'none';
this.draw(ctx, false);
var gradient = ctx.createLinearGradient(0, 0, opt.width, opt.height);
var f = index - d;
gradient.addColorStop(Math.min(1, Math.max(0, 0 + f)), 'rgba(0,0,0,0)');
gradient.addColorStop(Math.min(1, Math.max(0, 0 + f + 0.1)), '#8ed6ff');
gradient.addColorStop(Math.min(1, 0 + f + d), '#8ed6ff');
gradient.addColorStop(Math.min(1, 0 + f + d + 0.1), 'rgba(0,0,0,0)');
gradient.addColorStop(1, 'rgba(0,0,0,0)');
ctx.lineWidth = 1.5;
ctx.strokeStyle = gradient;
ctx.fillStyle = this.pattern;
this.draw(ctx, true);
}
}, {
key: "startDraw",
value: function startDraw(index) {
var _this = this;
this.drawHightlight(index);
this.opt.timer = requestAnimationFrame(function () {
_this.startDraw((index + 0.005) % 1.6);
});
}
}, {
key: "draw",
value: function draw(ctx, trueorfalse) {
var opt = this.opt,
tabWidthList = this.tabWidthList,
tabHeight = this.tabHeight;
var navindex = opt.currentIndex;
var tableHeight = tabHeight;
var f = 0;
var g = 40;
var i = 20;
var j = 0.5;
var k = 2.5;
var l = 0;
ctx.beginPath();
ctx.moveTo(-50, opt.height + 10);
ctx.lineTo(-50, tableHeight + j);
if (opt.animating) {
var m = this.getCurSpeed(opt.curDisX, opt.distance);
l = Math.min(Math.abs(opt.distance), Math.abs(opt.curDisX + m)) * Math.sign(m);
}
ctx.lineTo(f + tabWidthList[navindex] + l - g / 2, tableHeight + j);
this.calCurve(ctx, f + tabWidthList[navindex] + l - g / 2, tableHeight + j, f + tabWidthList[navindex] + l + g / 2, k + j, i);
if (opt.animating) {
var o = tabWidthList[opt.nextIndex + 1] - tabWidthList[opt.nextIndex];
ctx.lineTo(f + tabWidthList[navindex] + o + l - g / 2, k + j);
this.calCurve(ctx, f + tabWidthList[navindex] + o + l - g / 2, k + j, f + tabWidthList[navindex] + o + l + g / 2, tableHeight + j, i);
} else {
ctx.lineTo(f + tabWidthList[navindex + 1] + l - g / 2, k + j);
this.calCurve(ctx, f + tabWidthList[navindex + 1] + l - g / 2, k + j, f + tabWidthList[navindex + 1] + l + g / 2, tableHeight + j, i);
}
ctx.lineTo(opt.width + 10, tableHeight + j);
ctx.lineTo(opt.width + 10, opt.height + 10);
ctx.closePath();
ctx.stroke();
if (trueorfalse) {
ctx.fill();
}
if (trueorfalse && opt.animating) {
opt.curDisX = l;
if (Math.abs(l) >= Math.abs(opt.distance)) {
opt.animating = false;
opt.currentIndex = opt.nextIndex;
}
}
}
}, {
key: "toggle",
value: function toggle(navindex) {
var opt = this.opt,
tabWidthList = this.tabWidthList;
if (navindex !== opt.currentIndex && tabWidthList && tabWidthList.length && (!opt.animating || navindex !== opt.nextIndex)) {
opt.animating = true;
opt.distance = tabWidthList[navindex] - tabWidthList[opt.currentIndex];
opt.speed = this.calcAvgSpeed(opt.distance);
opt.curDisX = 0;
opt.nextIndex = navindex;
}
}
}, {
key: "resize",
value: function resize() {
var opt = this.opt;
if (opt.timer) {
cancelAnimationFrame(opt.timer);
}
this.calcTabs();
this.initCanvas(this.canvas, opt.width, opt.height);
this.startDraw(0);
}
}]);
return NavCanvas;
}();
exports.NavCanvas = NavCanvas;