【问题标题】:Bootstrap 4 nav bar first nav item not highlighted and scrollspy issueBootstrap 4导航栏第一个导航项目未突出显示和scrollspy问题
【发布时间】:2018-10-12 00:59:02
【问题描述】:

我遇到了一个问题,我不确定要解决它。我有一个启用了 scrollspy 的 bootstrap 4 导航栏,因此当您滚动浏览页面的不同部分时,导航栏会更新。

我还有一个 jquery 函数,它可以平滑滚动,这样当您单击导航链接时页面不会立即跳转。我有两个问题

我的网站:https://codepen.io/tidus198/pen/deWpvX3

  1. 问题是导航栏滚动间谍。默认情况下,该页面不会使我的第一个导航项处于活动状态。当您第一次访问该页面或一直滚动到页面顶部时,关于 导航项不会突出显示。如果您向下滚动一点,关于 链接会在导航栏中激活。发生这种情况是因为我修复了导航栏,使其与页面一起滚动。如何让它工作以使第一个导航项默认处于活动状态?

  2. 如果您单击其中一个导航项,它会滚动到该部分的标题(即显示内容而不是标题)。我通过使用 jquery 偏移函数(获取最大值并将其减去设定的数量)来解决此问题,以立即显示实际标题而不是内容。所以现在,当您点击例如 Contact 时,它实际上会滚动到 Contact 文本。但问题是,如果您单击联系人,导航栏会将投资组合显示为活动项目。我将如何解决这个问题? 偏移有效,但破坏了导航项。

任何帮助将不胜感激。

HTML:

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>My Portfolio</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <!-- Latest compiled and minified CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
        <link rel="stylesheet" href="css/site.css" type="text/css" />    
    </head>

    <body id = "body">
    <header id="test">
      <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top" >
          <a class="navbar-brand" href="#"><img id="navpic" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Profile Picture" ></a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav nav-pills ml-auto" id="homenav">
                <li class="nav-item">
                  <a class="nav-link" href="#test">About <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#portfolio">Portfolio</a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#contact">Contact</a>
                </li>
              </ul>
          </div>
        </nav>


          <section class="container">

            <div class="jumbotron text-center">
              <div class="row">
                <div class="col-12 col-md-4">
                  <img id="mypic" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Profile Picture" class="img-thumbnail">
                </div>
                <div class="col-12 col-md-8">
                  <h1 class="display-5">Your Name Here</h1>
                  <p class="lead">Front-End Developer and UX/UI designer, with practical experience in project management, branding strategy, and
                    creative direction; devoted to functional programming and information architecture.</p>
                  <hr class="my-4">
                  <p class="small">Web Developer - User Experience Designer - Graphic Artist</p>

                </div>

              </div>

            </div>
          </section>
        </header>

        <main>
          <section id="content-container" class="container">
            <div class="row" id="portfolio">
              <div class="col-12">
                <h2 class="display-5 text-center text-white text-uppercase mb-3">Portfolio</h2>
              </div>
            </div>

            <div class="row">

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image One
                  </div>
                </div>
              </div>

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">

                  <div class="card-footer text-center">Image Two</div>
                </div>
              </div>

            </div>

            <div class="row">

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image Three
                  </div>
                </div>
              </div>

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">

                  <div class="card-footer text-center">Image Four</div>
                </div>
              </div>

            </div>

            <div class="row">

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image Five
                  </div>
                </div>
              </div>

              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">

                  <div class="card-footer text-center">Image Six</div>
                </div>
              </div>

            </div>

          </section>
        </main>

        <footer>
          <section class="container">
            <div class="jumbotron mt-2">

              <div class="row">
                <div class="col-12">
                  <h2 class="display-4 text-center pb-2" id="contact">Contact Me</h2>
                </div>
              </div>

              <div class="row">
                <div class="col-12 col-md-8">
                  <form>
                    <div class="form-group">
                      <label for="name">Name</label>
                      <input type="text" class="form-control" id="name" placeholder="Name" required>
                    </div>
                    <div class="form-group">
                      <label for="emailaddr">Email</label>
                      <input type="email" class="form-control" id="emailaddr" placeholder="name@example.com" required>
                    </div>
                    <div class="form-group">
                      <label for="phone">Phone</label>
                      <input type="number" class="form-control" id="phone" placeholder="123-456-7890">
                    </div>
                    <div class="form-group">
                      <label for="textarea">Message</label>
                      <textarea class="form-control" id="textarea" rows="3"></textarea>
                    </div>
                  </form>

                </div>
                <div class="col-12 col-md-4">
                  <p class="lead">Feel free to contact me if you have any additional questions on my portfolio. You can either email me directly
                    at
                    <a href="mailto:myemail@myemail.com?subject=Porfolio Question">
                      myemail@myemail.com</a> or fill out the contact form.
                  </p>

                </div>

              </div>

            </div>

          </section>
        </footer>

      </div>
      <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
      <script src="js/app.js" type="text/javascript"></script>

    </body>
