javascript - Bootstrap 4 sticky-top 更改导航栏颜色

标签 javascript jquery html css bootstrap-4

为了获得粘性导航栏,我使用了 Bootstrap 4 类 sticky-top。我更喜欢 css 解决方案而不是一些 JS,因为这在过去犯了一些错误。

我希望当用户到达时导航栏呈透明颜色。 (当我的导航栏变得粘稠时 - 就可以了)。在此之前它应该具有随机颜色。 (这是行不通的 - 灰色背景是从粘性顶部类的透明背景中出现的)。

我还没有找到一个好的解决方案来解决这个问题。我尝试通过 JS 添加一个新类,但没有成功。

Codepen example

/* Open tabs */
function openTab(evt, parameter) {
  var i, tabcontent, tablinks;
  tabcontent = document.getElementsByClassName("tabcontent");
  for (i = 0; i < tabcontent.length; i++) {
    tabcontent[i].style.display = "none";
  }
  tablinks = document.getElementsByClassName("tablinks");
  for (i = 0; i < tablinks.length; i++) {
    tablinks[i].className = tablinks[i].className.replace(" active", "");
  }
  document.getElementById(parameter).style.display = "block";
  evt.currentTarget.className += " active";
}
/* Open tabs END */
/* Smooth scroll */
//Only where the class smooth-scroll is, scrolling is enabled
$(document).ready(function () {
  $('a.smooth-scroll[href*="#"]:not([href="#three"])').click(function () {
    if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
      var target = $(this.hash);
      //Comment the following line if you don't want to see the anchor in the url
      //target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
      if (target.length) {
        $('html, body').animate({
          scrollTop: target.offset().top
        }, 1000);
        return false;
      }
    }
  });
});
/* Smooth scroll END */
/* Global */

* {
  margin: 0px;
  padding: 0px;
  font-family: Roboto,
}

.separator {
  height: 50px;
  background-color: black;
}

/* Global END */

/* Big Carousel */

.big-carousel .carousel-item {
  /* viewport height */
  height: 375px;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
}

.big-carousel .carousel-inner {
  height: 375px;
}

.big-carousel .carousel-caption {
  margin-bottom: 110px;
}

.big-carousel .carousel-caption a {
  border: none;
  background-color: rgba(255, 0, 77);
  color: white;
  padding: 20px;
  border-radius: 1px;
}

.big-carousel .carousel-caption a:hover {
  background: #EFFF00;
  text-decoration: none;
  color: black;
}

.big-carousel .carousel-indicators i {
  font-size: 40px;
  color: white;
  margin-bottom: 100px;
}

/* Big Carousel END */

/* Navigation */

.navbar {
  background-color: #020202;
  border-radius: 0;
  -webkit-transition: all 0.3s ease-out;
  -moz-transition: all 0.3s ease-out;
  -o-transition: all 0.3s ease-out;
  transition: all 0.3s ease-out;
  z-index: 1 !important;
}

.sticky-top {
  background-color: rgba(0, 0, 0, 0.8);
}

.navbar-brand {
  /*padding-left: 60px;*/
}

.navbar a {
  color: #b6b9c1 !important;
}

.nav-social {
  padding-right: 10px;
}

.nav-social i {
  color: white;
}

.navbar .hvr-underline-from-center::before {
  background: white;
  height: 2px;
}

.navbar-toggler {
  outline: none !important;
  box-shadow: none;
  border: none !important;
}

.navbar-toggler:focus,
.navbar-toggler:active {
  outline: none !important;
  box-shadow: none;
}

.cta-nav {
  margin-top: 8px;
  margin-bottom: 5px;
  margin-left: 25px;
}

.cta-nav a {
  background-color: rgba(255, 0, 77);
  color: white !important;
  padding: 10px;
  border-radius: 1px;
}

.cta-nav a:hover {
  background: #EFFF00;
  text-decoration: none;
  color: black !important;
}

@media (min-width: 1px) and (max-width: 576px) {
  .navbar-brand {
    padding-left: 7.5px;
  }
  .nav-social {
    margin-left: 14px;
  }
}

@media (min-width: 577px) and (max-width: 768px) {
  .navbar-brand {
    padding-left: 15px;
  }
  .nav-social {
    margin-left: 14px;
  }
}

