UNPKG

7.36 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends2 = require('babel-runtime/helpers/extends');
8
9var _extends3 = _interopRequireDefault(_extends2);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
20
21var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
22
23var _inherits2 = require('babel-runtime/helpers/inherits');
24
25var _inherits3 = _interopRequireDefault(_inherits2);
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _reactDom = require('react-dom');
32
33var _reactDom2 = _interopRequireDefault(_reactDom);
34
35var _propTypes = require('prop-types');
36
37var _propTypes2 = _interopRequireDefault(_propTypes);
38
39var _Tween = require('rc-tween-one/lib/Tween');
40
41var _Tween2 = _interopRequireDefault(_Tween);
42
43var _styleUtils = require('style-utils');
44
45var _utils = require('./utils');
46
47var _anim = require('./anim');
48
49var _anim2 = _interopRequireDefault(_anim);
50
51function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
52
53var BgElement = function (_React$Component) {
54 (0, _inherits3['default'])(BgElement, _React$Component);
55
56 function BgElement(props) {
57 (0, _classCallCheck3['default'])(this, BgElement);
58
59 var _this = (0, _possibleConstructorReturn3['default'])(this, (BgElement.__proto__ || Object.getPrototypeOf(BgElement)).call(this, props));
60
61 _this.onScroll = function () {
62 var scrollTop = (0, _utils.currentScrollTop)();
63 var domRect = _this.dom.parentNode.getBoundingClientRect();
64 var offsetTop = domRect.top + scrollTop;
65 var height = Math.max(domRect.height, (0, _utils.windowHeight)());
66 var elementShowHeight = scrollTop - offsetTop + height;
67 var scale = elementShowHeight / (height + domRect.height);
68 scale = scale || 0;
69 scale = scale >= 1 ? 1 : scale;
70 _this.tween.frame(scale * _this.scrollParallaxDuration);
71 };
72
73 _this.onResize = function () {
74 if (!_this.props.show) {
75 return;
76 }
77 var domRect = _this.dom.getBoundingClientRect();
78 var videoDomRect = _this.video.getBoundingClientRect();
79 _this.videoLoad = true;
80 var scale = void 0;
81 var videoRect = {
82 display: 'block',
83 position: 'relative',
84 top: 0,
85 left: 0
86 };
87 if (domRect.width / domRect.height > videoDomRect.width / videoDomRect.height) {
88 scale = domRect.width / videoDomRect.width;
89 videoRect.width = domRect.width;
90 videoRect.height = videoDomRect.height * scale;
91 videoRect.top = -(videoRect.height - domRect.height) / 2;
92 } else {
93 scale = domRect.height / videoDomRect.height;
94 videoRect.height = domRect.height;
95 videoRect.width = videoDomRect.width * scale;
96 videoRect.left = -(videoRect.width - domRect.width) / 2;
97 }
98
99 Object.keys(videoRect).forEach(function (key) {
100 _this.video.style[key] = (0, _styleUtils.stylesToCss)(key, videoRect[key]);
101 });
102 };
103
104 _this.videoLoadedData = function () {
105 _this.onResize();
106 if (window.addEventListener) {
107 window.addEventListener('resize', _this.onResize);
108 } else {
109 window.attachEvent('onresize', _this.onResize);
110 }
111 };
112
113 _this.isVideo = (0, _utils.toArrayChildren)(_this.props.children).some(function (item) {
114 return item.type === 'video';
115 });
116 if (_this.isVideo) {
117 // 如果是 video,删除 grid 系列,位置发生变化,重加载了 video;
118 delete _anim2['default'].grid;
119 delete _anim2['default'].gridBar;
120 }
121 if (_this.props.scrollParallax) {
122 _this.scrollParallaxDuration = _this.props.scrollParallax.duration || 450;
123 }
124 _this.video = null;
125 _this.videoLoad = false;
126 return _this;
127 }
128
129 (0, _createClass3['default'])(BgElement, [{
130 key: 'componentDidMount',
131 value: function componentDidMount() {
132 this.dom = _reactDom2['default'].findDOMNode(this);
133 if (!this.videoLoad) {
134 if (this.video && this.props.videoResize) {
135 this.video.onloadeddata = this.videoLoadedData;
136 }
137 }
138 if (this.props.scrollParallax) {
139 this.tween = new _Tween2['default'](this.dom, [(0, _extends3['default'])({
140 ease: 'linear' }, this.props.scrollParallax)], { attr: 'style' });
141 this.tween.frame(0);
142 this.onScroll();
143 if (window.addEventListener) {
144 window.addEventListener('scroll', this.onScroll);
145 } else {
146 window.attachEvent('onscroll', this.onScroll);
147 }
148 }
149 }
150 }, {
151 key: 'componentWillReceiveProps',
152 value: function componentWillReceiveProps(nextProps) {
153 var _this2 = this;
154
155 if (nextProps.show) {
156 // 取 dom 在 render 之后;
157 setTimeout(function () {
158 if (_this2.video && _this2.props.videoResize && _this2.videoLoad) {
159 _this2.onResize();
160 }
161 if (_this2.props.scrollParallax) {
162 _this2.onScroll();
163 }
164 });
165 }
166 }
167 }, {
168 key: 'componentWillUnmount',
169 value: function componentWillUnmount() {
170 if (window.addEventListener) {
171 window.removeEventListener('resize', this.onResize);
172 window.removeEventListener('scroll', this.onScroll);
173 } else {
174 window.detachEvent('onresize', this.onResize);
175 window.detachEvent('onscroll', this.onScroll);
176 }
177 }
178 }, {
179 key: 'render',
180 value: function render() {
181 var _this3 = this;
182
183 var props = (0, _extends3['default'])({}, this.props, this.props.componentProps);
184 ['videoResize', 'scrollParallax', 'scrollParallaxDuration', 'show', 'component', 'componentProps'].forEach(function (key) {
185 return delete props[key];
186 });
187 if (this.isVideo && this.props.videoResize) {
188 var children = (0, _utils.toArrayChildren)(props.children).map(function (item, i) {
189 return _react2['default'].cloneElement(item, (0, _extends3['default'])({}, item.props, { key: item.key || 'bg-video-' + i, ref: function ref(c) {
190 _this3.video = c;
191 if (typeof item.ref === 'function') {
192 item.ref(c);
193 }
194 }
195 }));
196 });
197 props.children = children.length === 1 ? children[0] : children;
198 }
199 return _react2['default'].createElement(this.props.component, props);
200 }
201 }]);
202 return BgElement;
203}(_react2['default'].Component);
204
205exports['default'] = BgElement;
206
207
208BgElement.propTypes = {
209 className: _propTypes2['default'].string,
210 style: _propTypes2['default'].object,
211 children: _propTypes2['default'].any,
212 component: _propTypes2['default'].any,
213 videoResize: _propTypes2['default'].bool,
214 scrollParallax: _propTypes2['default'].object,
215 show: _propTypes2['default'].bool,
216 componentProps: _propTypes2['default'].object
217};
218
219BgElement.defaultProps = {
220 component: 'div',
221 videoResize: true,
222 componentProps: {}
223};
224
225BgElement.isBannerAnimBgElement = true;
226module.exports = exports['default'];
\No newline at end of file