UNPKG

rc-tween-one

Version:
292 lines (286 loc) 11.8 kB
import _extends from 'babel-runtime/helpers/extends'; /* eslint-disable func-names, no-console */ import cssList, { checkStyleName, getGsapType, parseShadow, getColor, parseColor, isTransform, isConvert, splitFilterToObject, getTransform, stylesToCss, createMatrix } from 'style-utils'; import { startConvertToEndUnit, getTransformValue } from '../util.js'; import _plugin from '../plugins'; var StylePlugin = function StylePlugin(target, vars, type) { this.target = target; this.vars = vars; this.type = type; this.propsData = {}; this.setDefaultData(); }; StylePlugin.prototype = { name: 'style' }; var p = StylePlugin.prototype; p.getTweenData = function (key, vars) { var data = { data: {}, dataType: {}, dataUnit: {}, dataCount: {}, dataSplitStr: {} }; if (key.match(/colo|fill|storker/i)) { data.data[key] = parseColor(vars); data.dataType[key] = 'color'; } else if (key.match(/shadow/i)) { data.data[key] = parseShadow(vars); data.dataType[key] = 'shadow'; } else if (typeof vars === 'string' && vars.split(/[\s|,]/).length > 1) { data.data[key] = vars.split(/[\s|,]/); data.dataSplitStr[key] = vars.replace(/[^\s|,]/g, ''); data.dataType[key] = 'string'; } else { data.data[key] = vars; data.dataType[key] = 'other'; } if (Array.isArray(data.data[key])) { data.dataUnit[key] = data.data[key].map(function (_item) { return _item.toString().replace(/[^a-z|%]/g, ''); }); data.dataCount[key] = data.data[key].map(function (_item) { return _item.toString().replace(/[^+|=|-]/g, ''); }); data.data[key] = data.data[key].map(function (_item) { return !parseFloat(_item) && parseFloat(_item) !== 0 ? _item : parseFloat(_item); }); } else { data.dataUnit[key] = data.data[key].toString().replace(/[^a-z|%]/g, ''); data.dataCount[key] = data.data[key].toString().replace(/[^+|=|-]/g, ''); var d = parseFloat(data.data[key].toString().replace(/[a-z|%|=]/g, '')); data.data[key] = !d && d !== 0 ? data.data[key] : d; } return data; }; p.setDefaultData = function () { var _this = this; this.propsData.data = {}; this.propsData.dataType = {}; this.propsData.dataUnit = {}; this.propsData.dataCount = {}; this.propsData.dataSplitStr = {}; Object.keys(this.vars).forEach(function (_key) { if (_key in _plugin) { _this.propsData.data[_key] = new _plugin[_key](_this.target, _this.vars[_key]); return; } var key = getGsapType(_key); var _data = _this.getTweenData(key, _this.vars[_key]); _this.propsData.data[key] = _data.data[key]; _this.propsData.dataType[key] = _data.dataType[key]; _this.propsData.dataUnit[key] = _data.dataUnit[key]; _this.propsData.dataCount[key] = _data.dataCount[key]; if (_data.dataSplitStr[key]) { _this.propsData.dataSplitStr[key] = _data.dataSplitStr[key]; } }); }; p.convertToMarksArray = function (computedStyle, unit, key, data, i) { var startUnit = data.toString().replace(/[^a-z|%]/g, ''); var endUnit = unit[i]; if (startUnit === endUnit) { return parseFloat(data); } else if (!parseFloat(data) && parseFloat(data) !== 0) { return data; } return startConvertToEndUnit(this.target, computedStyle, key, data, startUnit, endUnit, null, key === 'transformOrigin' && !i); }; p.getAnimStart = function (computedStyle, tween, isSvg) { var _this2 = this; var style = {}; var tweenStyle = tween.style || {}; Object.keys(this.propsData.data).forEach(function (key) { var cssName = isConvert(key); var startData = tweenStyle[cssName] || computedStyle[cssName]; var fixed = computedStyle.position === 'fixed'; if (!startData || startData === 'none' || startData === 'auto') { startData = ''; } var transform = void 0; var endUnit = void 0; var startUnit = void 0; if (key in _plugin) { if (key === 'bezier') { _this2.transform = checkStyleName('transform'); startData = computedStyle[isSvg ? 'transformSVG' : _this2.transform]; style.transform = tweenStyle.transform ? _extends({}, tweenStyle.transform) : style.transform || getTransform(startData); } _this2.propsData.data[key].getAnimStart(computedStyle, isSvg); } else if (cssName === 'transform') { _this2.transform = checkStyleName('transform'); startData = computedStyle[isSvg ? 'transformSVG' : _this2.transform]; endUnit = _this2.propsData.dataUnit[key]; transform = tweenStyle.transform ? _extends({}, tweenStyle.transform) : style.transform || getTransform(startData); if (endUnit && endUnit.match(/%|vw|vh|em|rem/i)) { transform[key] = startConvertToEndUnit(_this2.target, computedStyle, key, transform[key], null, endUnit); } style.transform = transform; } else if (cssName === 'filter') { if (tweenStyle[cssName]) { startData = tweenStyle[cssName]; } else { _this2.filterName = checkStyleName('filter') || 'filter'; startData = computedStyle[_this2.filterName]; _this2.filterObject = _extends({}, _this2.filterObject, splitFilterToObject(startData)); startData = _this2.filterObject[key] || 0; } startUnit = startData.toString().replace(/[^a-z|%]/g, ''); endUnit = _this2.propsData.dataUnit[key]; if (endUnit !== startUnit) { startData = startConvertToEndUnit(_this2.target, computedStyle, cssName, parseFloat(startData), startUnit, endUnit, fixed); } style[key] = parseFloat(startData); } else if (key.match(/color|fill/i) || key === 'stroke') { startData = !startData && key === 'stroke' ? 'rgba(255, 255, 255, 0)' : startData; style[cssName] = parseColor(startData); } else if (key.match(/shadow/i)) { startData = parseShadow(startData); endUnit = _this2.propsData.dataUnit[key]; startData = startData.map(_this2.convertToMarksArray.bind(_this2, computedStyle, endUnit, key)); style[cssName] = startData; } else if (Array.isArray(_this2.propsData.data[key])) { startData = startData.split(/[\s|,]/); endUnit = _this2.propsData.dataUnit[key]; startData = startData.map(_this2.convertToMarksArray.bind(_this2, computedStyle, endUnit, key)); style[cssName] = startData; } else { // 计算单位 endUnit = _this2.propsData.dataUnit[cssName]; startUnit = startData.toString().replace(/[^a-z|%]/g, ''); if (endUnit !== startUnit) { startData = startConvertToEndUnit(_this2.target, computedStyle, cssName, parseFloat(startData), startUnit, endUnit, fixed); } style[cssName] = parseFloat(startData || 0); } }); this.start = style; return style; }; p.setArrayRatio = function (ratio, start, vars, unit, type) { if (type === 'color' && start.length === 4 && vars.length === 3) { vars[3] = 1; } var startInset = start.indexOf('inset') >= 0; var endInset = vars.indexOf('inset') >= 0; if (startInset && !endInset || endInset && !startInset) { throw console.error('Error: "box-shadow" inset have to exist'); } var length = endInset ? 9 : 8; if (start.length === length && vars.length === length - 1) { vars.splice(3, 0, 0); unit.splice(3, 0, ''); } else if (vars.length === length && start.length === length - 1) { start.splice(3, 0, 0); } var _vars = vars.map(function (endData, i) { var startIsAlpha = type === 'color' && i === 3 && !start[i] ? 1 : 0; var startData = typeof start[i] === 'number' ? start[i] : startIsAlpha; if (typeof endData === 'string') { return endData; } return (endData - startData) * ratio + startData + (unit[i] || 0); }); if (type === 'color') { return getColor(_vars); } else if (type === 'shadow') { var l = _vars.length === length ? 4 : 3; var s = _vars.slice(0, l).map(function (item) { if (typeof item === 'number') { return item + 'px'; } return item; }); var c = _vars.slice(l, endInset ? _vars.length - 1 : _vars.length); var color = getColor(c); return (s.join(' ') + ' ' + color + ' ' + (endInset ? 'inset' : '')).trim(); } return _vars; }; p.setRatio = function (ratio, tween, computedStyle) { var _this3 = this; tween.style = tween.style || {}; if (this.start.transform) { tween.style.transform = tween.style.transform || _extends({}, this.start.transform); } var style = this.target.style; Object.keys(this.propsData.data).forEach(function (key) { var _isTransform = isTransform(key) === 'transform'; var startVars = _isTransform ? _this3.start.transform[key] : _this3.start[key]; var endVars = _this3.propsData.data[key]; var unit = _this3.propsData.dataUnit[key]; var count = _this3.propsData.dataCount[key]; if (key in _plugin) { _this3.propsData.data[key].setRatio(ratio, tween, computedStyle); if (key === 'bezier') { style[_this3.transform] = getTransformValue(tween.style.transform); } else { Object.keys(tween.style).forEach(function (css) { style[css] = tween.style[css]; }); } return; } else if (_isTransform) { if (unit && unit.match(/%|vw|vh|em|rem/i)) { startVars = _this3.start.transform[key]; if (count.charAt(1) === '=') { tween.style.transform[key] = startVars + endVars * ratio + unit; } else { tween.style.transform[key] = (endVars - startVars) * ratio + startVars + unit; } } else if (key === 'scale') { var xStart = _this3.start.transform.scaleX; var yStart = _this3.start.transform.scaleY; if (count.charAt(1) === '=') { tween.style.transform.scaleX = xStart + endVars * ratio; tween.style.transform.scaleY = yStart + endVars * ratio; } else { tween.style.transform.scaleX = (endVars - xStart) * ratio + xStart; tween.style.transform.scaleY = (endVars - yStart) * ratio + yStart; } } else if (count.charAt(1) === '=') { tween.style.transform[key] = startVars + endVars * ratio; } else { tween.style.transform[key] = (endVars - startVars) * ratio + startVars; } style[_this3.transform] = getTransformValue(tween.style.transform); if (computedStyle) { computedStyle.transformSVG = createMatrix(style[_this3.transform]).toString(); } return; } else if (Array.isArray(endVars)) { var _type = _this3.propsData.dataType[key]; tween.style[key] = _this3.setArrayRatio(ratio, startVars, endVars, unit, _type); if (_type === 'string') { tween.style[key] = tween.style[key].join(_this3.propsData.dataSplitStr[key]); } } else { var styleUnit = stylesToCss(key, 0); styleUnit = typeof styleUnit === 'number' ? '' : styleUnit.replace(/[^a-z|%]/g, ''); unit = unit || (cssList.filter.indexOf(key) >= 0 ? '' : styleUnit); if (typeof endVars === 'string') { tween.style[key] = endVars; } else if (count.charAt(1) === '=') { tween.style[key] = startVars + endVars * ratio + unit; } else { var value = (endVars - startVars) * ratio + startVars; tween.style[key] = unit ? '' + value + unit : value; } } if (cssList.filter.indexOf(key) >= 0) { if (!_this3.filterObject) { return; } _this3.filterObject[key] = tween.style[key]; var filterStyle = ''; Object.keys(_this3.filterObject).forEach(function (filterKey) { filterStyle += ' ' + filterKey + '(' + _this3.filterObject[filterKey] + ')'; }); style[_this3.filterName] = filterStyle.trim(); return; } style[key] = tween.style[key]; }); }; export default StylePlugin;