草庐IT

javascript - 根据窗口中的元素位置,向下滚动时淡入,向上滚动时淡出

coder 2024-05-09 原文

我试图让一系列元素在窗口中完全可见时在向下滚动时逐渐淡入。如果我继续向下滚动,则不希望它们淡出,但如果我向上滚动,则希望它们淡出。

这是我找到的最接近的jsfiddle。
http://jsfiddle.net/tcloninger/e5qaD/

$(document).ready(function() {

/* Every time the window is scrolled ... */
$(window).scroll( function(){

    /* Check the location of each desired element */
    $('.hideme').each( function(i){

        var bottom_of_object = $(this).position().top + $(this).outerHeight();
        var bottom_of_window = $(window).scrollTop() + $(window).height();

        /* If the object is completely visible in the window, fade it it */
        if( bottom_of_window > bottom_of_object ){

            $(this).animate({'opacity':'1'},500);

        }    
    }); 
}); 
});

它确实满足我向下滚动所需的功能,但是如果我向上滚动经过它们,我也希望这些元素淡出。

我没有运气尝试过。
            if( bottom_of_window > bottom_of_object ){

                $(this).animate({'opacity':'1'},500);  

            } else {

               $(this).animate({'opacity':'0'},500); }

非常感谢您抽出宝贵的时间对此进行研究。

最佳答案

您的尝试不起作用的原因是,两个动画(淡入和淡出)相互影响。

在对象变得可见之前,它仍然是不可见的,因此可以运行淡出动画。然后,一秒钟之后,当该对象变为可见状态时,淡入动画将尝试运行,但淡出仍在运行。因此他们会互相对抗,您什么也看不到。

最终,该对象将(大多数时间)变为可见,但是需要一段时间。而且,如果您使用滚动条按钮上的箭头按钮向下滚动,则动画会完成一些工作,因为您将使用较大的增量进行滚动,从而创建较少的滚动事件。

足够的解释,解决方案(JS,CSS,HTML):