</html>

CSS:

blockquote {
  border-left: none;
}

#body {
    background-color: #464646;
    padding-top: 65px; 
    position: relative;
}

#mypic {
  width: 200px;
  height: 200px;
  border-radius: 50%;
}

#navpic {
  width: 40px;
  height: 40px;

}

.jumbotron #contact {
  margin-top: -50px;
}

form label {
  font-weight: bold;
}

#homenav > li > a:hover{
    background-color:grey;
    box-shadow: 0px 2px 2px 1px rgba(0, 0, 0, 0.1);
  } 

#about{
  position: relative;
  top: 1px;
}

JS:

$(document).ready(function (){
    $('body').scrollspy({ target: '.navbar' });

    $('.nav-link').on('click', function(){
        var clickedItem = $(this).attr('href');
       $('html, body').animate({
            scrollTop: $(clickedItem).offset().top - 80
       }, 1500);
    });

});

【问题讨论】:

    标签: javascript jquery html css twitter-bootstrap


    【解决方案1】:

    一些小的调整,它看起来对我来说是正确的。在这里查看我的叉子:https://codepen.io/mdlanglais/pen/OZmWNV

    HTML

    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>My Portfolio</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    
        <!-- Latest compiled and minified CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
        <link rel="stylesheet" href="css/site.css" type="text/css" />    
    </head>
    
    <body id = "body" data-spy="scroll" data-target="#navbarNav">
    <header id="test">
      <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top" >
          <a class="navbar-brand" href="#"><img id="navpic" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Profile Picture" ></a>
          <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
          <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav nav-pills ml-auto" id="homenav">
                <li class="nav-item">
                  <a class="nav-link active" href="#test">About <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#portfolio">Portfolio</a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#contact">Contact</a>
                </li>
              </ul>
          </div>
        </nav>
    
    
          <section class="container">
    
            <div class="jumbotron text-center">
              <div class="row">
                <div class="col-12 col-md-4">
                  <img id="mypic" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Profile Picture" class="img-thumbnail">
                </div>
                <div class="col-12 col-md-8">
                  <h1 class="display-5">Your Name Here</h1>
                  <p class="lead">Front-End Developer and UX/UI designer, with practical experience in project management, branding strategy, and
                    creative direction; devoted to functional programming and information architecture.</p>
                  <hr class="my-4">
                  <p class="small">Web Developer - User Experience Designer - Graphic Artist</p>
    
                </div>
    
              </div>
    
            </div>
          </section>
        </header>
    
        <main>
          <section id="content-container" class="container">
            <div class="row" id="portfolio">
              <div class="col-12">
                <h2 class="display-5 text-center text-white text-uppercase mb-3">Portfolio</h2>
              </div>
            </div>
    
            <div class="row">
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image One
                  </div>
                </div>
              </div>
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
    
                  <div class="card-footer text-center">Image Two</div>
                </div>
              </div>
    
            </div>
    
            <div class="row">
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image Three
                  </div>
                </div>
              </div>
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
    
                  <div class="card-footer text-center">Image Four</div>
                </div>
              </div>
    
            </div>
    
            <div class="row">
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
                  <div class="card-footer text-center">
                    Image Five
                  </div>
                </div>
              </div>
    
              <div class="col-lg-6 d-flex align-items-stretch mb-4">
                <div class="card w-100">
                  <img class="card-img-top" src="https://www.noao.edu/image_gallery/images/d2/pelican_500.jpg" alt="Card image cap">
    
                  <div class="card-footer text-center">Image Six</div>
                </div>
              </div>
    
            </div>
    
          </section>
        </main>
    
        <footer>
          <section class="container">
            <div class="jumbotron mt-2">
    
              <div class="row">
                <div class="col-12">
                  <h2 class="display-4 text-center pb-2" id="contact">Contact Me</h2>
                </div>
              </div>
    
              <div class="row">
                <div class="col-12 col-md-8">
                  <form>
                    <div class="form-group">
                      <label for="name">Name</label>
                      <input type="text" class="form-control" id="name" placeholder="Name" required>
                    </div>
                    <div class="form-group">
                      <label for="emailaddr">Email</label>
                      <input type="email" class="form-control" id="emailaddr" placeholder="name@example.com" required>
                    </div>
                    <div class="form-group">
                      <label for="phone">Phone</label>
                      <input type="number" class="form-control" id="phone" placeholder="123-456-7890">
                    </div>
                    <div class="form-group">
                      <label for="textarea">Message</label>
                      <textarea class="form-control" id="textarea" rows="3"></textarea>
                    </div>
                  </form>
    
                </div>
                <div class="col-12 col-md-4">
                  <p class="lead">Feel free to contact me if you have any additional questions on my portfolio. You can either email me directly
                    at
                    <a href="mailto:myemail@myemail.com?subject=Porfolio Question">
                      myemail@myemail.com</a> or fill out the contact form.
                  </p>
    
                </div>
    
              </div>
    
            </div>
    
          </section>
        </footer>
    
      </div>
      <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
      <script src="js/app.js" type="text/javascript"></script>
    
    </body>
    

    CSS

    blockquote {
      border-left: none;
    }
    
    #body {
        background-color: #464646;
        padding-top: 0px; 
        position: relative;
    }
    
    #mypic {
      width: 200px;
      height: 200px;
      border-radius: 50%;
    }
    
    #navpic {
      width: 40px;
      height: 40px;
    
    }
    
    .jumbotron #contact {
      margin-top: -50px;
    }
    
    form label {
      font-weight: bold;
    }
    
    #homenav > li > a:hover{
        background-color:grey;
        box-shadow: 0px 2px 2px 1px rgba(0, 0, 0, 0.1);
      }
    
    #test {
      padding-top: 95px;
    }
    
    #about{
      position: relative;
      top: 1px;
    }
    

    JS

    $(document).ready(function (){
      $('body').scrollspy({ target: '.navbar' });
    
      $('.nav-link').on('click', function(){
        var clickedItem = $(this).attr('href');
        $('html, body').animate({
            scrollTop: $(clickedItem).offset().top
        }, 1500);
      });
    });
    

    基本上我将 About 链接设置为 .active 开头,从 js 中的 .top 中删除 -80,从 body 元素中删除 padding-top 并添加一些 padding-top 到 @987654330 @元素在css中。它可能可以通过相同想法的变体来完成。

    【讨论】:

    • 谢谢,没有意识到这是导致导航栏第一个链接出现问题的主体填充。移除主体填充实际上解决了第一个问题。至于从顶部删除 -80,确实可以解决它,但链接显示的是内容,而不是我滚动到的部分的标题。我想没有简单的方法可以解决这个问题。 .active 类解决什么目的?即使导航栏不存在,我也看到导航栏工作正常。
    • 原来如此!我的想法首先是,锁定关于在页面加载时不活动的问题,所以我用.active. 强制它在调整body 和#test 元素上的填充之后,它一定没有必要。在这一点上,它没有任何用途。如果 scrollspy 功能继续出现异常,我可能接下来会尝试在$('.nav-link').on('click', function() 等处清除所有按钮的颜色并将活动类添加到刚刚单击的按钮。
    • 如果我理解单击的按钮应该立即成为活动链接,而不仅仅是滚动动画到达锚定元素时。
    • 知道了。我认为这可能内置在 scrollspy 功能中,但不知道。我将尝试使用控制台注销单击项的类,看看是否是这种情况。感谢大家的帮助
    猜你喜欢
    • 2018-08-09
    • 2019-08-19
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2020-09-26
    • 2018-07-26
    • 2018-02-11
    相关资源
    最近更新 更多