当用户滚动到特定元素时触发事件 - 使用 jQuery

IT技术 javascript jquery html scroll scrollto
2021-01-22 13:15:39

我有一个远离页面的 h1..

<h1 id="scroll-to">TRIGGER EVENT WHEN SCROLLED TO.</h1>

并且我想在用户滚动到 h1 或将其显示在浏览器视图中时触发警报。

$('#scroll-to').scroll(function() {
     alert('you have scrolled to the h1!');
});

我该怎么做呢?

6个回答

您可以计算offset元素的 ,然后将其与如下scroll进行比较

$(window).scroll(function() {
   var hT = $('#scroll-to').offset().top,
       hH = $('#scroll-to').outerHeight(),
       wH = $(window).height(),
       wS = $(this).scrollTop();
   if (wS > (hT+hH-wH)){
       console.log('H1 on the view!');
   }
});

检查这个演示小提琴


更新的演示小提琴没有警报——而是 FadeIn() 元素


更新代码以检查元素是否在视口内。因此,无论您是向上还是向下滚动,都可以向 if 语句添加一些规则:

   if (wS > (hT+hH-wH) && (hT > wS) && (wS+wH > hT+hH)){
       //Do something
   }

演示小提琴

是否有任何包库可以像 jQuery Waypoint 这样的函数来执行此操作?
2021-03-14 13:15:39
谢谢@DaniP。很酷的片段!
2021-03-14 13:15:39
@DaniP 我刚刚做了,谢谢!感谢您的回答,对我帮助很大:)
2021-03-24 13:15:39
请取消这个!
2021-04-03 13:15:39
@ClosDesign 你可以用来解绑.off()事件jsfiddle.net/n4pdx/543
2021-04-10 13:15:39

将此问题与当用户滚动经过页面的某个部分时 jQuery 触发操作的最佳答案相结合

var element_position = $('#scroll-to').offset().top;

$(window).on('scroll', function() {
    var y_scroll_pos = window.pageYOffset;
    var scroll_pos_test = element_position;

    if(y_scroll_pos > scroll_pos_test) {
        //do stuff
    }
});

更新

我改进了代码,以便在元素位于屏幕的一半而不是最顶部时触发它。如果用户点击屏幕底部并且函数尚未触发,它也会触发代码。

var element_position = $('#scroll-to').offset().top;
var screen_height = $(window).height();
var activation_offset = 0.5;//determines how far up the the page the element needs to be before triggering the function
var activation_point = element_position - (screen_height * activation_offset);
var max_scroll_height = $('body').height() - screen_height - 5;//-5 for a little bit of buffer

//Does something when user scrolls to it OR
//Does it when user has reached the bottom of the page and hasn't triggered the function yet
$(window).on('scroll', function() {
    var y_scroll_pos = window.pageYOffset;

    var element_in_view = y_scroll_pos > activation_point;
    var has_reached_bottom_of_page = max_scroll_height <= y_scroll_pos && !element_in_view;

    if(element_in_view || has_reached_bottom_of_page) {
        //Do something
    }
});

我认为你最好的选择是利用一个现有的库来做这件事:

http://imakewebthings.com/waypoints/

您可以向元素添加侦听器,这些侦听器将在元素到达视口顶部时触发:

$('#scroll-to').waypoint(function() {
 alert('you have scrolled to the h1!');
});

对于它在使用中的一个惊人的演示:

http://tympanus.net/codrops/2013/07/16/on-scroll-header-effects/

这个我已经试过了。它仅在您滚动 PAST 元素后触发。还有其他解决方案吗?
2021-03-25 13:15:39
此解决方案适用于获取建议,我已在生产中使用它。参考博客:liyao13.wordpress.com/2017/05/11/...
2021-04-05 13:15:39

Inview 库触发事件,适用于 jquery 1.8 及更高版本! https://github.com/protonet/jquery.inview

$('div').on('inview', function (event, visible) {
  if (visible == true) {
    // element is now visible in the viewport
  } else {
    // element has gone out of viewport
  }
});

阅读此https://remysharp.com/2009/01/26/element-in-view-event-plugin

滚动成功后仅触发滚动一次

注意:成功滚动是指当用户滚动到所需元素时,或者换句话说,当所需元素在视图中时

接受的答案对我来说有 90% 的效果,所以我不得不稍微调整一下以实际只触发一次。

$(window).on('scroll',function() {
    var hT = $('#comment-box-section').offset().top,
    hH = $('#comment-box-section').outerHeight(),
    wH = $(window).height(),
    wS = $(this).scrollTop();
    if (wS > ((hT+hH-wH)-500)){
        console.log('comment box section arrived! eh');
        // This detaches the scroll so doStuff() won't run more than once
        $(window).off('scroll');
        doStuff();
    }
});