我正在根据它们在视口中的位置为几个 React.js 组件设置动画。如果组件在视口中,则将不透明度设置为 1,如果不在视口中,则将其不透明度设置为 0。我使用getBoundingClient()
'stop
和bottom
properties 来确定组件是否在视口内。
ComponentA 显示了我对其他 B、C 和 D 组件所遵循的模式。他们每个人都在监听window
滚动事件。
这是通过每个组件必须向window
. 同一窗口上的多个滚动事件侦听器?
或者有没有更好的方法通过在Home
所有者组件处将滚动事件侦听器添加到窗口一次?那么拥有者的子组件是否仍然能够使用getBoundingClient()
?
Home = React.createClass({
render: function() {
<div>
<ComponentA />
<ComponentB />
<ComponentC />
<ComponentD />
</div>
};
});
ComponentA = React.createClass({
componentDidMount: function() {
window.addEventListener('scroll', this.handleScroll);
},
componentWillUnmount: function() {
window.removeEventListener('scroll', this.handleScroll);
},
handleScroll: function() {
var domElement = this.refs.domElement.getDOMNode();
this.inViewPort(domElement);
},
inViewPort: function(element) {
var elementBounds = element.getBoundingClientRect();
(elementBounds.top <= 769 && elementBounds.bottom >= 430) ? TweenMax.to(element, 1.5, { opacity: 1 }) : TweenMax.to(element, 1.5, { opacity: 0 });
},
render: function() {
return (/* html to render */);
}
});