Ron*_*nny 17 html javascript jquery tracking viewport
我需要找到一个解决以下问题的好方法.我看到很多人都在询问是否有一个元素在页面或浏览器窗口的视图Port的内部或外部.我需要能够复制这个动作,但是在滚动的DIV中,有溢出:滚动例如.有没有人知道这个具体行动的好例子?
提前致谢.
Akr*_*awy 27
我以前遇到过同样的问题,我最后得到了以下函数.第一个参数是元素检查,第二个是检查元素是否部分in-view.it仅用于垂直检查,你可以扩展检查水平滚动.
function checkInView(elem,partial)
{
var container = $(".scrollable");
var contHeight = container.height();
var contTop = container.scrollTop();
var contBottom = contTop + contHeight ;
var elemTop = $(elem).offset().top - container.offset().top;
var elemBottom = elemTop + $(elem).height();
var isTotal = (elemTop >= 0 && elemBottom <=contHeight);
var isPart = ((elemTop < 0 && elemBottom > 0 ) || (elemTop > 0 && elemTop <= container.height())) && partial ;
return isTotal || isPart ;
}
Run Code Online (Sandbox Code Playgroud)
在jsFiddle上查看它.
Ada*_*eis 19
这是一个纯粹的javascript版本的接受答案,不依赖于jQuery,并修复部分视图检测和支持顶视图.
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);
}
Run Code Online (Sandbox Code Playgroud)
作为奖励,此功能可确保元素在视图中(如果不是(部分或完整)):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
基于最佳答案。而不是仅仅告诉你一个元素是否部分可见。我添加了一些额外的内容,以便您可以传入一个百分比 (0-100),告诉您元素是否超过 x% 可见。
function (container, element, partial) {
var cTop = container.scrollTop;
var cBottom = cTop + container.clientHeight;
var eTop = element.offsetTop;
var eBottom = eTop + element.clientHeight;
var isTotal = (eTop >= cTop && eBottom <= cBottom);
var isPartial;
if (partial === true) {
isPartial = (eTop < cTop && eBottom > cTop) || (eBottom > cBottom && eTop < cBottom);
} else if(typeof partial === "number"){
if (eTop < cTop && eBottom > cTop) {
isPartial = ((eBottom - cTop) * 100) / element.clientHeight > partial;
} else if (eBottom > cBottom && eTop < cBottom){
isPartial = ((cBottom - eTop) * 100) / element.clientHeight > partial;
}
}
return (isTotal || isPartial);
}
Run Code Online (Sandbox Code Playgroud)