$(window).on("load",function() {
  $(window).scroll(function() {
    var windowBottom = $(this).scrollTop() + $(this).innerHeight();
    $(".fade").each(function() {
      /* Check the location of each desired element */
      var objectBottom = $(this).offset().top + $(this).outerHeight();
      
      /* If the element is completely within bounds of the window, fade it in */
      if (objectBottom < windowBottom) { //object comes into view (scrolling down)
        if ($(this).css("opacity")==0) {$(this).fadeTo(500,1);}
      } else { //object goes out of view (scrolling up)
        if ($(this).css("opacity")==1) {$(this).fadeTo(500,0);}
      }
    });
  }).scroll(); //invoke scroll-handler on page-load
});
.fade {
  margin: 50px;
  padding: 50px;
  background-color: lightgreen;
  opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<div>
  <div class="fade">Fade In 01</div>
  <div class="fade">Fade In 02</div>
  <div class="fade">Fade In 03</div>
  <div class="fade">Fade In 04</div>
  <div class="fade">Fade In 05</div>
  <div class="fade">Fade In 06</div>
  <div class="fade">Fade In 07</div>
  <div class="fade">Fade In 08</div>
  <div class="fade">Fade In 09</div>
  <div class="fade">Fade In 10</div>
</div>

( fiddle :http://jsfiddle.net/eLwex993/2/ )
  • 我将淡化代码行包装在if子句中:if ($(this).css("opacity")==0) {...}。这样可以确保仅当opacity0时才淡入对象。淡出也一样。而且这可以防止淡入和淡出相互影响,因为现在在一个对象上一次只有两个运行之一。
  • 我将.animate()更改为.fadeTo()。这是jQuery的不透明度专用功能,编写起来短得多,而且可能比动画更轻。
  • 我将.position()更改为.offset()。这总是相对于 body 进行计算,而位置相对于父对象进行计算。对于您的情况,我认为补偿是要走的路。
  • 我将$(window).height()更改为$(window).innerHeight()。根据我的经验,后者更可靠。
  • 在滚动处理程序之后,我立即在页面加载时使用$(window).scroll();调用该处理程序。现在,您可以为页面上的所有所需对象提供.fade类,并且在页面加载时不可见的对象将立即淡出。
  • 我从HTML和CSS中都删除了#container,因为(至少对于此答案而言)没有必要。 (我以为您可能需要height:2000px,因为您使用.position()而不是.offset(),否则我不知道。请随意将其保留在您的代码中。)


  • 更新

    如果要使用01以外的不透明度值,请使用以下代码:

    $(window).on("load",function() {
      function fade(pageLoad) {
        var windowBottom = $(window).scrollTop() + $(window).innerHeight();
        var min = 0.3;
        var max = 0.7;
        var threshold = 0.01;
        
        $(".fade").each(function() {
          /* Check the location of each desired element */
          var objectBottom = $(this).offset().top + $(this).outerHeight();
          
          /* If the element is completely within bounds of the window, fade it in */
          if (objectBottom < windowBottom) { //object comes into view (scrolling down)
            if ($(this).css("opacity")<=min+threshold || pageLoad) {$(this).fadeTo(500,max);}
          } else { //object goes out of view (scrolling up)
            if ($(this).css("opacity")>=max-threshold || pageLoad) {$(this).fadeTo(500,min);}
          }
        });
      } fade(true); //fade elements on page-load
      $(window).scroll(function(){fade(false);}); //fade elements on scroll
    });
    .fade {
      margin: 50px;
      padding: 50px;
      background-color: lightgreen;
      opacity: 1;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    
    <div>
      <div class="fade">Fade In 01</div>
      <div class="fade">Fade In 02</div>
      <div class="fade">Fade In 03</div>
      <div class="fade">Fade In 04</div>
      <div class="fade">Fade In 05</div>
      <div class="fade">Fade In 06</div>
      <div class="fade">Fade In 07</div>
      <div class="fade">Fade In 08</div>
      <div class="fade">Fade In 09</div>
      <div class="fade">Fade In 10</div>
    </div>

    ( fiddle :http://jsfiddle.net/eLwex993/3/)
  • 我为if子句添加了一个阈值,请参见下面的说明
  • 我在函数开始时为thresholdmin/max创建了变量。在该函数的其余部分中,将引用这些变量。这样,如果您想再次更改值,则只需在一个地方进行。
  • 我还为if-clause添加了|| pageLoad。这是确保页面加载时所有对象褪色到正确不透明度所必需的。 pageLoad是一个 bool 值,在调用fade()时作为参数发送。
    我必须将淡入淡出代码放在额外的function fade() {...}中,以便在调用滚动处理程序时能够沿着pageLoad bool 值发送。
    我没有看到其他方法可以执行此操作,如果还有其他方法,请发表评论。

  • 说明:
    your fiddle中的代码不起作用的原因是,由于实际的不透明度值始终与您将其设置为不透明值。因此,如果将不透明度设置为0.3,则实际值(在这种情况下)为0.300000011920929。那只是您必须不断学习和尝试的小错误之一。这就是为什么这个if子句不起作用的原因:if ($(this).css("opacity") == 0.3) {...}

    我添加了一个阈值,以考虑到这种差异:== 0.3变为<= 0.31
    (我将阈值设置为0.01,当然可以更改,只要实际的不透明度介于设置值和此阈值之间即可。)

    现在将运算符从==更改为<=>=

    更新2:

    如果要根据元素的可见百分比淡入淡出,请使用以下代码:

    $(window).on("load",function() {
      function fade(pageLoad) {
        var windowTop=$(window).scrollTop(), windowBottom=windowTop+$(window).innerHeight();
        var min=0.3, max=0.7, threshold=0.01;
        
        $(".fade").each(function() {
          /* Check the location of each desired element */
          var objectHeight=$(this).outerHeight(), objectTop=$(this).offset().top, objectBottom=$(this).offset().top+objectHeight;
          
          /* Fade element in/out based on its visible percentage */
          if (objectTop < windowTop) {
            if (objectBottom > windowTop) {$(this).fadeTo(0,min+((max-min)*((objectBottom-windowTop)/objectHeight)));}
            else if ($(this).css("opacity")>=min+threshold || pageLoad) {$(this).fadeTo(0,min);}
          } else if (objectBottom > windowBottom) {
            if (objectTop < windowBottom) {$(this).fadeTo(0,min+((max-min)*((windowBottom-objectTop)/objectHeight)));}
            else if ($(this).css("opacity")>=min+threshold || pageLoad) {$(this).fadeTo(0,min);}
          } else if ($(this).css("opacity")<=max-threshold || pageLoad) {$(this).fadeTo(0,max);}
        });
      } fade(true); //fade elements on page-load
      $(window).scroll(function(){fade(false);}); //fade elements on scroll
    });
    .fade {
      margin: 50px;
      padding: 50px;
      background-color: lightgreen;
      opacity: 1;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    
    <div>
      <div class="fade">Fade In 01</div>
      <div class="fade">Fade In 02</div>
      <div class="fade">Fade In 03</div>
      <div class="fade">Fade In 04</div>
      <div class="fade">Fade In 05</div>
      <div class="fade">Fade In 06</div>
      <div class="fade">Fade In 07</div>
      <div class="fade">Fade In 08</div>
      <div class="fade">Fade In 09</div>
      <div class="fade">Fade In 10</div>
    </div>

    ( fiddle :http://jsfiddle.net/eLwex993/5/)

    关于javascript - 根据窗口中的元素位置,向下滚动时淡入,向上滚动时淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694385/

    有关javascript - 根据窗口中的元素位置,向下滚动时淡入,向上滚动时淡出的更多相关文章

    1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

      当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

    2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

      我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

    3. ruby - 在哈希的键数组中追加元素 - 2

      查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

    4. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

      本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

    5. ruby - 正则表达式在哪个位置失败? - 2

      我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

    6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

      我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

    7. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

      我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

    8. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

      我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

    9. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

      在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

    10. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

      我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

    随机推荐