1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _extends2 = require('babel-runtime/helpers/extends');
|
8 |
|
9 | var _extends3 = _interopRequireDefault(_extends2);
|
10 |
|
11 | var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
12 |
|
13 | var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
14 |
|
15 | var _createClass2 = require('babel-runtime/helpers/createClass');
|
16 |
|
17 | var _createClass3 = _interopRequireDefault(_createClass2);
|
18 |
|
19 | var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
|
20 |
|
21 | var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
|
22 |
|
23 | var _inherits2 = require('babel-runtime/helpers/inherits');
|
24 |
|
25 | var _inherits3 = _interopRequireDefault(_inherits2);
|
26 |
|
27 | var _react = require('react');
|
28 |
|
29 | var _react2 = _interopRequireDefault(_react);
|
30 |
|
31 | var _reactDom = require('react-dom');
|
32 |
|
33 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
34 |
|
35 | var _propTypes = require('prop-types');
|
36 |
|
37 | var _propTypes2 = _interopRequireDefault(_propTypes);
|
38 |
|
39 | var _Tween = require('rc-tween-one/lib/Tween');
|
40 |
|
41 | var _Tween2 = _interopRequireDefault(_Tween);
|
42 |
|
43 | var _styleUtils = require('style-utils');
|
44 |
|
45 | var _utils = require('./utils');
|
46 |
|
47 | var _anim = require('./anim');
|
48 |
|
49 | var _anim2 = _interopRequireDefault(_anim);
|
50 |
|
51 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
52 |
|
53 | var 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 |
|
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 |
|
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 |
|
205 | exports['default'] = BgElement;
|
206 |
|
207 |
|
208 | BgElement.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 |
|
219 | BgElement.defaultProps = {
|
220 | component: 'div',
|
221 | videoResize: true,
|
222 | componentProps: {}
|
223 | };
|
224 |
|
225 | BgElement.isBannerAnimBgElement = true;
|
226 | module.exports = exports['default']; |
\ | No newline at end of file |