【发布时间】:2011-02-18 01:46:28
【问题描述】:
想象一下这是我的页面:
<p>hello</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<p class="myPara">My Paragraph</p>
当用户向下滚动到具有“myPara”类的段落而不是在此之前,我如何才能提醒消息?
【问题讨论】:
标签: jquery
想象一下这是我的页面:
<p>hello</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<p class="myPara">My Paragraph</p>
当用户向下滚动到具有“myPara”类的段落而不是在此之前,我如何才能提醒消息?
【问题讨论】:
标签: jquery
怎么样:
var target = $(".myPara").offset().top;
var interval = setInterval(function() {
if ($(window).scrollTop() >= target) {
alert("made it!");
clearInterval(interval);
}
}, 250);
这是一个例子:http://jsfiddle.net/andrewwhitaker/24M3n/1/
您可能很想将事件处理程序附加到窗口滚动事件,但John Resig advises against it(向下滚动到“最佳实践”)。
更新:As @AbdulJabbarWebBestow points out,每 250 毫秒不必要地运行一个函数可能是个坏主意。这是一个更新后的示例,它仅在用户第一次滚动后 250 毫秒运行一次:
var target = $(".mypara").offset().top,
timeout = null;
$(window).scroll(function () {
if (!timeout) {
timeout = setTimeout(function () {
console.log('scroll');
clearTimeout(timeout);
timeout = null;
if ($(window).scrollTop() >= target) {
alert('made it');
}
}, 250);
}
});
【讨论】:
setInterval 的完美时间。查看我在答案中链接到的文章,了解为什么您不想直接附加到.scroll。
$(window).scroll(function(){
console.log($('#myPara').offset().top < $(this).height() + $(this).scrollTop());
});
【讨论】:
我一直在考虑附加滚动事件的问题(@AndrewWhitaker 指出),我最后的想法是没有必要每 x 秒添加一个 scoll 事件处理程序,因为你可以只执行一个 @ 987654321@ 并在回调中检查是否应显示警报。例如:
var showMessageInterval = window.setInterval(showMessageIfNeeded, 500);
// you could adjust the interval to the animation duration of the
// message showing. In this way, the delay will be more "natural"
showMessageIfNeeded 回调将检查 scrollTop 值并在需要时显示消息。如果显示该消息,则必须清除 setInterval 以避免下一次执行:
function showMessageIfNeeded() {
var scrollTop = $(window).scrollTop();
var targetTop = $(".myPara").offset().top;
if (scrollTop > targetTop) {
alert('Show message');
window.clearInterval(showMessageInterval);
}
}
【讨论】:
您可以使用 scrollspy jquery 插件来做到这一点。 https://github.com/thesmart/jquery-scrollspy
$('.myPara').on('scrollSpy:enter', function() {
console.log('enter:', $(this).attr('id'));
});
$('.myPara').on('scrollSpy:exit', function() {
console.log('exit:', $(this).attr('id'));
});
$('.tile').scrollSpy();
【讨论】:
将页面滚动位置与您的元素顶部位置进行比较,而不是调用您的函数。
jQuery
$(document).on('scroll', function() {
if ($(this).scrollTop() >= $('.myPara').position().top) {
console.log('Reached');
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<p>hello</p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<p class="myPara">My Paragraph</p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
ES6(纯 JS,无 jQuery)
var target = document.querySelector('.myPara');
document.addEventListener('scroll', () => {
if (window.scrollY >= target.getBoundingClientRect().top) {
console.log('Reached');
}
})
<p>hello</p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<p class="myPara">My Paragraph</p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
【讨论】: