发文日期:2013年6月30日:

<div class="content" data-id="XX"></div>
<div class="media" data-id="XX"></div>
<div class="content" data-id="XY"></div>
<div class="media" data-id="XY"></div>
etc.

JQuery:

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

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

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

        $(window).on('resize scroll', function() {

            dataid = $('.sticky-slider-content').data('id');
            
            if ($(dataid).isInViewport()) {
                $('.media').removeClass('active');
                $('.media[data-id="'+dataid+'"]').addClass('active');
            }
        });

这位媒体人士开始变得粘人.当内容进入视区时,我想给具有相同data-id的媒体一个‘活动’类.

最初我想出了这个,但我想避免重复:

        $(window).on('resize scroll', function() {  
            if ($('.content[data-id="3a241cb2"]').isInViewport()) {
                $('.media').removeClass('active');
                $('.media[data-id="3a241cb2"]').addClass('active');
            }
            if ($('.content[data-id="6a91e7bb"]').isInViewport()) {
                $('.media').removeClass('active');
                $('.media[data-id="6a91e7bb"]').addClass('active');
            }
        });

推荐答案

我将坚持确定active'sdata-id的值并查询相关的.media元素,并使用JAVASCRIPT的IntersectionObserver API(与this related answer中一样)来检测元素何时进入或退出视区

const inViewport = (entries, observer) => {
  entries.forEach(entry => {
    // (This example is a proof of concept and might need optimization)
    const dataId = entry.target.dataset.id;  // i.e: "3a241cb2"
    const elsMedia = document.querySelectorAll(`[data-id="${dataId }"]`);
    elMedia.classList.toggle("active", entry.isIntersecting);
  });
};

const Obs = new IntersectionObserver(inViewport);
const obsOptions = {}; //See: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options

// Attach observer to every [data-inviewport] element:
document.querySelectorAll('.content[data-id]').forEach(el => {
  Obs.observe(el, obsOptions);
});

Using jQuery,
and using the inViewport micro jQuery plugin which provides a callback to the designated elements collection with an argument px being the integer value of the visible height of each intersecting (in-viewport) element:

/**
 * inViewport jQuery plugin by Roko C.B.
 * http://stackoverflow.com/a/26831113/383904
 * Returns a callback function with an argument holding
 * the current amount of px an element is visible in viewport
 * (The min returned value is 0 (element outside of viewport)
 */
;(function($, win) {
  $.fn.inViewport = function(cb) {
     return this.each(function(i,el) {
       function visPx(){
         var elH = $(el).outerHeight(),
             H = $(win).height(),
             r = el.getBoundingClientRect(), t=r.top, b=r.bottom;
         return cb.call(el, Math.max(0, t>0? Math.min(elH, H-t) : Math.min(b, H)));  
       }
       visPx();
       $(win).on("resize scroll", visPx);
     });
  };
}(jQuery, window));


// Use like:
$(".content[data-id]").inViewport(function(px) {
  // `px` represents the amount of visible height
  if (px > 0) {
    // Is in viewport logic goes here
    const dataId = $(this).data("id");   // i.e: "3a241cb2"
    $(".media").removeClass("active");
    $(`.media[data-id="${dataId}"]`).addClass("active");
  } else {
    // Not in viewport logic goes here
  }
});

Jquery相关问答推荐

TinyMCE不保存区块报价

点击和touch 事件之间的jQuery冲突解决方法

在 jQuery 中构建 html 元素的最清晰方法

JQuery/Javascript:判断 var 是否存在

jQuery - 获取 ajax POST 的表单值

在 `click` 和 `enter` 上触发事件

用按钮切换显示/隐藏div?

SCRIPT7002:XMLHttpRequest:网络错误 0x2ef3,由于错误 00002ef3 无法完成操作

JSON 服务在失败/错误时应该返回什么

jQuery JSON到字符串?

如何正确卸载/销毁 VIDEO 元素

如何同时使用 requireJS 和 jQuery?

在不使用提交按钮的情况下触发标准 HTML5 验证(表单)?

使用 jQuery Select 最后 5 个元素

获取没有在css中设置高度的div的高度

如何在页面加载时启动 jQuery Fancybox?

使用 Jquery 查找父 div 的 id

Jquery Select 所有具有 $jquery.data() 的元素

如何在没有鼠标事件的情况下在 jQuery 中获取鼠标位置?

如何使用 jQuery 处理复选框的更改?