调整 scrollTop 以适应不同的分辨率

Adapt scrollTop to work with different resolutions

这是我在滚动时用来制作 2 个 div "unwrap" 的方法:

CSS

.entry { 
    height: 40px;    
}
.entry.expanded { 
    height:600px;        
}

JavaScript

 $($('.entry').get(0)).addClass('expanded');
 $(window).on('scroll', function (e) {
     var x = $(window).scrollTop();
     if (x > 820) {
         $($('.entry').get(1)).addClass('expanded');
     }
     if (x > 1525) {
         $($('.entry').get(2)).addClass('expanded');
     }
 });

它在我的 1920x1080p 屏幕上工作得很好,但在朋友的 1920x1200px 上却不行,因为没有 820px 可以滚动..

我怎样才能解决这个问题以适用于所有分辨率?我尝试过这个,但不幸的是没有任何反应:

 $($('.entry').get(0)).addClass('expanded');
 $(window).on('scroll', function (e) {
 var availableScroll = $(document).height() - $window.height();
     var x = $(window).scrollTop();
     if (x > 820 || x  == availableScroll) {
         $($('.entry').get(1)).addClass('expanded');
     }
     if (x > 1525 || x  == availableScroll) {
         $($('.entry').get(2)).addClass('expanded');
     }
 });

是否有一种奇特的方法,可以计算底部的像素或一些相对于垂直分辨率的方法?

Here 是带有代码的网页(滚动时可以看到 2 个 div 展开)。

您之前的功能似乎运行良好。我正在将它作为 MacBook Pro 进行测试。但是,有时它似乎不会在 JQuery 时被触发。您可以做的是等待几毫秒来检查滚动是否完成。如果滚动完成,那么你可以简单地检查滚动的值。

选项 1:

jQuery debounce is a nice one for problems like this. jsFidlle

所以你修改后的代码将是(你需要使用debounce)

$(window).scroll($.debounce( 250, true, function(){
    console.log("Still scrolling");
}));
$(window).scroll($.debounce( 250, function(){
     var x = $(window).scrollTop();
     console.log("Scrolling finished");
     if (x > 820) {
         $($('.entry').get(1)).addClass('expanded');
     }
     if (x > 1525) {
         $($('.entry').get(2)).addClass('expanded');
     }
}));

选项 2:

您可能不喜欢使用 JQuery Debounce 然后您可以使用带有定时器功能的本机方法。请参阅下面的代码,您可以根据需要调整定时器持续时间。

它只是在等待滚动事件完成,并等待一定毫秒后滚动事件被召回。如果滚动重新触发,那么它只是清除计时器并再次开始等待。如果计时器完成,则它会执行您指定的方法。

$(window).scroll(function() {

    var timerDuration = 250; // In milliseconds
    clearTimeout($.data(this, 'scrollTimer'));
    $.data(this, 'scrollTimer', setTimeout(function() {
        // do something
         var x = $(window).scrollTop();
     console.log("Scrolling finished");
     if (x > 820) {
         $($('.entry').get(1)).addClass('expanded');
     }
     if (x > 1525) {
         $($('.entry').get(2)).addClass('expanded');
     }
    }, timerDuration));
});

一般来说,避免使用 == 进行滚动,因为即使滚动偏离 .0001,它也会解析为 false。同时将 $window 替换为 $(window).

 $($('.entry').get(0)).addClass('expanded');
 $(window).on('scroll', function (e) {
 var availableScroll = $(document).height() - $(window).height();
     var x = $(window).scrollTop();
     if (x > 820 || Math.abs(x - availableScroll) < 10) {
         $($('.entry').get(1)).addClass('expanded');
     }
     if (x > 1525 || Math.abs(x - availableScroll) < 10) {
         $($('.entry').get(2)).addClass('expanded');
     }
 });

此外,如果您想在页面首次加载时执行代码,请使用 $(document).ready(handler) 模式。