Изменение цвета шапки меню при прокрутке к блоку с таким же цветом

229
08 декабря 2021, 16:20

Есть страница с блоками разных цветов. Есть меню, по клику на пункт которого, происходит прокрутка к соответствующему блоку.

Как изменить цвет меню на цвет соответствующего блока при прокрутке с помощью JQuery?

В моем примере,меню не меняет цвет на темный,когда происходит прокрутка к секции с классом .black-bg .

Пример реализации на сайте.

Мой код:

(function($) { 
  $(document).ready(function() { 
    function lpHeader() { 
      if ($(window).scrollTop() == 0) { 
        $('header').addClass('top'); 
      } else { 
        $('header.top').removeClass('top'); 
      } 
    } 
 
    lpHeader(); 
 
    $(window).on('load scroll', lpHeader); 
 
    let lpNav = $('header ul'); 
 
    lpNav.find('li a').on('click', function(e) { 
      let trgtSelector = $(this).attr('href'); 
      linkTrgt = $(trgtSelector); 
      if (linkTrgt.length > 0) { 
        e.preventDefault(); 
        let offset = linkTrgt.offset().top, 
          correction = linkTrgt.attr('data-offset') || 44; 
        $('body, html').animate({ 
          scrollTop: offset - correction 
        }, 750); 
      } 
    }); 
 
    window.onscroll = function() { 
      let black = $('.black-bg'); 
      let red = $('.red-bg'); 
      let navMenu = $(window).scrollTop(); 
      if (navMenu === 0) { 
        $(".header").css({ 
          "background": "rgba(0, 0, 0, 0)" 
        }) 
      } else if (navMenu === black.offset().top) { 
        $(".header").css({ 
          "background": "#211f20" 
        }) 
      } else { 
        $(".header").css({ 
          "background": "rgba(255, 255, 255, 0.5)" 
        }) 
      } 
    } 
  }); 
});
header { 
  position: fixed; 
  top: 0; 
  left: 0; 
  width: 100%; 
  background: rgba(255, 255, 255, 0.5); 
  z-index: 100; 
} 
 
header ul { 
  margin: 0; 
  padding: 0; 
  text-align: right; 
} 
 
header ul li { 
  display: inline-block; 
} 
 
header ul li a { 
  display: inline-block; 
  padding: 10px; 
  font-size: 16px; 
  color: #211f20; 
  text-transform: uppercase; 
  transition: color .25s, padding .25s; 
} 
 
.black-bg { 
  background-color: #211f20; 
} 
 
.lp-content { 
  min-height: 500px; 
  padding: 40px 0; 
}
<header class="header"> 
  <div class="container"> 
    <ul> 
      <li><a href="#slideshow">Home</a></li> 
      <li><a href="#portfolio">Portfolio</a></li> 
      <li><a href="#about">About</a></li> 
    </ul> 
  </div> 
</header> 
 
<section id="slideshow" class="transp-bg"> 
  <div class="container1"> 
    <div class="lp-content"> 
      <div class="lp-slider1 owl-carousel"> 
        <img src="img/1.JPG" alt="Продукт 1"> 
        <img src="img/2.JPG" alt="Продукт 2"> 
        <img src="img/3.JPG" alt="Продукт 3"> 
      </div> 
    </div> 
  </div> 
</section> 
 
<section id="portfolio" class="section white-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
      <h2>Portfolio</h2> 
    </div> 
  </div> 
</section> 
 
<section id="portfolio" class="section black-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
    </div> 
  </div> 
</section> 
 
<section id="about" class="section red-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
      <h2>About</h2> 
    </div> 
  </div> 
</section> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Answer 1

$(window).scroll(function() { 
  var hT = $('#portfolio').offset().top, 
    hH = $('#portfolio').outerHeight(), 
    wH = $(window).height(), 
    wS = $(this).scrollTop(); 
  console.log((hT - wH), wS); 
  if (wS > (hT + hH - wH)) { 
    document.getElementById('header').style.background = "blue"; 
  } 
});
header { 
  position: fixed; 
  top: 0; 
  left: 0; 
  width: 100%; 
  background: rgba(255, 255, 255, 0.5); 
  z-index: 100; 
} 
 
header ul { 
  margin: 0; 
  padding: 0; 
  text-align: right; 
} 
 
header ul li { 
  display: inline-block; 
} 
 
header ul li a { 
  display: inline-block; 
  padding: 10px; 
  font-size: 16px; 
  color: #211f20; 
  text-transform: uppercase; 
  transition: color .25s, padding .25s; 
} 
 
.black-bg { 
  background-color: #211f20; 
} 
 
.lp-content { 
  min-height: 500px; 
  padding: 40px 0; 
}
<header id="header" class="header"> 
  <div class="container"> 
    <ul> 
      <li><a href="#slideshow">Home</a></li> 
      <li><a href="#portfolio">Portfolio</a></li> 
      <li><a href="#about">About</a></li> 
    </ul> 
  </div> 
</header> 
 
<section id="slideshow" class="transp-bg"> 
  <div class="container1"> 
    <div class="lp-content"> 
      <div class="lp-slider1 owl-carousel"> 
        <img src="img/1.JPG" alt="Продукт 1"> 
        <img src="img/2.JPG" alt="Продукт 2"> 
        <img src="img/3.JPG" alt="Продукт 3"> 
      </div> 
    </div> 
  </div> 
</section> 
 
<section id="portfolio" class="section white-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
      <h2>Portfolio</h2> 
    </div> 
  </div> 
</section> 
 
<section id="portfolio" class="section black-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
    </div> 
  </div> 
</section> 
 
<section id="about" class="section red-bg"> 
  <div class="container"> 
    <div class="lp-content"> 
      <h2>About</h2> 
    </div> 
  </div> 
</section> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

На скорую руку рабочий пример.

При прокрутке до портфолио блок изменит цвет на синий. Цвет можешь задать свой здесь:

document.getElementById('header').style.background = "blue";

Код можно доработать, чтобы блок возвращал свой цвет при прокрутке вверх, но думаю дальше сам разберешься.

READ ALSO
Упростить Promise Javascript

Упростить Promise Javascript

Есть код, он рабочийЯ новичок в промисах, можно ли как-то упростить его? Знаю, что сделал неправильно, второй промис можно как-то вынести отдельно

79
Перемножение ячеек таблицы JS

Перемножение ячеек таблицы JS

Как сделать так, что бы при перемножении ячеек таблицы 1 и таблицы 2, в таблицу 3 результат перемножения каждой ячейки выводился в ту же ячейку...

71
Как редактировать сообщение с помощью его id? Discord JS

Как редактировать сообщение с помощью его id? Discord JS

Почему у меня не редактирует сообщение?

169
DatePicker ReactNative

DatePicker ReactNative

Как мне оставить только месяц например, чтобы не отображались дни и годformat = "dddd" пробовал, ошибку выдает

147