【发布时间】:2020-04-13 08:27:52
【问题描述】:
所以我得到了这段代码,当该部分位于视口中时,它添加了一个类名,到目前为止,它只适用于第一个元素,因为我使用的是 querySelector,但如果我有机会 querySelectorAll 它不起作用。
我正在尝试在用户滚动页面时为每个部分添加动画,无论是向上还是向下。
import React from 'react';
const EffectComponent = () => {
const vpPlitz = (element) => {
const scroll = window.scrollY || window.pageYOffset;
const boundsTop = element.getBoundingClientRect().top + scroll;
const viewport = {
top: scroll,
bottom: scroll + window.innerHeight,
};
const bounds = {
top: boundsTop,
bottom: boundsTop + element.clientHeight,
};
return (
(bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) ||
(bounds.top <= viewport.bottom && bounds.top >= viewport.top)
);
};
// Usage.
document.addEventListener('DOMContentLoaded', () => {
const answer = document.querySelector('section');
const handler = () => {
return vpPlitz(answer)
? answer.classList.add('section-animated')
: answer.classList.remove('section-animated');
};
handler();
window.addEventListener('scroll', handler);
});
return null;
};
export default EffectComponent;
更新:
感谢 Thet 的帮助,我能够更改 React。如果有人可能使用它,我会发布它。
import { useEffect } from 'react';
const EffectComponent = () => {
useEffect(() => {
const answers = document.querySelectorAll('section');
const handler = (answer) => {
return vpPlitz(answer)
? answer.classList.add('section-animated')
: answer.classList.remove('section-animated');
};
window.addEventListener('scroll', () => {
answers.forEach((answer) => handler(answer));
});
}, []);
const vpPlitz = (element) => {
const scroll = window.scrollY || window.pageYOffset;
const boundsTop = element.getBoundingClientRect().top + scroll;
const viewport = {
top: scroll,
bottom: scroll + window.innerHeight,
};
const bounds = {
top: boundsTop,
bottom: boundsTop + element.clientHeight,
};
return (
(bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) ||
(bounds.top <= viewport.bottom && bounds.top >= viewport.top)
);
};
return null;
};
export default EffectComponent;```
【问题讨论】:
标签: javascript reactjs react-router-dom mern