向下滚动时淡入,向上滚动时淡出 - 基于窗口中的元素位置

2023-11-29

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

这是我发现的最接近的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) {...}。这可以确保该对象仅在opacity is 0。淡出也是如此。这可以防止淡入和淡出相互冲突,因为现在只有两者之一在一个对象上运行。
  • 我变了.animate() to .fadeTo()。它是 jQuery 专门用于不透明度的函数,编写起来要短得多,并且可能比 animate 更轻。
  • 我变了.position() to .offset()。这总是相对于主体进行计算,而位置是相对于父级进行计算。对于你的情况,我相信抵消是可行的方法。
  • 我变了$(window).height() to $(window).innerHeight()。根据我的经验,后者更可靠。
  • 在滚动处理程序之后,我在页面加载时调用该处理程序一次$(window).scroll();。现在您可以为页面上的所有所需对象提供.fade类以及在页面加载时不可见的对象将立即淡出。
  • 我删除了#container来自 HTML 和 CSS,因为(至少对于这个答案)这是没有必要的。 (我想也许你需要height:2000px因为你用过.position()代替.offset(),否则我不知道。当然,请随意将其留在您的代码中。)

UPDATE

如果您想要除以下以外的不透明度值0 and 1,使用以下代码:

$(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 子句中添加了一个阈值,请参阅解释 below.
  • 我为threshold并为min/max在函数的开始处。在函数的其余部分中,将引用这些变量。这样,如果您想再次更改这些值,只需在一处进行即可。
  • 我还添加了|| pageLoad到 if 子句。这是确保所有对象在页面加载时褪色到正确的不透明度所必需的。pageLoad是一个布尔值,当fade()被调用。
    我必须将淡入淡出代码放入额外的function fade() {...},以便能够发送pageLoad调用滚动处理程序时为布尔值。
    我没有看到任何其他方法可以做到这一点,如果其他人这样做,请发表评论。

解释:
代码中的原因你的小提琴不起作用,是因为实际的不透明度值总是与您设置的值略有偏差。所以如果你将不透明度设置为0.3,实际值(在本例中)是0.300000011920929。这只是你必须通过反复试验来学习的小错误之一。这就是为什么这个 if 子句不起作用的原因:if ($(this).css("opacity") == 0.3) {...}.

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

运营商现在更改为== to <= and >=.


更新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/)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向下滚动时淡入,向上滚动时淡出 - 基于窗口中的元素位置 的相关文章

