UNPKG

yunjiwong-slider

Version:
210 lines (173 loc) 6.95 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _styleUtils = require('style-utils'); var _utils = require('./utils'); var _anim = require('./anim'); var _anim2 = _interopRequireDefault(_anim); var _Tween = require('rc-tween-one/lib/Tween'); var _Tween2 = _interopRequireDefault(_Tween); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var BgElement = function (_React$Component) { (0, _inherits3['default'])(BgElement, _React$Component); function BgElement() { (0, _classCallCheck3['default'])(this, BgElement); var _this = (0, _possibleConstructorReturn3['default'])(this, (BgElement.__proto__ || Object.getPrototypeOf(BgElement)).apply(this, arguments)); _this.onScroll = function () { var scrollTop = (0, _utils.currentScrollTop)(); var domRect = _this.dom.parentNode.getBoundingClientRect(); var offsetTop = domRect.top + scrollTop; var height = Math.max(domRect.height, (0, _utils.windowHeight)()); var elementShowHeight = scrollTop - offsetTop + height; var scale = elementShowHeight / (height + domRect.height); scale = scale || 0; scale = scale >= 1 ? 1 : scale; _this.tween.frame(scale * _this.scrollParallaxDuration); }; _this.onResize = function () { var domRect = _this.dom.getBoundingClientRect(); var videoDomRect = _this.video.getBoundingClientRect(); _this.videoLoad = true; var scale = void 0; var videoRect = { display: 'block', position: 'relative', top: 0, left: 0 }; if (domRect.width / domRect.height > videoDomRect.width / videoDomRect.height) { scale = domRect.width / videoDomRect.width; videoRect.width = domRect.width; videoRect.height = videoDomRect.height * scale; videoRect.top = -(videoRect.height - domRect.height) / 2; } else { scale = domRect.height / videoDomRect.height; videoRect.height = domRect.height; videoRect.width = videoDomRect.width * scale; videoRect.left = -(videoRect.width - domRect.width) / 2; } Object.keys(videoRect).forEach(function (key) { _this.video.style[key] = (0, _styleUtils.stylesToCss)(key, videoRect[key]); }); }; _this.videoLoadedData = function () { _this.onResize(); if (window.addEventListener) { window.addEventListener('resize', _this.onResize); } else { window.attachEvent('onresize', _this.onResize); } }; _this.isVideo = (0, _utils.toArrayChildren)(_this.props.children).filter(function (item) { return item.type === 'video'; }); if (_this.isVideo.length) { // 如果是 video,删除 grid 系列,位置发生变化,重加载了 video; delete _anim2['default'].grid; delete _anim2['default'].gridBar; } if (_this.props.scrollParallax) { _this.scrollParallaxDuration = _this.props.scrollParallax.duration || 450; } _this.video = null; _this.videoLoad = false; return _this; } (0, _createClass3['default'])(BgElement, [{ key: 'componentDidMount', value: function componentDidMount() { this.dom = _reactDom2['default'].findDOMNode(this); if (!this.videoLoad) { this.video = _reactDom2['default'].findDOMNode(this.refs.video); if (this.video && this.props.videoResize) { this.video.onloadeddata = this.videoLoadedData; } } if (this.props.scrollParallax) { this.tween = new _Tween2['default'](this.dom, [(0, _extends3['default'])({ ease: 'linear' }, this.props.scrollParallax)], { attr: 'style' }); this.tween.frame(0); this.onScroll(); if (window.addEventListener) { window.addEventListener('scroll', this.onScroll); } else { window.attachEvent('onscroll', this.onScroll); } } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { if (nextProps.show) { if (this.video && this.props.videoResize && this.videoLoad) { this.videoLoadedData(); } if (this.props.scrollParallax) { this.onScroll(); } } else { this.componentWillUnmount(); } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { if (window.addEventListener) { window.removeEventListener('resize', this.onResize); window.removeEventListener('scroll', this.onScroll); } else { window.detachEvent('onresize', this.onResize); window.detachEvent('onscroll', this.onScroll); } } }, { key: 'render', value: function render() { var props = (0, _extends3['default'])({}, this.props); ['videoResize', 'scrollParallax', 'scrollParallaxDuration', 'show', 'component'].forEach(function (key) { return delete props[key]; }); if (this.isVideo && this.props.videoResize) { props.children = (0, _utils.toArrayChildren)(props.children).map(function (item) { var ref = item.type === 'video' ? 'video' : null; return _react2['default'].cloneElement(item, (0, _extends3['default'])({}, item.props, { ref: ref })); }); } return _react2['default'].createElement(this.props.component, props); } }]); return BgElement; }(_react2['default'].Component); exports['default'] = BgElement; BgElement.propTypes = { className: _propTypes2['default'].string, style: _propTypes2['default'].object, children: _propTypes2['default'].any, component: _propTypes2['default'].any, videoResize: _propTypes2['default'].bool, scrollParallax: _propTypes2['default'].object, show: _propTypes2['default'].bool }; BgElement.defaultProps = { component: 'div', videoResize: true }; BgElement.isBannerAnimBgElement = true; module.exports = exports['default'];