rc-tween-one
Version:
tween-one anim component for react
310 lines (294 loc) • 12.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _styleUtils = require('style-utils');
var _styleUtils2 = _interopRequireDefault(_styleUtils);
var _util = require('../util.js');
var _plugins = require('../plugins');
var _plugins2 = _interopRequireDefault(_plugins);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var StylePlugin = function StylePlugin(target, vars, type) {
this.target = target;
this.vars = vars;
this.type = type;
this.propsData = {};
this.setDefaultData();
}; /* eslint-disable func-names, no-console */
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] = (0, _styleUtils.parseColor)(vars);
data.dataType[key] = 'color';
} else if (key.match(/shadow/i)) {
data.data[key] = (0, _styleUtils.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 _plugins2['default']) {
_this.propsData.data[_key] = new _plugins2['default'][_key](_this.target, _this.vars[_key]);
return;
}
var key = (0, _styleUtils.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 (0, _util.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 = (0, _styleUtils.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 _plugins2['default']) {
if (key === 'bezier') {
_this2.transform = (0, _styleUtils.checkStyleName)('transform');
startData = computedStyle[isSvg ? 'transformSVG' : _this2.transform];
style.transform = tweenStyle.transform ? (0, _extends3['default'])({}, tweenStyle.transform) : style.transform || (0, _styleUtils.getTransform)(startData);
}
_this2.propsData.data[key].getAnimStart(computedStyle, isSvg);
} else if (cssName === 'transform') {
_this2.transform = (0, _styleUtils.checkStyleName)('transform');
startData = computedStyle[isSvg ? 'transformSVG' : _this2.transform];
endUnit = _this2.propsData.dataUnit[key];
transform = tweenStyle.transform ? (0, _extends3['default'])({}, tweenStyle.transform) : style.transform || (0, _styleUtils.getTransform)(startData);
if (endUnit && endUnit.match(/%|vw|vh|em|rem/i)) {
transform[key] = (0, _util.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 = (0, _styleUtils.checkStyleName)('filter') || 'filter';
startData = computedStyle[_this2.filterName];
_this2.filterObject = (0, _extends3['default'])({}, _this2.filterObject, (0, _styleUtils.splitFilterToObject)(startData));
startData = _this2.filterObject[key] || 0;
}
startUnit = startData.toString().replace(/[^a-z|%]/g, '');
endUnit = _this2.propsData.dataUnit[key];
if (endUnit !== startUnit) {
startData = (0, _util.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] = (0, _styleUtils.parseColor)(startData);
} else if (key.match(/shadow/i)) {
startData = (0, _styleUtils.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 = (0, _util.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 (0, _styleUtils.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 = (0, _styleUtils.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 || (0, _extends3['default'])({}, this.start.transform);
}
var style = this.target.style;
Object.keys(this.propsData.data).forEach(function (key) {
var _isTransform = (0, _styleUtils.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 _plugins2['default']) {
_this3.propsData.data[key].setRatio(ratio, tween, computedStyle);
if (key === 'bezier') {
style[_this3.transform] = (0, _util.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] = (0, _util.getTransformValue)(tween.style.transform);
if (computedStyle) {
computedStyle.transformSVG = (0, _styleUtils.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 = (0, _styleUtils.stylesToCss)(key, 0);
styleUnit = typeof styleUnit === 'number' ? '' : styleUnit.replace(/[^a-z|%]/g, '');
unit = unit || (_styleUtils2['default'].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 (_styleUtils2['default'].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];
});
};
exports['default'] = StylePlugin;
module.exports = exports['default'];