javascript - 如何仅在滚动进入特定部分时设置间隔并立即清除?
问题描述
下面有这段代码,非常简单:
- 用户滚动到某个部分,该部分被标记为 CSS 类“视图”
- 当我到达特定部分“someClsOfSection”时,我想使用 setInterval 触发向某个元素添加 20 个不同的类
- 每当我滚动时,条件都会满足,一旦我进入此部分,我不知道如何清除间隔...... https://codepen.io/StevaNNN/pen/GRNOLyJ这里是codepen
const isFullySeen = el =>
el && typeof el.getBoundingClientRect === 'function'
&& el.getBoundingClientRect()['top'] +
window.scrollY + (window.innerHeight) <= window.innerHeight + window.scrollY;
$(document).ready(function () {
$(window).scroll(function () {
$('.section').each(function() {
if (isFullySeen(this) === true) {
$(this).addClass('in-view');
}
if(isFullySeen(this) && $(this).hasClass('.someClsOfSection')) {
let tempCls = 0;
let toTwentyPercent = setTimeout(function () {
setInterval(function () {
if (tempCls < 20) {
tempCls++;
$('.c100').addClass(`p${tempCls}`).animate();
}
}, 100);
}, 1000);
clearInterval(toTwentyPercent);
}
});
});
});
解决方案
实际上,setTimeout()
被分配给toTwentyPercent
... 但之后立即被清除。所以它永远不会执行它的回调。另外,这setInterval()
是您要清除的。因此,我建议您尝试以下方法:
let tempCls = 0;
setTimeout(function () {
let toTwentyPercent = setInterval(function () {
if (tempCls < 20) {
$('.c100').eq(tempCls).addClass(`p${tempCls}`);
tempCls++;
}else{
clearInterval(toTwentyPercent);
}
}, 100);
}, 1000);
所以在这里,脚本将等待 1 秒,然后将分配setInterval()
给toTwentyPercent
.
然后,每 100 毫秒,一个类将被添加到一个.c100
元素中。请注意按顺序.eq(tempCls)
添加p0
, p1
, p2
... 。如果没有.eq()方法,所有.c100
元素都将在每个间隔上获得一个添加的类......并且在最后一个间隔上,它们都将具有从p0
to的类p19
。
最后,whentempCls < 20
为 false,即清除区间的时间。
我删除了,.animate()
因为我不知道意图是什么。该方法至少需要一个属性才能将动画设置为新值。没有任何争论是非常有用的。
推荐阅读
- python - 如何使用建议的函数形式和使用 Python 的 3D 数据来拟合表面
- php - 从文本文件插入数据库,使用特殊字符,如 , 和 \
- php - PHP - 动态舍入数字到最接近的百万、十万或千
- python - 类似的正则表达式为最大连续子字符串计数返回不同的答案
- algorithm - 高效存储和查询唯一整数和整数范围
- javascript - 在动态创建的 img 元素上设置 img src
- android - 远程控制/流式传输 Android 11 屏幕到 PC,而无需每次都确认连接
- php - 如何更改wordpress中div内标签的限制?
- python - 如何使用 VBA 和 Python(pywin32) 在 Visio 中连接形状?
- android - 将项目插入房间数据库时出错 - 仅插入最后一个项目并复制其余项目