【问题标题】:jQuery fade out elements as they scroll off page, fade back as they scroll back onjQuery 在页面滚动时淡出元素,在滚动回页面时淡出
【发布时间】:2013-04-09 05:45:17
【问题描述】:

我希望元素在滚动离开页面顶部时淡出,然后在滚动回页面时淡入。我写了一些有效的代码,但我正在寻找一个更优雅的解决方案。这是我在 jsfiddle 上的解决方案:http://jsfiddle.net/wmmead/JdbhV/3/

我想找到一段更短、更优雅的代码,但无法完全解决。也许有一个数组和 each() 方法?如果我在 div 上放置一个类而不是一个 ID,它会变得更短,但它们会立即消失。我希望每个框在滚动离开页面时淡出。

HTML

<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
<div id="box4"></div>
<div id="box5"></div>
<div id="box6"></div>

CSS

#box1, #box2, #box3, #box4, #box5, #box6 {
  width: 100px;
  height: 100px;
  background: orange;
  margin:100px auto;
}
#box6 {
  margin-bottom:600px;
}

jQuery

var box1Top = $('#box1').offset().top;
var box2Top = $('#box2').offset().top;
var box3Top = $('#box3').offset().top;
var box4Top = $('#box4').offset().top;
var box5Top = $('#box5').offset().top;
var box6Top = $('#box6').offset().top;

$(window).scroll(function () {
if ((box1Top - $(window).scrollTop()) < 20) {
    $('#box1').stop().fadeTo(100, 0);
} else {
    $('#box1').stop().fadeTo('fast', 1);
}

if ((box2Top - $(window).scrollTop()) < 20) {
    $('#box2').stop().fadeTo(100, 0);
} else {
    $('#box2').stop().fadeTo('fast', 1);
}

if ((box3Top - $(window).scrollTop()) < 20) {
    $('#box3').stop().fadeTo(100, 0);
} else {
    $('#box3').stop().fadeTo('fast', 1);
}

if ((box4Top - $(window).scrollTop()) < 20) {
    $('#box4').stop().fadeTo(100, 0);
} else {
    $('#box4').stop().fadeTo('fast', 1);
}

if ((box5Top - $(window).scrollTop()) < 20) {
    $('#box5').stop().fadeTo(100, 0);
} else {
    $('#box5').stop().fadeTo('fast', 1);
}
if ((box6Top - $(window).scrollTop()) < 20) {
    $('#box6').stop().fadeTo(100, 0);
} else {
    $('#box6').stop().fadeTo('fast', 1);
}
});

【问题讨论】:

    标签: jquery scroll fadein fadeout


    【解决方案1】:

    你可以使用属性选择器'[attr="someattr"]'和jQuery的.each()方法:

    $(window).scroll(function () {
       $('[id^="box"]').each(function () { // <---loop the divs id starts with #box 
          if (($(this).offset().top - $(window).scrollTop()) < 20) { //<---mark the $(this).offset().top of current object
              $(this).stop().fadeTo(100, 0); //<----fadeOut the current obj
          } else {
              $(this).stop().fadeTo('fast', 1); //<----fadeIn the current obj
          }
       });
    });
    

    您可以在这里进行演示:

    DEMO

    【讨论】:

    • 完美,我知道有更好的方法来做到这一点!谢谢!
    【解决方案2】:

    This version of your jsfiddle is considered better for several reasons:

    • 功能分解良好(分解为小功能):为您和其他编码人员提供更高的可读性,并且在您需要更改某些内容时更易于维护。
    • 灵活性:您可以更改框的数量,甚至不需要知道 javascript!
    • 效率:由于功能分解,这意味着每行代码只有在 100% 必要时才会被调用

    除了 javascript,除了现有的 id 之外,我还添加了类。例如:id="box1" class="box"

    享受:)

    【讨论】:

    • 非常令人印象深刻,但对我来说不值得这么复杂;-)
    【解决方案3】:

    好吧,我想只是为你所有的 div 设置一个类。而不是用#id调用每个人

    【讨论】:

    • 这将使它们全部淡出,只要一个点击窗口顶部。不是想要的效果。
    • 不是真的,如果你添加一个'for'循环来检查它们中的哪一个具有所需的位置
    猜你喜欢
    • 2012-03-15
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多