使用 jQuery 航点滚动时跳转标题

Jumping header on scroll using jQuery Waypoints

本文关键字:标题 滚动 jQuery 使用      更新时间:2023-09-26

我在页面顶部固定了引导菜单,在视口底部有一个定位良好的滚动按钮.btn-naving在 #home-slide中)。在(任何)滚动上,我希望固定菜单将背景从透明更改为半灰色,并且滚动按钮也消失。从现在开始,该按钮应该会一直隐藏,但是当我滚动到顶部时,我需要菜单再次变得透明。

为此,我正在使用jQuery Waypoints。我已经使用以下代码实现了这两种效果,但是当我滚动时,菜单会跳转,EDIT:更具体地说,它会闪烁,就好像菜单不是一直处于固定位置一样。当我滚动时,有时看起来好像菜单随着页面滚动,然后突然跳回到固定位置。有时一段时间后开始正常工作。如果我删除以下两行代码,它不会跳转,但我需要为两个事件使用相同的触发器。

编辑2:如果我不在菜单中使用航点,它也不会闪烁。滚动流畅,菜单始终位于页面中所有其他元素的顶部。

 $("#home-slide .btn-navigate").removeClass("pulse animated");
 $("#home-slide .btn-navigate").addClass("fadeOutUp animated2");

.HTML:

<header id="masthead">
    <nav class="navbar navbar-fixed-top">
        <div class="container">
            MENU CONTENT
        </div>
    </nav>
</header>
<section id="home-slide">
    <div class="container">
        <h1 class="heading">HEADING</h1>
        <p class="font2">
            TEXT</p>    
        <a href="#" class="btn-navigate animated pulse">Scroll Button</a>
    </div>
</section>

j查询:

jQuery(document).ready(function ($) {
    $(function () {
        $("#masthead nav").waypoint(function () {
            $("#masthead nav").toggleClass('scrolling');
            $("#home-slide .btn-navigate").removeClass("pulse animated");
            $("#home-slide .btn-navigate").addClass("fadeOutUp animated2");
        }, { offset: '-20px' });        
    });
});

我的导航 CSS:

#masthead {
    nav {
        min-height: 120px;
        padding-top: 2.727rem;
        background: rgba(51,58,64,0.0);
        -webkit-transition: background-color 0.5s linear;
        .container {
            position: relative;
        }
        .navbar-nav {
            a {
                color: @lms-white;
                font-weight: bold;
                text-transform: none;
                text-shadow: 1px 1px 2px rgba(50, 50, 50, 1);
                padding: 7px 1.17rem;
                border: 2px solid transparent;
                .border-radius(5px);
                &:hover {
                    background: transparent;
                    border: 2px solid @lms-pink;
                }
            }
        }
        .navbar-brand {
            padding: 7px 15px;
        }
        &.scrolling {
            background: rgba(51,58,64,0.9);
            -webkit-transition: background-color 0.5s linear;
        }
    }

引导导航 CSS:

.navbar-fixed-top {
    top: 0;
    border-width: 0 0 1px;
}
.navbar-fixed-top, .navbar-fixed-bottom {
    position: fixed;
    right: 0;
    left: 0;
    z-index: 1030;
}
.navbar {
    position: relative;
    min-height: 50px;
    margin-bottom: 20px;
    border: 1px solid transparent;
}

知道如何解决这个问题吗?谢谢!

我已经找到了解决方案。闪烁不是由航点引起的。添加

-webkit-backface-visibility: hidden; /* Chrome, Safari, Opera */
backface-visibility: hidden;

导航解决了问题。

如调试指南中所述,使用固定位置元素作为航点可能会导致糟糕的时间。航点元素在文档中的位置(客户端offsetX/Y)决定了它的触发位置,固定位置元素的偏移量在您滚动时会不断变化。

看起来你已经有一个非常好的静态定位元素,你可以使用而不是那个nav#masthead本身。您可能还希望对代码进行一些更改,以查看用户在越过航点时滚动direction。我相信,如果用户向上滚动,您希望撤消其中一些动画状态。

$("#masthead").waypoint(function (direction) {
  $("#masthead nav").toggleClass('scrolling');
  if (direction === 'down') {
    $("#home-slide .btn-navigate").removeClass("pulse animated");
    $("#home-slide .btn-navigate").addClass("fadeOutUp animated2");
  }
  else {
    $("#home-slide .btn-navigate").addClass("pulse animated");
    $("#home-slide .btn-navigate").removeClass("fadeOutUp animated2");
  }
}, { offset: -20 });   

这可以使用 toggleClass 变体稍微减少一点,该变体将布尔值作为第二个参数,如果该布尔值true则切换将添加类,如果是false则删除类。

$("#masthead").waypoint(function (direction) {
  $("#masthead nav").toggleClass('scrolling', direction === 'down');
  $("#home-slide .btn-navigate")
    .toggleClass("pulse animated", direction === 'up')
    .toggleClass("fadeOutUp animated2", direction === 'down');
  }
}, { offset: -20 });