прокрутка окна - показывает div - функция для многих divs - чистый JS - PullRequest
0 голосов
/ 13 марта 2019

Я нахожусь на стадии изучения javascript, и у меня есть проблема.

Я написал код, добавив класс в div и показав его после прокрутки до определенного раздела. Мой код:

window.addEventListener('scroll', function() {
const picture2 = document.querySelector('.box2-pic');
const section2 = document.querySelector('.box2');
const section2Top = section2.getBoundingClientRect().top;


const picture3 = document.querySelector('.box3-pic');
const section3 = document.querySelector('.box3');
const section3Top = section3.getBoundingClientRect().top;

if (window.pageYOffset >= section2Top) {
    picture2.classList.add('visible');
} 

if (window.pageYOffset >= section3Top) {
    picture3.classList.add('visible');
} 

});

Однако, что если я хотел бы собрать все такие элементы и добавить их в одну функцию? В каждом разделе есть один div, и я хочу добавить показ анимации после прокрутки.

На данный момент каждый раздел и раздел загружается отдельно. Я получил все div и разделил их на querySelectoAll , и я делаю что-то вроде этого:

const pictures = document.getElementsByClassName('.allPics'); 
const sections = document.getElementsByClassName('section'); 

window.addEventListener('scroll', function() {
   for (let i = 0; i < sections.length; i++) {
    if (window.pageYOffset >= sections[i].getBoundingClientRect().top) {
        pictures[i].classList.add('visible');
        }
    }})

однако, это не работает. Что я делаю неправильно?

Можно ли написать эту функцию в чистом JavaScript? Не могли бы вы помочь мне понять, как я должен это исправить? :)

1 Ответ

2 голосов
/ 13 марта 2019

Я думаю, что основная проблема с вашим кодом состоит в том, что pictures[i] может быть недоступен, так как i является итератором по длине секций, а не картин.

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

getElementsByClassName не позволяетforEach, но вы можете использовать querySelectorAll, что делает.Я использовал функции стрелок, которые во многом совпадают с обычными функциями, но с небольшой экономией места (различия важны, но здесь не важны)

Я не совсем уверен в том, что выПредставили, действительно ли приведенный ниже пример точно соответствует вашему желанию, но я считаю, что он должен показать пример того, что возможно и как этого можно достичь.

const pictures = document.querySelectorAll('.allPics');
const sections = document.querySelectorAll('.section');

window.addEventListener('scroll', function() {
  sections.forEach(section => {
    if (window.pageYOffset >= section.getBoundingClientRect().top) {
      const sectionPictures = section.querySelectorAll('.allPics');
      sectionPictures.forEach(picture => picture.classList.add('visible'));   
    }
  })
})
.section {
  border: solid 3px rgba(20, 20, 30, 0.6);
  margin-bottom: 200px;
}

img {
  display: block;
  height: 30vh;
  opacity: 0;
  transition: all 5s ease;
}

.visible {
  opacity: 1;
}
<div class="section">
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
</div>

<div class="section">
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
</div>

<div class="section">
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
</div>

<div class="section">
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
</div>

<div class="section">
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
  <img class="allPics" src="https://flif.info/example-images/fish.png" />
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...