使用基于垂直滚动的 jquery 添加/删除类?

IT技术 javascript jquery css
2021-01-20 12:44:14

所以基本上我想在用户向下滚动一点并添加另一个类以更改它的外观后从“标题”中删除该类。

试图找出最简单的方法来做到这一点,但我无法让它发挥作用。

$(window).scroll(function() {    
    var scroll = $(window).scrollTop();    
    if (scroll <= 500) {
        $(".clearheader").removeClass("clearHeader").addClass("darkHeader");
    }
}

CSS

.clearHeader{
    height: 200px; 
    background-color: rgba(107,107,107,0.66);
    position: fixed;
    top:200;
    width: 100%;   
}    

.darkHeader { height: 100px; }

.wrapper {
    height:2000px;
}

HTML

<header class="clearHeader">    </header>
<div class="wrapper">     </div>

我确定我在做一些非常基本的错误。

6个回答
$(window).scroll(function() {    
    var scroll = $(window).scrollTop();

     //>=, not <=
    if (scroll >= 500) {
        //clearHeader, not clearheader - caps H
        $(".clearHeader").addClass("darkHeader");
    }
}); //missing );

小提琴

此外,通过删除clearHeader类,您position:fixed;将从元素中删除以及通过$(".clearHeader")选择器重新选择它的能力我建议不要删除该类并在其上添加一个新的 CSS 类以用于样式目的。

如果您想在用户向上滚动时“重置”类添加:

$(window).scroll(function() {    
    var scroll = $(window).scrollTop();

    if (scroll >= 500) {
        $(".clearHeader").addClass("darkHeader");
    } else {
        $(".clearHeader").removeClass("darkHeader");
    }
});

小提琴

编辑:这是缓存标题选择器的版本 - 更好的性能,因为它不会在每次滚动时查询 DOM,并且您可以安全地删除/添加任何类到标题元素而不会丢失引用:

$(function() {
    //caches a jQuery object containing the header element
    var header = $(".clearHeader");
    $(window).scroll(function() {
        var scroll = $(window).scrollTop();

        if (scroll >= 500) {
            header.removeClass('clearHeader').addClass("darkHeader");
        } else {
            header.removeClass("darkHeader").addClass('clearHeader');
        }
    });
});

小提琴

谢谢,Fab,我的方法也有效,但这是一种愚蠢的方法吗?
2021-03-21 12:44:14
那是因为您从选择器中删除了该类。当我更新小提琴时,您可以轻松地缓存标题,秒。
2021-03-29 12:44:14
谢谢你的帮助,我想我会用你的。
2021-04-03 12:44:14
@andy 不,事实上我打算发布它。这是一种不存储任何不必要的变量而是在每次滚动页面时查询 DOM 的好方法。这是另一种替代方法:小提琴
2021-04-07 12:44:14
好吧,我可以将 position:fixed 添加到 darkHeader 类,无论如何这就是我的意图。现在的问题是,在用户向上滚动后,我无法将它们再次交换回来。
2021-04-12 12:44:14

如果您愿意,可以为其添加一些过渡效果:

http://jsbin.com/boreme/17/edit?html,css,js

.clearHeader {
  height:50px;
  background:lightblue;
  position:fixed;
  top:0;
  left:0;
  width:100%;

  -webkit-transition: background 2s; /* For Safari 3.1 to 6.0 */
  transition: background 2s;
}

.clearHeader.darkHeader {
 background:#000;
}

它的我的代码

jQuery(document).ready(function(e) {
    var WindowHeight = jQuery(window).height();

    var load_element = 0;

    //position of element
    var scroll_position = jQuery('.product-bottom').offset().top;

    var screen_height = jQuery(window).height();
    var activation_offset = 0;
    var max_scroll_height = jQuery('body').height() + screen_height;

    var scroll_activation_point = scroll_position - (screen_height * activation_offset);

    jQuery(window).on('scroll', function(e) {

        var y_scroll_pos = window.pageYOffset;
        var element_in_view = y_scroll_pos > scroll_activation_point;
        var has_reached_bottom_of_page = max_scroll_height <= y_scroll_pos && !element_in_view;

        if (element_in_view || has_reached_bottom_of_page) {
            jQuery('.product-bottom').addClass("change");
        } else {
            jQuery('.product-bottom').removeClass("change");
        }

    });

});

它的工作正常

这是在滚动期间处理类的纯 javascript 示例。

你可能会想掐死处理滚动事件,更使处理程序逻辑变得越来越复杂,在这种情况下throttlelodashLIB就派上用场了。

如果您正在做 spa,请记住,您需要在不需要时清除事件侦听器removeEventListener(例如,在onDestroy组件的生命周期钩子期间,例如destroyed()Vue,或者可能useEffect是 React 钩子的返回函数)。

const navbar = document.getElementById('navbar')

// OnScroll event handler
const onScroll = () => {

  // Get scroll value
  const scroll = document.documentElement.scrollTop

  // If scroll value is more than 0 - add class
  if (scroll > 0) {
    navbar.classList.add("scrolled");
  } else {
    navbar.classList.remove("scrolled")
  }
}

// Optional - throttling onScroll handler at 100ms with lodash
const throttledOnScroll = _.throttle(onScroll, 100, {})

// Use either onScroll or throttledOnScroll
window.addEventListener('scroll', onScroll)
#navbar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  width: 100%;
  height: 60px;
  background-color: #89d0f7;
  box-shadow: 0px 5px 0px rgba(0, 0, 0, 0);
  transition: box-shadow 500ms;
}

#navbar.scrolled {
  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.25);
}

#content {
  height: 3000px;
  margin-top: 60px;
}
<!-- Optional - lodash library, used for throttlin onScroll handler-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
<header id="navbar"></header>
<div id="content"></div>

这个值是有意的吗?if (scroll <= 500) { ...这意味着它发生在 0 到 500 之间,而不是 500 和更大。在原始帖子中,您说“在用户向下滚动一点之后”