代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

使用scroll spy更改导航栏背景类

  •  0
  • Razvan Zamfir  · 技术社区  · 6 年前

    我在bootstrap4中的一个网页上工作,它有浅色和深色背景的部分,还有一个固定的导航栏。导航栏是深色的(有css类 bg-dark 在黑暗中 一个。

    我已经在页面上添加了Bootstrap的scroll spy,但是什么 active 分类到navbar项,如下所示:

    .page-section {
      padding: 70px 10px
    }
    
    .page-section.bg-dark * {
      color: #fff;
    }
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    
    <body data-spy="scroll" data-target=".navbar" data-offset="15">
      <nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link" href="#section1">Section 1</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section2">Section 2</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section3">Section 3</a>
          </li>
        </ul>
      </nav>
    
      <div id="section1" class="container-fluid bg-light page-section">
        <h1>Section 1</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section2" class="container-fluid bg-dark page-section">
        <h1>Section 2</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section3" class="container-fluid bg-light page-section">
        <h1>Section 3</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
    </body>

    如何更改导航栏的 navbar-dark bg-dark navbar-light bg-light 当用户到达具有id的div时 section3 或者(甚至更好)与 bg-light ?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Joseph Marikle    6 年前

    data-spy . 这不管用。你必须把它加到 window 对象( https://stackoverflow.com/a/48694139/854246 ). 下面是一段代码片段:

    $(window).on('activate.bs.scrollspy', function (e,obj) {
        // spy changes to the last item at the end of the page,
        // so we want to avoid changing the class at this point.
        // Spy still works, but we want the class to be based on
        // whatever block was closest.
        // https://stackoverflow.com/a/40370876/854246
        if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
            return;
        }
    
        // Here we detect the targets class.  I'm just using bg-
        // light.  Not the most robust solution, but it can be
        // tweaked.
        var isBGLight = $(obj.relatedTarget).hasClass('bg-light');
        // note that navbar needs two classes to work.  If you
        // only set bg-light/bg-dark, the link text color doesn't
        // change.
        $('.navbar').toggleClass('navbar-dark bg-dark', isBGLight)
                    .toggleClass('navbar-light bg-light', !isBGLight);
    });
    .page-section {
      padding: 70px 10px
    }
    
    .page-section.bg-dark * {
      color: #fff;
    }
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    
    <body data-spy="scroll" data-target=".navbar" data-offset="15">
      <nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link" href="#section1">Section 1</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section2">Section 2</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section3">Section 3</a>
          </li>
        </ul>
      </nav>
    
      <div id="section1" class="container-fluid bg-light page-section">
        <h1>Section 1</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section2" class="container-fluid bg-dark page-section">
        <h1>Section 2</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section3" class="container-fluid bg-light page-section">
        <h1>Section 3</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
    </body>

    我想让它成为一个堆栈片段,但是当您在 显然它确实支持这一点。只是不喜欢你用 console.log

    https://jsfiddle.net/jmarikle/jzg7ok0v/

        2
  •  1
  •   Alexcertz    6 年前

    这里有一个测试与您需要的,但滚动1像素和开始后的一些状态的变化。对不起,我的英语不好。

    https://codepen.io/jhonycertz/pen/eQPbXy

    $(window).scroll(function() {
    
      var isScrolled = $(document).scrollTop() > 1;
        $('.menu').toggleClass('nav_white', isScrolled);
      
    $(window).on('activate.bs.scrollspy', function (e,obj) {
      if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
      	return;
      }
    	var Transparent = $(obj.relatedTarget).hasClass('nav_transparent');
      var White = $(obj.relatedTarget).hasClass('nav_white');
      var Blue = $(obj.relatedTarget).hasClass('nav_blue');
      $('.nav').toggleClass('nav_transparent', Transparent, !White, !Blue)
                  .toggleClass('nav_white', White, !Transparent, !Blue)
                  .toggleClass('nav_blue', Blue, !Transparent, !White);
    });
      });
    .page-section {
      padding: 70px 10px
    }
    .move{
      background-color:#000
    }
    .page-section.bg-dark * {
      color: #fff;
    }
    .transparent{
      background-color:green;
    }
    .nav_transparent{background-color:yellow;}
    .nav_white{background-color:grey;}
    .nav_blue{background-color:black;}
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    
    <body data-spy="scroll" data-target=".nav" data-offset="15">
      <nav class="menu nav navbar navbar-expand-sm nav_transparent fixed-top">
        <ul class="navbar-nav">
         <li class="nav-item ">
            <a class="nav-link" href="#section">Section 0</a>
          </li>
          <li class="nav-item d-none">
            <a class="nav-link" href="#section1">Section 1</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section2">Section 2</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section3">Section 3</a>
          </li>
           <li class="nav-item">
            <a class="nav-link" href="#section4">Section 4</a>
          </li>
        </ul>
      </nav>
      <div id="section" class="container-fluid bg-light page-section">
        <h1>Section 0</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section1" class="container-fluid bg-light page-section nav_transparent">
        <h1>Section 1</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section2" class="container-fluid bg-light page-section nav_blue">
        <h1>Section 2</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section3" class="nav_white container-fluid bg-dark page-section">
        <h1>Section 3</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section4" class="nav_blue container-fluid bg-light page-section">
        <h1>Section 4</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
    </body>
        3
  •  0
  •   Mohammad Ali Rony    6 年前

    对toggle类使用js代码

     $(window).on('activate.bs.scrollspy', function (e,obj) 
    {
       if(document.querySelector(obj.relatedTarget).classList.contains('bg-light'))
       {
          $('.navbar').removeClass("navbar-dark bg-dark");
          $('.navbar').addClass("bg-light navbar-light" );
       }
       else
       {
          $('.navbar').removeClass("bg-light navbar-light");
          $('.navbar').addClass( "navbar-dark bg-dark" );
       }
    });
    .page-section {
      padding: 70px 10px
    }
    
    .page-section.bg-dark * {
      color: #fff;
    }
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    
    <body data-spy="scroll" data-target=".navbar" data-offset="15">
      <nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link" href="#section1">Section 1</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section2">Section 2</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#section3">Section 3</a>
          </li>
        </ul>
      </nav>
    
      <div id="section1" class="container-fluid bg-light page-section">
        <h1>Section 1</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section2" class="container-fluid bg-dark page-section">
        <h1>Section 2</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
      <div id="section3" class="container-fluid bg-light page-section">
        <h1>Section 3</h1>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
        <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
      </div>
    </body>