javascript - 根据水平滚动检查元素是否在视口中
问题描述
我正在构建一个横向滚动/水平布局站点。我使用一个函数来测试一个元素是否在“正常”垂直布局站点的视口中,以便在它进入视图后添加类、动画等。
我试图为水平布局获得相同的效果,但无济于事。
这是该功能的常规版本 -
$.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");
}
});
解决方案
使用 jquery 非常简单,你所要做的就是 $(element).on('scroll',(--function--)) 然后你可以使用 $(this).offset().left 来获取像素在它的左边,当你得到左边的偏移量时,你可以做任何你想做的事情。检查下面的代码片段以获取工作示例。(如果可能在像手机这样的小屏幕上运行)
$("#timeline").on('scroll', function() {
$("#timeline .each").each(function(){
let left = $(this).offset().left;
if(left >-50 && left< (window.innerWidth - 100)){
$(this).addClass('mvisible')
}
else{
if($(this).hasClass('mvisible')){
$(this).removeClass('mvisible')
}
}
});
});
.timeline{overflow-x:auto;width:100%}
.timeline .warp{display:flex;width:1600px;padding:50px 100px 50px 30px;}
.timeline .each{width:185px;}
.timeline .desc{padding:15px;border-radius:4px;background:#08f;color:#fff;width:100%;transform:translateY(50px);opacity:0;transition:0.4s}
.timeline .mvisible .desc{transform:translateY(0);opacity:1}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="timeline" id="timeline">
<div class="warp">
<div class="each mvisible">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each" >
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each" >
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
<div class="each">
<div class="desc">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</div>
</div>
</div>
推荐阅读
- c++ - QNX pthread_mutex_lock 导致死锁错误 (45 = EDEADLK)
- python - for i in range(start,end): RecursionError: 比较中超出最大递归深度
- node.js - 我在 node.js 源代码中找不到方法的定义
- machine-learning - 三轴数据的深度学习
- javascript - React.createElement:类型无效——期望一个字符串,但得到:未定义
- r - 随机化 R 数据表中组的顺序,同时保留组的内部顺序
- security - Spectre Attack中进程如何共享array2(oracle数组)?
- sql - 在 SQL SERVER 中获取日期范围内的列的第一个非空值的最快方法
- csv - Javamail - CSVPrinter:发送带有 csv 附件的电子邮件
- c# - Aspose.Cells.CellsException - “您正在使用评估副本并且打开的文件超出限制”