прокрутка окна не работает с if else if

#javascript #html #jquery #css

#javascript #HTML #jquery #css

Вопрос:

Я использую scroll функцию, но код в моих else if блоках, похоже, не выполняется.

Я пытаюсь скрыть один div и показать другой, как только пользователь прокручивает определенную точку.

Вот мой код — что я делаю не так?

 var scrolTop = $('.content').offset().top;
var showOneHeight = $('.showOne').height();
var showTwoHeight2 = $('.showTwo').height();
var showThreeHeight3 = $('.showThree').height();
var showFourHeight4 = $('.showFour').height();
var offSetValue = scrolTop   (showOneHeight - 50);
var offSetValue2 = scrolTop   (showTwoHeight2 - 50);
var offSetValue3 = scrolTop   (showThreeHeight3 - 50);
var offSetValue4 = scrolTop   (showFourHeight4 - 50);
// alert(offSetValue3)
$(window).scroll(function() {
  var height = $(window).scrollTop();
  if (height > offSetValue) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeIn('slow');
  } else if (height > offSetValue2) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeIn('slow');
  } else if (height > offSetValue3) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeOut();
    $('.showFour').fadeIn();
  }
});  
 body {
  margin: 0px;
}

.contentArea {
  display: flex;
  height: 100vh;
}

.boxes {
  width: 50%;
}

.pinned {
  background: rgb(72, 91, 35);
}

h1 {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  margin: 0;
  padding: 20px;
  text-transform: capitalize;
  font-family: system-ui;
  color: #fff;
}

.content {
  position: relative;
}

.box {
  position: absolute;
  left: 0px;
  top: 50%;
  transform: translateY(-50%);
  display: none;
}

.showOne {
  display: block;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div style="height: 500px; background: violet;"></div>
<div style="height: 500px; background:yellowgreen;"></div>
<div class="contentArea">
  <div class="pinned boxes">
    <h1>i am pinned side</h1>
  </div>
  <div class="content boxes">
    <div class="box showOne">
      <strong>paragraph one</strong>
      <p>i am a paragraph. i have more text then a heading mostly too lines i have.</p>
    </div>
    <div class="box showTwo">
      <strong>paragraph two</strong>
      <p>i am a paragraph. i have more text then a heading mostly too lines i have.</p>
    </div>
    <div class="box showThree">
      <strong>paragraph three</strong>
      <p>i am a paragraph. i have more text then a heading mostly too lines i have.</p>
    </div>
    <div class="box showFour">
      <strong>paragraph three</strong>
      <p>i am a paragraph. i have more text then a heading mostly too lines i have.</p>
    </div>
  </div>
</div>
<div class="test" style="height: 500px; background: rgb(39, 96, 106);"></div>
<div style="height: 500px; background: rgb(46, 35, 46);"></div>  

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

1. нет, на самом деле мне нравится работать, но есть некоторые проблемы с else if

2. Кто-то исправил вашу ссылку на jQuery. Можете ли вы использовать больше слов, чтобы описать, что вам нужно сделать сейчас?

Ответ №1:

   if (height > offSetValue) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeIn('slow');
  } else if (height > offSetValue2) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeIn('slow');
  } else if (height > offSetValue3) {
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeOut();
    $('.showFour').fadeIn();
  }
  

Проблема заключается в других условиях if. Else if не выполняется, потому что первое условие всегда выполняется, когда второе и третье имеют значение true.

Вам нужно указать диапазон между высотами, которые действительно являются истинными:

 if ( (height > offSetValue) amp;amp; (height < offSetValue2)) {
     //exec
} 
else if ( (height > offSetValue2) amp;amp; (height < offSetValue3)) {
   //exec
}
else if (height > offSetValue3) {
  // exec
} 
  

Это решает проблемы с if / else if (Y)

Редактировать 1:

Попробуйте это для подтверждения:

 var scrolTop = $('.content').offset().top;
var showOneHeight = $('.showOne').height();
var showTwoHeight2 = $('.showTwo').height();
var showThreeHeight3 = $('.showThree').height();
var showFourHeight4 = $('.showFour').height();
var offSetValue = scrolTop   500;
var offSetValue2 = scrolTop   700; 
var offSetValue3 = scrolTop   900;
var offSetValue4 = scrolTop   1100;


$(window).scroll(function() {
  var height = $(window).scrollTop();

  if ( (height > offSetValue) amp;amp; (height < offSetValue2)) {
    console.log(1)
    $('.showOne').fadeOut();
    $('.showTwo').fadeIn('slow');
    $('.showThree').fadeOut();
    $('.showFour').fadeOut();
  } else if ( (height > offSetValue2) amp;amp; (height < offSetValue3)) { 
    console.log(2)
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeIn('slow');
    $('.showFour').fadeOut();
  } else if (height > offSetValue3) {
    console.log(3)
    $('.showOne').fadeOut();
    $('.showTwo').fadeOut();
    $('.showThree').fadeOut('slow');
  }
});
  

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

1. Вы пытались прокручивать курсор, а не колесо мыши? я думаю, что разрыв между полем меньше для запуска всего остального, если правильно. Я пробовал много раз, и теперь все работает нормально.

2. я попытался увеличить еще немного промежутка между триггерами, но все равно он не работает. не могли бы вы поместить код внутри оператора condition?

3. Я отредактировал ответ в качестве примера (Редактирование 1). В примере есть статические значения для запуска изменения, и вы можете увидеть в журнале консоли значения 1/2/3 при запуске else if.

4. большое вам спасибо, дорогая. это действительно мне очень помогло <3

5. Нет проблем, дорогой (Y) <3