Как отображать отдельные li-элементы при прокрутке в зависимости от высоты окна

#javascript #jquery #css #scroll

#javascript #jquery #css #прокрутка

Вопрос:

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

Если мой видовой экран 2000px высокий, в первом li после .active должен быть добавлен класс « 500px «. Затем, после еще одного 500px прокрутки вниз, второй LI должен был применить класс « active «, а предыдущий LI должен был удалить класс и так далее.

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

Я знаю, что это возможно с помощью jquery и некоторых других (каждого), но я не знаю, как и с чего начать. Любая помощь очень ценится. 🙂

 .wrapper {
min-height: 2000px;
}
.header {
position: fixed;
width: 100%;
background: #eee;
right: 0;
left: 0;
top: 0;
}
ul {
position: relative;
list-style: none;
height: 35px;
margin: 0;
padding: 0;
}
li {
position: absolute;
visibility: hidden;
opacity: 0;
transition: all .2s ease;
transform: translateY(100%);
line-height: 35px;
margin: 0;
padding: 0 20px;
}
li.active {
transform: translateY(0);
opacity: 1;
visibility: visible;
}  
 <div class="wrapper">
  <div class="header">
    <ul class="list">
      <li>I wil lbe visible after a threshold of 500px</li>
      <li class="active">I should be visible when user has scrolled (pageheight - 500px / 4)</li>
      <li>I should be visible when user has scrolled (pageheight - 500px / 4) * 2 </li>
      <li>I should be visible when user has scrolled (pageheight - 500px / 4) * 3 </li>
    </ul>
  </div>
</div>  

Я создал этот небольшой пример, чтобы продемонстрировать разметку:
https://jsfiddle.net/a1hq5tg3/2 /

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

1. Вы забыли включить JS, который пытались использовать сами

2. Вы имеете в виду что-то вроде этого (см. демо): callmenick.com/post /…

3. @RoryMcCrossan Нет, мне нужен JS. Я понятия не имею, как это закодировать на самом деле 🙂

4. @Victor Да, но мне нужно, чтобы переключать имена классов на основе количества прокрутки, а не на divs, которые становятся видимыми при прокрутке. Так что не совсем то же самое 🙂

5. Можете ли вы использовать проценты? Если вы можете, это может сработать для вас: jsfiddle.net/wdwb3uh3/6

Ответ №1:

Вы можете использовать встроенное событие браузера для проверки текущей позиции прокрутки, чтобы обновить требуемый «li» на основе диапазона прокрутки

 window.onscroll = function(args) {
   console.log(document.body.scrollTop);

   if(document.body.scrollTop > 200 amp;amp; document.body.scrollTop < 300) {
      document.getElementsByClassName('active')[0].className.replace('active', '');
      document.getElementsByTagName('li')[next].className  = ' active';
   }
};
  

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

1. Спасибо за ваш ответ. Нет, это не делает то, что я хочу. Я хочу, чтобы он вычислял высоту страницы и отображал LI при прокрутке. (Я на самом деле не эксперт в js) : (

2. Почему бы и нет? Это событие срабатывает каждый раз, когда вы прокручиваете свой документ. Таким образом, вы можете выбирать диапазоны, когда элемент должен быть показан или скрыт. if (pos> 0 amp;amp; pos < 10) показать el1 еще, если (pos >= 10 amp;amp; pos <20) показать el2 еще, если …

3. Возможно, это просто мои навыки кодирования. Можете ли вы заставить это работать в моем примере jsfiddle? Я не очень разбираюсь в JS

4. Скрипка @VadimB мне нравится. Единственная проблема в том, что в OP сказано, что высота страницы не всегда будет 2000 пикселей — если вы объедините свой мой fiddle. Это должно сработать: jsfiddle.net/wdwb3uh3/9

Ответ №2:

Мой ответ в результате @VadimB и моих комментариев / ответов.

 $(window).on('scroll', function() {

  var windowSize = $(window).scrollTop(),
    documentSize = $(document).height() - $(window).height();

  $('li').removeClass('hello');

  if (windowSize < (documentSize) * 0.25) {
    $('li').removeClass('hello');
  } else if (windowSize < (documentSize) * 0.50) {
    $('li:nth-child(2)').addClass('hello');
  } else if (windowSize < (documentSize) * 0.75) {
    $('li:nth-child(3)').addClass('hello');
  } else if (windowSize > (documentSize) * 0.75) {
    $('li:nth-child(4)').addClass('hello');
  }

});
  

Скрипка:https://jsfiddle.net/randomobject/43sspmL5 /