UNPKG

rc-banner-anim

Version:
418 lines (362 loc) 15 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _reactLifecyclesCompat = require('react-lifecycles-compat'); var _rcTweenOne = require('rc-tween-one'); var _rcTweenOne2 = _interopRequireDefault(_rcTweenOne); var _tweenFunctions = require('tween-functions'); var _tweenFunctions2 = _interopRequireDefault(_tweenFunctions); var _styleUtils = require('style-utils'); var _BgElement = require('./BgElement'); var _BgElement2 = _interopRequireDefault(_BgElement); var _utils = require('./utils'); var _anim = require('./anim'); var _anim2 = _interopRequireDefault(_anim); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function noop() {} var Element = function (_Component) { (0, _inherits3['default'])(Element, _Component); (0, _createClass3['default'])(Element, null, [{ key: 'getDerivedStateFromProps', value: function getDerivedStateFromProps(props, _ref) { var prevProps = _ref.prevProps, $self = _ref.$self, show = _ref.show, mouseMoveType = _ref.mouseMoveType; var nextState = { prevProps: props }; if (prevProps && props !== prevProps) { if ($self.tickerId !== -1) { _rcTweenOne.ticker.clear($self.tickerId); $self.tickerId = -1; } var followParallax = props.followParallax; if ($self.followParallax && !followParallax) { $self.reFollowParallax(); } else { $self.followParallax = followParallax; } if (show || props.show || mouseMoveType) { nextState.mouseMoveType = props.mouseMoveType; } } return nextState; } }]); function Element(props) { (0, _classCallCheck3['default'])(this, Element); var _this = (0, _possibleConstructorReturn3['default'])(this, (Element.__proto__ || Object.getPrototypeOf(Element)).call(this, props)); _initialiseProps.call(_this); _this.state = { show: props.show, $self: _this }; _this.tickerId = -1; _this.enterMouse = null; _this.delayTimeout = null; _this.followParallax = props.followParallax; _this.transform = (0, _styleUtils.checkStyleName)('transform'); return _this; } (0, _createClass3['default'])(Element, [{ key: 'componentDidMount', value: function componentDidMount() { this.dom = _reactDom2['default'].findDOMNode(this); } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { if (this.followParallax) { this.doms = this.followParallax.data.map(function (item) { return document.getElementById(item.id); }); } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { _rcTweenOne.ticker.clear(this.timeoutID); _rcTweenOne.ticker.clear(this.delayTimeout); this.delayTimeout = -1; this.timeoutID = -1; } }, { key: 'render', value: function render() { var _props = this.props, prefixCls = _props.prefixCls, callBack = _props.callBack, propsAnimType = _props.animType, duration = _props.duration, delay = _props.delay, ease = _props.ease, elemOffset = _props.elemOffset, followParallax = _props.followParallax, show = _props.show, type = _props.type, direction = _props.direction, leaveChildHide = _props.leaveChildHide, sync = _props.sync, ratio = _props.ratio, mouseMoveType = _props.mouseMoveType, children = _props.children, propsStyle = _props.style, componentProps = _props.componentProps, props = (0, _objectWithoutProperties3['default'])(_props, ['prefixCls', 'callBack', 'animType', 'duration', 'delay', 'ease', 'elemOffset', 'followParallax', 'show', 'type', 'direction', 'leaveChildHide', 'sync', 'ratio', 'mouseMoveType', 'children', 'style', 'componentProps']); var _state = this.state, currentShow = _state.show, currentMouseMoveType = _state.mouseMoveType; var style = (0, _extends3['default'])({}, propsStyle); style.display = show ? 'block' : 'none'; style.position = 'absolute'; style.width = '100%'; if (mouseMoveType !== 'end') { style[this.transform] = ''; } props.style = style; props.className = ('banner-anim-elem ' + (prefixCls || '')).trim(); var bgElem = (0, _utils.toArrayChildren)(children).filter(function (item) { return item && item.type.isBannerAnimBgElement; }).map(function (item) { return _react2['default'].cloneElement(item, { show: props.show }); }); if (currentShow === show && !currentMouseMoveType || currentMouseMoveType === 'reChild') { props.animation = { x: 0, y: 0, type: 'set' }; if (!show) { this.enterMouse = null; return _react2['default'].createElement(_rcTweenOne2['default'], props, bgElem); } if (followParallax) { props.onMouseMove = this.getFollowMouseMove(); } return _react2['default'].createElement(_rcTweenOne2['default'], props, mouseMoveType === 'update' ? bgElem : this.getChildren()); } var $props = (0, _extends3['default'])({}, props, componentProps); return this.animChildren($props, style, bgElem); } }]); return Element; }(_react.Component); var _initialiseProps = function _initialiseProps() { var _this2 = this; this.onMouseMove = function (e) { _this2.domRect = _this2.dom.getBoundingClientRect(); _this2.enterMouse = _this2.enterMouse || { x: _this2.domRect.width / 2, y: _this2.domRect.height / 2 }; _this2.domWH = { w: _this2.domRect.width, h: _this2.domRect.height }; _this2.offsetTop = _this2.domRect.top + (0, _utils.currentScrollTop)(); _this2.offsetLeft = _this2.domRect.left + (0, _utils.currentScrollLeft)(); var mouseXY = { x: e.pageX - _this2.offsetLeft, y: e.pageY - _this2.offsetTop }; _this2.setTicker(_this2.followParallax, mouseXY); }; this.setTicker = function (followParallax, mouseXY) { var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop; _rcTweenOne.ticker.clear(_this2.tickerId); _this2.tickerId = 'bannerElementTicker' + (Date.now() + Math.random()); var startFrame = _rcTweenOne.ticker.frame; var startX = _this2.enterMouse.x; var startY = _this2.enterMouse.y; var duration = followParallax.duration || 450; var easeFunc = _tweenFunctions2['default'][followParallax.ease || 'easeOutQuad']; var start = typeof followParallax.minMove === 'number' ? followParallax.minMove : 0.08; _rcTweenOne.ticker.wake(_this2.tickerId, function () { var moment = (_rcTweenOne.ticker.frame - startFrame) * _rcTweenOne.ticker.perFrame; var ratio = easeFunc(moment, start, 1, duration); _this2.enterMouse.x = startX + (mouseXY.x - startX) * ratio; _this2.enterMouse.y = startY + (mouseXY.y - startY) * ratio; _this2.setFollowStyle(_this2.domWH); if (moment >= duration) { _rcTweenOne.ticker.clear(_this2.tickerId); callback(); } }); }; this.getFollowMouseMove = function () { var onMouseMove = void 0; if (_this2.followParallax) { if (_this2.followParallax.delay) { onMouseMove = !_this2.delayTimeout ? null : _this2.state.onMouseMove; _this2.delayTimeout = _this2.delayTimeout || _rcTweenOne.ticker.timeout(function () { _this2.setState({ onMouseMove: _this2.onMouseMove }); }, _this2.followParallax.delay); } else { onMouseMove = _this2.onMouseMove; } } return onMouseMove; }; this.getFollowStyle = function (data, domWH) { var style = {}; (0, _utils.dataToArray)(data.type).forEach(function (type) { var mouseData = _this2.enterMouse.x; var domData = domWH.w; var value = data.value; if ((type.indexOf('y') >= 0 || type.indexOf('Y') >= 0) && type !== 'opacity') { mouseData = _this2.enterMouse.y; domData = domWH.h; } var d = (mouseData - domData / 2) / (domData / 2) * value; var _type = (0, _styleUtils.getGsapType)(type); var cssName = (0, _styleUtils.isConvert)(_type); if (cssName === 'transform') { var transform = (0, _styleUtils.checkStyleName)('transform'); style[transform] = style[transform] || {}; style[transform][_type] = (0, _styleUtils.stylesToCss)(_type, d).trim(); } else if (cssName === 'filter') { var filter = (0, _styleUtils.checkStyleName)('filter'); style[filter] = style[filter] || {}; style[filter][_type] = (0, _styleUtils.stylesToCss)(_type, d).trim(); } else { style[cssName] = (0, _styleUtils.stylesToCss)(_type, d).trim(); } }); return style; }; this.setFollowStyle = function (domWH) { _this2.doms.forEach(function (item, i) { if (!item) { return; } var data = _this2.followParallax.data[i]; var style = _this2.getFollowStyle(data, domWH); Object.keys(style).forEach(function (key) { if (typeof style[key] === 'object') { var styleStr = ''; Object.keys(style[key]).forEach(function (_key) { styleStr += (' ' + _key + '(' + style[key][_key] + ')').trim(); }); item.style[key] = styleStr; return; } item.style[key] = key.indexOf('backgroundPosition') >= 0 ? 'calc(' + (data.bgPosition || '0%') + ' + ' + style[key] + ' )' : style[key]; }); }); }; this.getChildren = function () { return (0, _utils.toArrayChildren)(_this2.props.children).map(function (item, i) { if (item && item.type === _BgElement2['default']) { return _react2['default'].cloneElement(item, { show: _this2.state.show }); } return _this2.useTagComp ? (0, _utils.setAnimCompToTagComp)(item, i) : item; }); }; this.reFollowParallax = function () { if (!_this2.domRect) { return; } _this2.setTicker(_this2.followParallax, { x: _this2.domRect.width / 2 - _this2.offsetLeft, y: _this2.domRect.height / 2 - _this2.offsetTop }, function () { _this2.followParallax = null; }); }; this.animEnd = function () { var type = _this2.state.show ? 'enter' : 'leave'; _this2.props.callBack(type); _this2.setState(function (_, props) { return { show: props.show, mouseMoveType: null }; }); }; this.animChildren = function (props, style, bgElem) { var _props2 = _this2.props, elemOffset = _props2.elemOffset, leaveChildHide = _props2.leaveChildHide, ratio = _props2.ratio, currentAnimType = _props2.animType, direction = _props2.direction, mouseMoveType = _props2.mouseMoveType, ease = _props2.ease, duration = _props2.duration, delay = _props2.delay, show = _props2.show, sync = _props2.sync, component = _props2.component; if (_this2.tickerId) { _rcTweenOne.ticker.clear(_this2.tickerId); } if (_this2.delayTimeout) { _rcTweenOne.ticker.clear(_this2.delayTimeout); _this2.delayTimeout = null; } style.display = 'block'; props.component = component; style.zIndex = show ? 1 : 0; var type = show ? 'enter' : 'leave'; _this2.useTagComp = (currentAnimType === _anim2['default'].gridBar || currentAnimType === _anim2['default'].grid) && (show === _this2.state.show || _this2.state.show && !show); // 状态没改,锁定 children props.children = !sync && (show && show !== _this2.state.show || !show && !_this2.state.show) ? bgElem : _this2.getChildren(); var childrenToRender = _react2['default'].createElement(_rcTweenOne2['default'], props); var $ratio = mouseMoveType === 'end' && ratio <= 0.3 ? 1 - ratio : ratio; var tag = currentAnimType(childrenToRender, type, direction, { ease: ease, duration: duration, delay: delay, onComplete: _this2.animEnd }, elemOffset, leaveChildHide, $ratio, _this2.state.mouseMoveType === 'update'); var tagProps = (0, _objectWithoutProperties3['default'])(tag.props, []); if (tagProps.animation) { tagProps.moment = (tagProps.animation.duration + tagProps.animation.delay) * $ratio || 0; tagProps.paused = _this2.state.mouseMoveType === 'update' || $ratio === 1; } return _react2['default'].cloneElement(tag, tagProps); }; }; Element.propTypes = { children: _propTypes2['default'].any, style: _propTypes2['default'].object, prefixCls: _propTypes2['default'].string, component: _propTypes2['default'].any, elemOffset: _propTypes2['default'].object, type: _propTypes2['default'].string, animType: _propTypes2['default'].func, ease: _propTypes2['default'].string, duration: _propTypes2['default'].number, delay: _propTypes2['default'].number, direction: _propTypes2['default'].string, callBack: _propTypes2['default'].func, followParallax: _propTypes2['default'].any, show: _propTypes2['default'].bool, leaveChildHide: _propTypes2['default'].bool, sync: _propTypes2['default'].bool, ratio: _propTypes2['default'].number, mouseMoveType: _propTypes2['default'].string, componentProps: _propTypes2['default'].object }; Element.defaultProps = { component: 'div', componentProps: {}, callBack: noop, delay: 0 }; Element.BgElement = (0, _reactLifecyclesCompat.polyfill)(_BgElement2['default']); Element.isBannerAnimElement = true; exports['default'] = (0, _reactLifecyclesCompat.polyfill)(Element); module.exports = exports['default'];