Как изменить навигационное изображение, когда оно достигает разных элементов div при прокрутке

#javascript #html #jquery #css

#javascript #HTML #jquery #css

Вопрос:

У меня есть изображение в навигаторе (назовем его pic1), которое необходимо изменить на pic2, как только я дойду до верхней части раздела содержимого моей страницы, но когда я дойду до нижнего колонтитула, его нужно изменить обратно на рис. 1 и повторить, поэтому, если я прокручиваю содержимое страницы, оно снова перейдет на рис. 2 и т.д.

Я пытался сделать что-то вроде приведенного ниже, но не могу заставить это работать, как я могу заставить это работать?

 var scrollContent = $("#content").offset().top;
var scrollHero = $("#hero").offset().top;

var scrollPos = $(document).scrollTop();

if (scrollPos > scrollContent) {
    $(".image-test").css({
        "background-image": "url('')"
    });
}  else if(scrollPos < scrollContent) {
    $(".image-test").css({
        "background-image": "url('')"
    });
  

Вот моя ссылка на codepen

Ответ №1:

Есть несколько проблем с кодом jQyery, который вы пытаетесь использовать:

1. Вы проверяете положение прокрутки только при загрузке страницы — вам нужно постоянно проверять внутри события прокрутки:

 $(window).on('scroll', function( /* handler function */));
  

2. Вы пытаетесь изменить изображение с помощью CSS, но изображение не отображается с помощью CSS. Вместо этого вы можете изменить src img элемент следующим образом:

 $(".image-test img").attr("src", imgUrl);
  

3. Вы не проверяете нижнюю часть элемента содержимого страницы (где заменяющее изображение должно быть заменено обратно). Вы можете получить его следующим образом:

 var contentTop = $(".page-content").offset().top;
var contentBottom = contentTop   $(".page-content").outerHeight(true);
  

4. Вам нужно проверить, находится ли прокрутка между этими позициями:

 if ( ($(this).scrollTop() > contentTop) amp;amp; ($(this).scrollTop() < contentBottom)) 
  

Чтобы сделать это адаптивным (т. Е. Чтобы оно работало, если размер экрана изменяется после загрузки страницы, например, путем изменения размера окна), вам также необходимо включить его в обработчик событий прокрутки.

Полный код для функции

 // get the URL of the image so we can use it to swap back
defaultImgUrl =  $(".image-test img").attr("src");

// check the scroll position on the scroll event
$(window).on('scroll', function() {

  // get the top and bottom positions pf the page content
  var contentTop = $(".page-content").offset().top;
  var contentBottom = contentTop   $(".page-content").outerHeight(true);

  // check if the scroll position is within the page content 
  if (($(this).scrollTop() > contentTop) amp;amp; ($(this).scrollTop() < contentBottom)) {
    // change the image url
    $(".image-test img").attr("src", "https://lorempixel.com/output/nature-q-c-100-50-2.jpg");
  } else {
    $(".image-test img").attr("src", defaultImgUrl);
  }
  
});
  

Рабочий пример:

 // get the URL of the image so we can use it to swap back
defaultImgUrl = $(".image-test img").attr("src");

// check the scroll position on the scroll event
$(window).on('scroll', function() {

  // get the top and bottom positions pf the page content
  var contentTop = $(".page-content").offset().top;
  var contentBottom = contentTop   $(".page-content").outerHeight(true);

  // check if the scroll position is within the page content 
  if (($(this).scrollTop() > contentTop) amp;amp; ($(this).scrollTop() < contentBottom)) {
    // change the image url
    $(".image-test img").attr("src", "https://lorempixel.com/output/nature-q-c-100-50-2.jpg");
  } else {
    $(".image-test img").attr("src", defaultImgUrl);
  }

});  
 .section1,
.section2,
.page-content {
  height: 100vh;
}

.section1 {
  background-color: green;
  padding-top: 50px;
}

.section2 {
  background-color: red;
}

nav {
  height: 50px;
  background-color: grey;
  position: fixed;
  width: 100%;
  display: flex;
}

.image-test img {
  width: 100px;
  height: 50px;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav>
  <div class="image-test">
    <img src="https://lorempixel.com/output/nature-q-c-100-50-5.jpg" alt="">
  </div>
  <div>
    <p>Change me to a different picture once I reach the top of page content. Then change me back to the same picture as the one I had in the hero once I reach the footer.</p>
  </div>
</nav>
<div class="section1" id="hero">
  <h1>Hero</h1>
</div>
<div class="page-content">
  <h1>Page Content</h1>
</div>
<div class="section2">
  <h1>Footer</h1>
</div>  

Комментарии:

1. Спасибо, что вдались в подробности и объяснили решение, теперь будем учиться в следующий раз. Спасибо

2. @birdyoung Рад помочь! Если вы понимаете, что оно делает, то вам будет проще адаптироваться к вашему собственному коду или повторно использовать функцию в разных проектах 🙂