UNPKG

rc-tween-one

Version:
111 lines (108 loc) 4.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable func-names */ var SvgDrawPlugin = function SvgDrawPlugin(target, vars) { this.target = target; this.vars = vars; this.start = {}; this.tagName = this.target.tagName.toLowerCase(); }; SvgDrawPlugin.prototype = { name: 'SVGDraw', useStyle: 'stroke-dasharray, stroke-dashoffset', setVars: function setVars(vars) { var _vars = { start: 0 }; if (typeof vars === 'number') { _vars.end = vars; return _vars; } var data = vars.split(' '); if (data.length > 1) { _vars.start = data[0].indexOf('%') >= 0 ? parseFloat(data[0]) / 100 * this.length : parseFloat(data[0]); _vars.end = data[1].indexOf('%') >= 0 ? parseFloat(data[1]) / 100 * this.length : parseFloat(data[1]); } else if (parseFloat(vars)) { _vars.end = vars.indexOf('%') >= 0 ? parseFloat(vars) / 100 * this.length : parseFloat(vars); } else { throw new Error('SVGDraw data[' + vars + '] error.'); } return _vars; }, getLineLength: function getLineLength(x1, y1, x2, y2) { var _x2 = parseFloat(x2) - parseFloat(x1); var _y2 = parseFloat(y2) - parseFloat(y1); return Math.sqrt(_x2 * _x2 + _y2 * _y2); }, getPolyLength: function getPolyLength(name) { var _this = this; // .match(/(?:(-|-=|\+=)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi) var pointsArray = []; (this.target.getAttribute('points') || '').split(/[\s+|,]/).forEach(function (item, i) { var arr = pointsArray[Math.floor(i / 2)] || []; arr.push(parseFloat(item)); if (!(i % 2)) { pointsArray.push(arr); } }); if (name === 'polygon') { pointsArray.push(pointsArray[0]); } var length = 0; pointsArray.forEach(function (item, i) { if (i < pointsArray.length - 1) { var nextPoint = pointsArray[i + 1]; length += _this.getLineLength(item[0], item[1], nextPoint[0], nextPoint[1]); } }); return length; }, getEllipseLength: function getEllipseLength() { var rx = parseFloat(this.target.getAttribute('rx')); var ry = parseFloat(this.target.getAttribute('ry')); if (!rx || !ry) { throw new Error('ellipse rx or ry error.'); } return Math.PI * (3 * (rx + ry) - Math.sqrt((3 * rx + ry) * (3 * ry + rx))); }, getAnimStart: function getAnimStart(computedStyle) { var _this2 = this; var getAttribute = function getAttribute(str) { return _this2.target.getAttribute(str); }; switch (this.tagName) { case 'circle': this.length = Math.PI * 2 * getAttribute('r'); break; case 'line': this.length = this.getLineLength(getAttribute('x1'), getAttribute('y1'), getAttribute('x2'), getAttribute('y2')); break; case 'polyline': case 'polygon': this.length = this.getPolyLength(this.tagName); break; case 'ellipse': this.length = this.getEllipseLength(); break; case 'rect': this.length = getAttribute('width') * 2 + getAttribute('height') * 2; break; case 'path': this.length = this.target.getTotalLength(); break; default: throw new Error('The label is not a label in the SVG.'); } this.length = parseFloat(this.length.toFixed(3)); this.start.strokeDasharray = computedStyle.strokeDasharray === 'none' || !computedStyle.strokeDasharray ? '100% 100%' : computedStyle.strokeDasharray; this.start.strokeDashoffset = parseFloat(computedStyle.strokeDashoffset); this.start.strokeDasharray = this.setVars(this.start.strokeDasharray); this.vars = this.setVars(this.vars); }, setRatio: function setRatio(r, t) { t.style.strokeDasharray = (this.vars.end - this.vars.start - this.start.strokeDasharray.start) * r + this.start.strokeDasharray.start + 'px, ' + this.length + 'px'; t.style.strokeDashoffset = -((this.vars.start + this.start.strokeDashoffset) * r - this.start.strokeDashoffset); } }; exports['default'] = SvgDrawPlugin; module.exports = exports['default'];