【问题标题】:trigger on scroll past DOM element在滚动过去的 DOM 元素时触发
【发布时间】:2016-09-21 18:37:37
【问题描述】:

我试图在用户滚动到各种 DOM 元素时触发操作(我需要它来响应各种屏幕尺寸)。我首先使用offset().top 获取各个元素的位置,然后使用scrollTop() 计算滚动的位置。它有点工作,但动作在 DOM 元素开始之后触发得太远了。我已删除所有填充和边距...

var hT = $('#bioAG').offset().top;
var hT2 = $('#bioTM').offset().top;
var hT3 = $('#contact').offset().top;

$(window).scroll(function () {
  var ws = $(window).scrollTop()          
  if (ws > hT) {
    $("#bioAG").addClass("fade-in");
      } else if (ws > hT2){
       $("#bioTM").addClass("fade-in");
         } else if (ws > hT3)  {
           $("#contact").addClass("fade-in");
             } else {console.log('none');};

}) `

【问题讨论】:

  • 在逻辑上滚动(每隔一段时间)你应该重新计算你的变量......
  • 我想我很难理解为什么如果不调整视口大小会出现这种情况。如果第一次调用页面时 DOM 元素已经存在,为什么它们的位置会改变?
  • 原因:1:滚动页面,2:调整窗口大小,3:滚动和 JS 现在搞砸了(嗯......除非你的元素总是在固定的 NNpx 高度 - 我猜测的可能性较小。)
  • 没错,当我查看它们的页面长度时,它们确实发生了一些变化。我在第一个 DOM 元素上仍然存在原始问题,但感谢您指出这一点,我相信这将是一个更进一步的问题。

标签: javascript jquery vertical-scrolling


【解决方案1】:

在滚动(加载和调整大小)时,计算每个 data-fadein 元素的 .top 位置。
filter() 然后返回顶部位置小于窗口高度的元素 - 并添加所需的元素类。

var $ele = $("[data-fadein]"),
    $win = $(window);

function fadeInEl() {

  var h = $win.height();

  $ele.filter(function() {
    return this.getBoundingClientRect().top < h;
  }).addClass("fade-in");

}


// Call the above function on:
$win.on("load resize scroll", fadeInEl);
*{box-sizing:border-box;}
html,body{height:100%;margin:0;}


[data-fadein] {
  height:100vh;
  opacity:0;
  transition: 2s;
}
.fade-in {
  opacity:1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div data-fadein id="bioAG"   style="background:#0af">ag</div>
<div data-fadein id="bioTM"   style="background:#f0a">tm</div>
<div data-fadein id="contact" style="background:#0fa">contact</div>

https://developer.mozilla.org/en/docs/Web/API/Element/getBoundingClientRect

【讨论】:

  • 感谢漂亮的代码。它一直到移动断点都运行良好,我认为 100vh 和我的 div 的不同文本长度是主要障碍(我打算尝试使我的所有 div 文本更加统一)。不过,这段代码确实让我走上了更好的轨道,而且我学到了一些新东西。
  • @eabates div 的大小最好是 100vh,但它可以更高,这并不重要。 - 我现在看到一个关于高度的问题......将在一分钟内编辑
  • 好的,我会尝试通过媒体查询调整 100vh,谢谢。
  • @eabates 编辑了我的答案。现在身高真的不重要了。您可以让内容决定元素高度...
  • hm,我需要在过滤器上的addClass 之前添加last(否则我没有淡入)。我认为 130vh 将适用于移动设备,现在我只是想知道如何使用数据属性进行媒体查询......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2011-08-24
相关资源
最近更新 更多