@media (min-width: 769px) and (max-width: 992px) {
  .navbar-brand {
    padding-left: 25px;
  }
  .nav-social {
    padding-right: 20px;
  }
}

@media (min-width: 993px) and (max-width: 1200px) {
  .navbar-brand {
    padding-left: 50px;
  }
  .nav-social {
    padding-right: 30px;
  }
}

@media (min-width: 1201px) and (max-width: 9999px) {
  .navbar-brand {
    padding-left: 70px;
  }
  .nav-social {
    padding-right: 50px;
  }
}

/* Navigation END */

/* Tab content */

.tabcontent {
  display: none;
  color: black;
  padding-top: 40px;
  padding-bottom: 50px;
}

.tabcontent h1 {
  text-align: center;
  margin-bottom: 15px;
}

.tabcontent h2,
h3,
h4 {
  text-align: center;
}

.tabcontent a {
  text-decoration: none;
  color: #719DE3;
  padding-bottom: 2px;
}

.tabcontent p {
  color: #121212;
}

.tabcontent {
  -webkit-animation: fadeEffect 1s;
  animation: fadeEffect 1s;
  /* Fading effect takes 1 second */
}

@-webkit-keyframes fadeEffect {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes fadeEffect {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

/* Tab content END */

/* Start Section 1 */

.start-section {
  height: 100%;
  background: #DAD299;
  /* fallback for old browsers */
  background: -webkit-linear-gradient(to bottom, #B0DAB9, #DAD299);
  /* Chrome 10-25, Safari 5.1-6 */
  background: linear-gradient(to bottom, #B0DAB9, #DAD299);
  /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
  background-attachment: fixed;
}

/* XX1 */

/* XX1 END*/

/* XX2 */

/* XX2 */

/* XX3 */

/* XX3 END */

/* Start Section END */
<!DOCTYPE html>
<html>
<!-- Meta head -->

<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- CSS -->
  <link rel="stylesheet" type="text/css" href="css/all-css.css">
  <!-- JQuery first -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <!-- Bootstrap -->
  <link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
  <script src="js/popper.min.js"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<!-- Meta head END -->

<body id="top" onload="openTab(event, 't1');">
  <!-- Big Carousel -->
  <div class="big-carousel">
    <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
      <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
      </ol>
      <div class="carousel-inner" role="listbox">
        <!-- Slide One - Set the background image for this slide in the line below -->
        <div class="carousel-item active" style="background-image: url(images/MG_9185.jpg)">
          <div class="carousel-caption">
            <h3>Titel</h3>
            <p>Text</p>
            <br>
            <div class="hvr-pulse-grow cc-a d-md-none">
              <a href="">Tickets</a>
            </div>
          </div>
        </div>
        <!-- Slide Two - Set the background image for this slide in the line below -->
        <div class="carousel-item" style="background-image:">
          <div class="carousel-caption">
            <h3>Titel</h3>
            <p>Text</p>
            <br>
            <div class="hvr-pulse-grow cc-a d-md-none">
              <a href="">Tickets</a>
            </div>
          </div>
        </div>
        <!-- Slide Three - Set the background image for this slide in the line below -->
        <div class="carousel-item" style="background-image:">
          <div class="carousel-caption">
            <h3>Titel</h3>
            <p>Text</p>
            <br>
            <div class="hvr-pulse-grow cc-a d-md-none">
              <a href="">Tickets</a>
            </div>
          </div>
        </div>
      </div>
      <!-- Arrow left -->
      <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
          <span class="carousel-control-prev-icon" aria-hidden="true"></span>
          <span class="sr-only">Previous</span>
        </a>
      <!-- Arrow right -->
      <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
          <span class="carousel-control-next-icon" aria-hidden="true"></span>
          <span class="sr-only">Next</span>
        </a>
    </div>
  </div>
  <!-- Big Carousel END -->
    <!-- Navigation -->
  <div id="nav-anker"></div>
  <nav class="navbar navbar-dark navbar-expand-md sticky-top">
    <a href="/" class="navbar-brand"><img style="width: 45px;" src=""></a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsingNavbar2" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
    </button>
    <div class="navbar-collapse collapse" id="collapsingNavbar2">
      <ul class="navbar-nav mx-auto text-center">
        <li class="nav-item">
          <a style="cursor:pointer;" class="smooth-scroll nav-link" href="#nav-anker" onclick="openTab(event, 't1')"><span class="hvr-underline-from-center">Die Tour</span></a>
        </li>
        <li class="nav-item">
          <a style="cursor:pointer;" class="smooth-scroll nav-link" href="#nav-anker" onclick="openTab(event, 't2')"><span class="hvr-underline-from-center">Vorbereitung</span></a>
        </li>
        <li class="nav-item">
          <a style="cursor:pointer;" class="smooth-scroll nav-link" href="#nav-anker" onclick="openTab(event, 't3')"><span class="hvr-underline-from-center">Termine & Städte</span></a>
        </li>
        <li class="nav-item cta-nav d-none d-md-block hvr-pulse-grow">
          <a href="">Tickets</a>
        </li>
      </ul>
      <ul class="nav navbar-nav flex-row justify-content-center flex-nowrap nav-social">
        <li class="nav-item mr-3"><a class="nav-link text-white" href="" target="_blank"><i class="fa fa-facebook"></i></a> </li>
        <li class="nav-item mr-3"><a class="nav-link text-white" href="" target="_blank"><i class="fa fa-instagram"></i></a> </li>
        <li class="nav-item"><a class="nav-link text-whit" href="" target="_blank"><i class="fa fa-youtube"></i></a> </li>
      </ul>
    </div>
  </nav>
  <!-- Navigation -->

  <!-- Start Section -->
  <section class="start-section">
    <!-- XX1 -->
    <div id="t1" class="tabcontent">
      <div class="col-sm-8 offset-sm-2">
        <h1>Titel</h1>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
        <iframe style="margin-bottom:40px;" width="100%" height="600px" src="" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.</p>
      </div>
    </div>
    <!-- XX1 END -->
    <!-- XX2 -->
    <div id="t2" class="tabcontent">
      <div class="col-sm-8 offset-sm-2">
        <h1>Was du wissen musst</h1>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
        <iframe style="margin-bottom:40px;" width="100%" height="600px" src="" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.</p>
      </div>
    </div>
    <!-- XX2 END -->
    <!-- XX3 -->
    <div id="t3" class="tabcontent">
      <div class="col-sm-8 offset-sm-2">
        <h1>Wann</h1>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
        <iframe style="margin-bottom:40px;" width="100%" height="600px" src="" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.</p>
      </div>
    </div>
    <!-- XX3 END -->
  </section>
  <!-- Start Section END -->
</body>
</html>

最佳答案

原因explained here position:sticky (Bootstrap sticky-top) 不提供何时“卡住”的指示。

因此,需要使用JS有条件地改变Navbar的颜色/样式。 一种方法是使用 IntersectionObserver。您可以在 #nav-anker 上使用它,它是 sticky-top 导航栏之前的元素。

(new IntersectionObserver(function(e,o){
    if (e[0].intersectionRatio > 0){
        document.documentElement.removeAttribute('class');
    } else {
        document.documentElement.setAttribute('class','stuck');
    };
})).observe(document.querySelector('#nav-anker'));

因此,当导航栏变得粘滞时,stuck 类就会添加到其中。您可以让 CSS 样式在卡住...

时发生变化
/* style for when sticky is applied */
.stuck .sticky-top {
    background: #000;
}

演示:https://www.codeply.com/go/psiFbB6Ro6

关于javascript - Bootstrap 4 sticky-top 更改导航栏颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150005/

相关文章:

javascript - 即使表单验证失败,表单也会被提交

javascript - 如何确保 Angular 模块依赖关系得到解决?

javascript - jQuery - 元素闪烁

html - 样式化空文本区域高度

javascript - 查找包含 AutoCompleteExtender 的 UpdatePanel 的 ID

javascript - 我怎样才能找到 N 种颜色的平均值?

javascript - jQuery - 使用旋转 gif 阻止模式,没有 jQuery 阻止 UI

javascript - 如何在 jQuery 中触发父级事件而不是子级事件

jquery - 如果 <div> 位于容器 <div> 的底部,我如何使它向上生长?

html - 允许在表格上水平滚动,底部始终可见