【问题标题】:Longest element inside viewport视口内最长的元素
【发布时间】:2018-11-19 06:10:16
【问题描述】:

我正在尝试将“活动”类设置为页面上最可见的元素。使用此代码,我能够将页面上显示的元素设置为“活动”类。

我正在为我的无限滚动项目这样做。如果我可以为我的目标元素提供活动类,我可以更改社交媒体共享过程的页面 url 和标题。

    $.fn.isInViewport = function() {
  var elementTop = $(this).offset().top;
  var elementBottom = elementTop + $(this).outerHeight();

  var viewportTop = $(window).scrollTop();
  var viewportBottom = viewportTop + $(window).height();

  return elementBottom > viewportTop && elementTop < viewportBottom;
};

$(window).on('resize scroll', function() {
  $('article').each(function() {
    if ($(this).isInViewport()) {
      $(this).addClass('active');
    } else {
      $(this).removeClass('active');
    }
  });
});
<article>
    <h1>Title 1</h1>
    <p>Text...
    ..
    .</p>
</article>
<article>
    <h1>Title 2</h1>
    <p>Text2...
    ..
    .</p>
</article>
<article>
    <h1>Title 2</h1>
    <p>Text2...
    ..
    .</p>
</article>
   
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【问题讨论】:

  • 你认为什么是“最显眼的”?例如,可以有一篇长篇文章,其标题未显示在一篇完整显示但占用较少视口的短篇文章之上

标签: jquery css ajax


【解决方案1】:

不确定什么是最明显的,但您可以使用一个标志来指示是否找到了可见元素,重置所有元素并将活动类设置为您找到的第一个。

$.fn.isInViewport = function() {
  var elementTop = $(this).offset().top;
  var elementBottom = elementTop + $(this).outerHeight();

  var viewportTop = $(window).scrollTop();
  var viewportBottom = viewportTop + $(window).height();
  return elementBottom > viewportTop && elementTop < viewportBottom && elementTop > viewportTop;
};


$(window).on('load resize scroll', function() {
  var activeFound = false;
  $('article').each(function() {
    if (!activeFound) {
      if ($(this).isInViewport()) {
        $("article.active").removeClass("active");
        $(this).addClass('active');
        activeFound = true;
      }
    }
  });
});
.active {
  color: blue;
}
<article>
  <h1>Title 1</h1>
  <p>Text... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 1</h1>
  <p>Text... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 1</h1>
  <p>Text... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 1</h1>
  <p>Text... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>
<article>
  <h1>Title 2</h1>
  <p>Text2... .. .
  </p>
</article>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • $("*") 很昂贵,尤其是在滚动处理程序中可能比$("article.active").removeClass 更好
  • 我正在尝试使用此方法更改页面元设置和网址。否则当我在 facebook/twitter 等上分享一个页面时,它只需要第一篇文章的信息。
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2020-07-13
  • 2011-01-23
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多