function checkInView(container, element, partial) {
//Get container properties
let cTop = container.scrollTop;
let cBottom = cTop + container.clientHeight;
//Get element properties
let eTop = element.offsetTop;
let eBottom = eTop + element.clientHeight;
//Check if in view
let isTotal = (eTop >= cTop && eBottom <= cBottom);
let isPartial = partial && (
(eTop < cTop && eBottom > cTop) ||
(eBottom > cBottom && eTop < cBottom)
);
//Return outcome
return (isTotal || isPartial);
}
作为奖励,该函数确保元素在视图中,如果它不是(部分或全部):
function ensureInView(container, element) {
//Determine container top and bottom
let cTop = container.scrollTop;
let cBottom = cTop + container.clientHeight;
//Determine element top and bottom
let eTop = element.offsetTop;
let eBottom = eTop + element.clientHeight;
//Check if out of view
if (eTop < cTop) {
container.scrollTop -= (cTop - eTop);
}
else if (eBottom > cBottom) {
container.scrollTop += (eBottom - cBottom);
}
}
9条答案
按热度按时间6yt4nkrj1#
为了我的目的摆弄它。这是我的解决方案(香草)
Menu是容器,el是活动元素。
xxe27gdn2#
这是一个纯JavaScript的解决方案。
zbwhf8kr3#
以下是使用相对较新的Intersection Observer API(自2019年以来已在主要浏览器中支持)的解决方案:https://caniuse.com/intersectionobserver)。
这几乎处理了我在这个问题中看到的所有边缘情况。(它唯一没有捕捉到的边缘情况是绝对定位的元素遮挡了滚动元素。
用法:
您可以修改函数实现的
intersectionRatio === 1
部分,以更改元素必须如何“显示”,以便此函数返回true
。(intersectionRatio
是介于0.0
和1.0
之间的值。)请参阅intersectionRatio
文档:https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry/intersectionRatio下面是一个例子:
ttygqcqt4#
我用最后一个答案做了一个jquery插件:
waxmsbnn5#
你可以试试这个
例如:
aiqt4smr6#
这里是一个纯JavaScript版本的公认答案,不依赖于jQuery,并对部分视图检测和顶部视图外支持进行了一些修复。
作为奖励,该函数确保元素在视图中,如果它不是(部分或全部):
pb3s4cty7#
我以前也遇到过同样的问题,我最终得到了下面的函数。第一个参数是要检查的元素,第二个是检查元素是否部分in-view.it只用于垂直检查,你可以扩展它来检查水平滚动。
在jsFiddle上查看。
e7arh2l68#
基于最佳答案。而不是仅仅告诉你一个元素是否部分可见。我添加了一点额外的内容,以便您可以传入一个百分比(0-100),告诉您元素是否超过x%可见。
yrefmtwq9#
我能够通过对所发布的纯JavaScript版本做一个小改动来实现这一点