随机推荐

  • 输入类型=文件和 Spring Boot 的 Angular 2 模板表单

    我有一个包含两个输入的表单 一种是文本类型 另一种是文件类型 我怎样才能将文件传递到后端Spring Boot 以及如何使用 postgresql 数据库存储或获取内容数据 预先感谢您的退货 HTML 文件
  • 使用 VBA 宏选择和复制 Outlook 电子邮件正文

    我是 Excel 中 VBA 宏的初学者 这是 Outlook 中的第一次尝试 但这是我正在尝试做的事情 在 Outlook 2010 中 将宏分配给按钮 按下该按钮时 获取活动电子邮件的整个正文 将正文 包括所有格式和 html 复制到剪
  • 为什么 shell 中 0 为 true,1 为 false?

    false echo 上面会输出1 这与我所知道的所有其他编程语言相矛盾 这其中有什么原因吗 Bash 是一种编程 脚本 语言 但它也是一个 shell 和一个用户界面 如果0是错误 那么程序只能出现一种错误 然而在 Bash 中 任何非零
  • 在数组过滤时响应更新,但在添加元素时不响应更新

    我正在尝试模拟一个能够添加和删除产品的表 但是该组件仅在删除组件时更新 但在添加新行时不会更新 我在用着useState 这是我的数组 const rowss createData 1 Zapatillas 2 200 createData
  • 正确地在图像上绘图

    我正在创建一个小型图像编辑器 现在我试图让用户有机会通过拖动鼠标在图像上绘图 就像 MS Paint 中的铅笔工具一样 我遇到了一些困难 因为当我移动光标太快时 应用程序无法绘制所有应该着色的像素 只有一小部分数字被正确着色 我尝试了两种解
  • 使用 jQuery Ajax 删除 mySQL 表行

    我正在尝试做到这一点 因此当我单击跨度图标时 它会将article id发送到我的php sql页面 该页面会删除我的文章 我使用jQuery Ajax发送id id在jQuery端发送正常 但之后http post 请求已完成 我的表行仍
  • 输入对于数组来说太大

    我有一个小问题 我只是想知道 include
  • Azure Web 应用程序从 AAD 身份验证注销

    我无法从以 Azure Active Directory 作为身份验证提供程序的简单 Azure Web 应用程序注销 用户使用显示的 AAD 登录页面登录站点here 但我正在努力找出如何注销用户 我尝试使用各种未记录的注销网址 例如 h
  • Visual Studio 不将 SVG 图像显示为背景

    我有一个带有 html 文件 Html 5 的 asp net 项目 我正在尝试使用 CSS 3 将 SVG 设置为我的 body 标签的背景 我的文件如下 在我的 Style css 中 当我双击并打开 html 文件时 我可以看到主体充
  • 如何编写一个捕获所有异常的“try”/“ except”块?

    我怎样才能写一个try except捕获所有异常的块 除了光秃秃的except 子句 正如其他人所说你不应该使用 你可以简单地抓住Exception import traceback import logging try whatever
  • 实现引用类型和非引用类型的特征会导致实现冲突

    我正在尝试创建一种特征 并为所有非引用类型提供一种实现 为所有引用类型提供另一种实现 这无法编译 trait Foo impl
  • 我应该如何在 ACL 中构建资源树?

    我想使用 PHP 和 Zend ACL 创建一个极其灵活的权限系统 我希望能够向特定类型的所有对象以及这些对象的实例分配权限 如果查询对象的特定实例并且资源树中不存在该实例 则可以使用 通用 对象的权限集 我的问题是 这需要嵌套 并且我无法
  • Internet Explorer z 索引错误?

    如何将一个元素重叠到 Internet Explorer 中相对定位的另一个元素上 Z index 不起作用 它总是出现在相对定位元素的后面 看起来我在开玩笑 但我不是 myLinkCssClass background url
  • Linux x86_64 上的 Cassandra 启动错误 1.2.6

    尝试从最新的稳定版本在 Linux 上安装 cassandra http cassandra apache org download 1 2 6 我已修改 cassndra yaml 以指向自定义目录而不是 var 因为我没有 var 的写
  • 构建 android studio 项目时运行 lint

    我希望在使用 android studio 构建项目时能够运行 lint 任务 以确保遵循 lint 规则 我尝试过使用任务依赖项 但没有成功 我的 TeamCity 构建服务器使用运行 lint 任务的构建任务 因此效果很好 然而 and
  • 从没有默认构造函数的虚拟基派生类

    我正在为我正在开发的 C 应用程序编写一个小的异常类层次结构 并且我无法间接派生std runtime error 这是与我迄今为止编写的代码类似的代码 class RuntimeException public virtual boost
  • 如何使用 Vite 构建多个包,类似于 Webpack 中的多编译器模式(多配置)

    我有一个应用程序 它有一个主 index html 和 main js 但也有外部脚本 库 从 main js 内部以编程方式注入到 index html 中 所有这些脚本 库 的构建方式都不同 因为它们需要不同的别名 插件 加载器和文件夹
  • 是否可以抓取 ASP.NET 页面?

    有没有办法抓取一些使用 doPostBack 作为事件调用的 ASP NET 页面 Example 第1页 aspx 包含 1 个重定向到 Page2 aspx 的 LinkBut ton LinkBut ton Click 事件的隐藏代码
  • 如何在使用 Binding.scala 将元素加载到 dom 后执行一些 init

    dom def chart show Var Boolean if show bind
  • 向下滚动时淡入,向上滚动时淡出 - 基于窗口中的元素位置

    我试图让一系列元素在窗口中完全可见时在向下滚动时淡入 如果我继续向下滚动 我不希望它们淡出 但如果我向上滚动 我确实希望它们淡出 这是我发现的最接近的jsfiddle http jsfiddle net tcloninger e5qaD d