【发布时间】:2022-01-24 23:10:03
【问题描述】:
我正在构建一个横向滚动/水平布局网站。我使用一个函数来测试一个元素是否在“正常”垂直布局站点的视口中,以便在它进入视图后添加类、动画等。
我正在尝试为水平布局获得相同的效果,但无济于事。
这是函数的常规版本-
$.fn.isInViewport = function() {
if ( $(this).length ) {
var elementTop = $(this).offset().top;
}
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};
这是我尝试水平布局的方式,但没有奏效。
$.fn.isInViewport = function() {
if ( $(this).length ) {
var elementLeft = $(this).offset().left;
}
var elementRight = elementLeft + $(this).outerWidth();
var viewportLeft = $(window).scrollLeft();
var viewportRight = viewportLeft + $(window).width();
return elementRight > viewportLeft && elementLeft < viewportRight;
};
你这样调用函数
$(".element").each(function() {
if ( $(this).isInViewport() ) {
$(this).addClass("animate-element");
}
});
【问题讨论】:
-
查看Intersection Observer API,只要您不需要 IE 兼容性。
-
水平检查的实现工作正常jsfiddle.net/taLzu8er/1。唯一的问题是变量
elementLeft是在 if 语句的范围内定义的。声明应该在 if 语句之前。 -
@onkarruikar 如果使用了
let,那将是正确的,但由于它是var,并且这里只有一个函数,因此无论在if内部还是外部声明,范围都是相同的。 (我同意它仍然更好地声明在外面,因为这样实际的范围更符合人们的视觉感知。)
标签: javascript html jquery css