javascript - 在元素内部滚动,知道什么元素是可见的
问题描述
我有一个反应元素,它是一个模态。模态是可滚动的,我希望在 elm
变量内部滚动可见的元素数量。
const Modal = (props) => {
const [elm, setElm] = useState(0)
return (
<p>Current element is: {elm}</p>
<element1/>
<element2/>
<element3/>
<element4/>
)
}
我尝试将滚动事件添加到模态,并找出某种方法来获取滚动位置,然后将该位置与元素位置进行比较并返回结果,但所有尝试都失败了。
解决方案
我已将状态名称切换为 page 而不是 elm,答案是:
const Modal = (props) => {
const [page, setPage] = useState(0)
function checkInView(container, element) {
let cTop = container.scrollTop;
let cBottom = cTop + container.clientHeight;
let eTop = element.offsetTop;
let eBottom = eTop + element.clientHeight;
let isTotal = (eTop >= cTop && eBottom <= cBottom);
let isPartial = (eTop < cTop && eBottom > cTop) || (eBottom > cBottom && eTop < cBottom)
return (isTotal || isPartial);
}
function monitorScroll() {
let elm = document.getElementsByClassName('scrollElementClass')
let pgs = document.getElementsByClassName('pageClass')
elm[0] && elm[0].addEventListener('scroll', (e)=>{
const pages = [...pgs];
const arrOfBools = pages.map(page => checkInView(elm[0], page));
const currentPage = arrOfBools.findIndex(aob => aob === true);
if (currentPage !== page ) {
console.log('triggered')
setPage(currentPage)
}
}
);
}
useEffect(()=>{
monitorScroll()
}, [])
return (
<div className="scrollElementClass">
<p>Current element is: {page}</p>
<element1 className="pageClass"/>
<element2 className="pageClass"/>
<element3 className="pageClass"/>
<element4 className="pageClass"/>
) }
基本上,函数checkInView
获取整个页面的高度,将元素的位置与其进行比较,计算元素是否在视图内,并执行简单的布尔方程:
> let isTotal = (eTop >= cTop && eBottom <= cBottom);
> let isPartial = (eTop < cTop && eBottom > cTop) || (eBottom > cBottom && eTop < cBottom)
除此之外,函数monitorScroll
通过方法获取元素getElementByClassName
并插入“滚动”事件侦听器。通过 checkInView 函数映射页面来创建布尔数组。
最后,它只是在数组中获取真假位置,如果位置 0 i 为真,则表示第 0 页在视图中,如果位置 3 为真,则表示第 3 页在视图中。
推荐阅读
- google-cloud-platform - 将启动脚本日志推送到 gcp 中的单独文件
- sql - CURSOR 的使用会提高在 SQL 中使用 PIVOT 进行查询的性能/速度吗?
- python - Python Linux IBM Lotus Notes 9 - 导出数据库
- python - 如何使用 Python 从我的 CSV 文件生成嵌套的 JSON 数据
- c# - 外键部署到 SQL 服务器的问题 - 代码优先 - 空外键
- javascript - 在 base64 中发送更大的图像时,Nodemailer 崩溃
- git - 如何列出所有分支中每个作者的最新提交?
- vba - IBM MAXIMO:如何使用 REST API 从 PR 创建 PO
- java - 无法运行程序“AdoptOpenJDK\jdk-8.0.232.09-hotspot\jre\bin\java.exe”:CreateProcess 错误=206,文件名或扩展名太长
- node.js - RDS 管理控制台中显示的 sequelize 和连接中最大连接池大小的差异