【问题标题】:How to stop EventListener when height reached?达到高度时如何停止 EventListener?
【发布时间】:2022-11-02 04:24:14
【问题描述】:

你能告诉我当 #gallery 的高度通过滚动达到时如何停止 EventListener 吗?我的意思是当它达到 200vh(或任何值)时,EventListener 停止计数。

所以#gallery 位于窗口的中间(许多部分的中间部分)。 #gallery 部分上方和下方还有其他部分。我只想触发用户开始滚动来自#gallery 部分,岩石通过滚动和何时移动#画廊部分结束或达到高度(200vh 或其他),它将阻止岩石移动。

我几乎到那里完成我的视差事情。

这是我的代码

<style>
#gallery
{
height: 200vh
}
.rocks
{
    position: absolute;
    transition: all 0.3s;
}
.rock-1 {
    width: 100px;
    height: 100px;
    left: 10%;
    top: 100px;
}
.rock-2 {
    width: 120px;
    height: 120px;
    left: 20%;
    top: 120px;
}
.rock-3 {
    width: 80px;
    height: 80px;
    left: 10%;
    top: 80px;
}
.rock-4 {
    width: 130px;
    height: 130px;
    top: 130px;
    left: 31%;
}
.rock-5 {
    width: 110px;
    height: 110px;
    top: 110px;
    left: 5%;
    -webkit-transform: scaleX(-1);
    transform: scaleX(-1);
}
.rock-6 {
    width: 70px;
    height: 70px;
    top: 70px;
    left: 20%;
}
.rock-7 {
    width: 120px;
    height: 120px;
    top: 35%;
    left: 120px;
    -webkit-transform: scaleX(-1);
    transform: scaleX(-1);
}
.rock-8 {
    width: 50px;
    height: 50px;
    top: 50px;
    left: 25%;
    -webkit-transform: scaleX(-1);
    transform: scaleX(-1);
}
.rock-9 {
    width: 70px;
    height: 70px;
    top: 70px;
    left: 30%;
}
</style>
<section>
// this is another section
</section>

<section class="section-study-gallery" id="gallery"> // when user scroll from here, EventListener firing and the rocks moving by scrolling.
    <div class="container-fluid">
        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
                <div class="gallery-container">
                    <img class="rock-1 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock"/>
                    <img class="rock-2 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock"/>
                    <img class="rock-3 rocks" src="https://i.imgur.com/AZumOFI.png" alt="rock"/>
                    <img class="rock-4 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock"/>
                    <img class="rock-5 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock"/>
                    <img class="rock-6 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock"/>
                    <img class="rock-7 rocks" src="https://i.imgur.com/AZumOFI.png" alt="rock"/>
                    <img class="rock-8 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock"/>
                    <img class="rock-9 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock"/>
                </div>
            </div>
        </div>
    </div>
</section> // When section end, EventListener should stop firing and the rocks stop moving.


<section>
// this is another section
</section>

<script>
    var scrollFunc = function(e){
    var containerTop = document.querySelector('#gallery').getBoundingClientRect().top;
    
    if (containerTop <= 0) {
        if (!scrollGallery) {
            $('.rock-1').css('top',(400-(containerTop*.8))+'px');
            $('.rock-2').css('top',(200-(containerTop*.6))+'px');
            $('.rock-3').css('top',(500-(containerTop*.4))+'px'); 
            $('.rock-4').css('top',(600-(containerTop*.5))+'px'); 
            $('.rock-5').css('top',(600-(containerTop*.7))+'px'); 
            $('.rock-6').css('top',(400-(containerTop*.7))+'px'); 
            $('.rock-7').css('top',(600-(containerTop*.5))+'px'); 
            $('.rock-8').css('top',(200-(containerTop*.2))+'px');
            $('.rock-9').css('top',(200-(containerTop*.4))+'px');
        }    
    }
    if (containerTop > 0) {
        scrollGallery = 0;
    } 
    if (window.scrolly > window.innerHeight * 2) {
        window.removeEventListener('scroll', scrollFunc);
    }
};
window.addEventListener('scroll',scrollFunc);
</script>

我是 Javascript 新手,如果这个愚蠢的问题困扰您,我很抱歉。 我真的很感激,谢谢!

更新

我已将我的代码更新为“ControlAltDel”代码。但是当#gallery 部分结束时,岩石仍在移动。它仍在移动到页脚部分。估计快到了……

【问题讨论】:

  • 使用 removeEventListener
  • @ControlAltDel嗨,你能告诉我上面代码中的代码吗? :)
  • 这回答了你的问题了吗? JavaScript: remove event listener
  • @DonaldDuck所以代码应该看起来像这样?否则 { scrollGallery.removeEventListener('scroll',containerTop);很抱歉,但它不起作用。
  • @AditLin 不,您需要命名您的函数,然后将命名函数作为参数传递给addEventListenerremoveEventListeneraddEventListenerremoveEventListener 应该在具有相同参数的同一个对象上调用。

标签: javascript html


【解决方案1】:

我已经“匿名化”了你的函数,但你可以用你现有的代码用 window.removeEventListener('scroll', this) 来做

var scrollFunc = function(e){
    var containerTop = document.querySelector('#gallery').getBoundingClientRect().top;
    
    if (containerTop <= 0) {
        if (!scrollGallery) {
            $('.rock-1').css('top',(400-(containerTop*.8))+'px');
            $('.rock-2').css('top',(200-(containerTop*.6))+'px');
            $('.rock-3').css('top',(500-(containerTop*.4))+'px'); 
            $('.rock-4').css('top',(600-(containerTop*.5))+'px'); 
            $('.rock-5').css('top',(600-(containerTop*.7))+'px'); 
            $('.rock-6').css('top',(400-(containerTop*.7))+'px'); 
            $('.rock-7').css('top',(600-(containerTop*.5))+'px'); 
            $('.rock-8').css('top',(200-(containerTop*.2))+'px');
            $('.rock-9').css('top',(200-(containerTop*.4))+'px');
        }    
    }
    if (containerTop > 0) {
        scrollGallery = 0;
      // I think this is what you want, or?
    } 
    if (window.scrolly > window.innerHeight * 2) {
        // This is where you want this function to stop working, right?
        window.removeEventListener('scroll', scrollFunc);
    }
};
window.addEventListener('scroll',scrollFunc);

【讨论】:

  • 感谢你的回答!但我想我也忘了添加 CSS。我把#gallery高度:200vh;使用您的代码,只要我立即滚动它,它就会停止。我想要的只是滚动达到 200vh,然后 AddEventListener 停止添加“顶部”。你明白了吗? :)
  • @AditLin 好的,我已经更新了我的答案。如果我理解正确(也许我没有)这应该是你想要的
  • 当它达到高度(200vh)时,听众仍在数数:(我也更新了我的问题。希望你明白我的意思!:)我想要的只是当它达到#gallery的高度(底部)时,它别数了,先生。我想它几乎就在那里。实施您的代码后,岩石仍在移动。我想在滚动达到 200vh 后阻止岩石移动 :)
  • 我已经更新了我的问题,先生,希望你明白!谢谢!
【解决方案2】:

让我们希望这是有道理的..

let winScrl = gallery.scrollHeight - window.scrollY; 这给了我们滚动的位置。这意味着当我的窗口顶部接触到 div 的底部时,这将等于零。

我们不想要的

但相反,我们希望它是0when 窗口底部触及 div 的底部。所以我再次从我的滚动变量中减去 window.ScrollHeight

let chckScrl = winScrl - window.scrollY;

var scrollGallery;

let gallery = document.querySelector('#gallery');

window.addEventListener('scroll', function(el) {
  var containerTop = document.querySelector('#gallery').getBoundingClientRect().top;
  let winScrl = gallery.scrollHeight - window.scrollY;
  /*console.log(winScrl)*/
  let chckScrl = winScrl - window.scrollY;
  /*console.log(chckScrl)*/
  if (chckScrl > 0) {
    if (!scrollGallery) {
      $('.rock-1').css('top', (300 - (containerTop * .8)) + 'px');
      $('.rock-2').css('top', (200 - (containerTop * .6)) + 'px');
      $('.rock-3').css('top', (400 - (containerTop * .4)) + 'px');
      $('.rock-4').css('top', (500 - (containerTop * .5)) + 'px');
      $('.rock-5').css('top', (500 - (containerTop * .7)) + 'px');
      $('.rock-6').css('top', (400 - (containerTop * .7)) + 'px');
      $('.rock-7').css('top', (500 - (containerTop * .5)) + 'px');
      $('.rock-8').css('top', (200 - (containerTop * .2)) + 'px');
      $('.rock-9').css('top', (200 - (containerTop * .4)) + 'px');
    }
  }
  if (chckScrl < 0) {
    scrollGallery = 1;
  } else {
    scrollGallery = 0;
  }
});
#gallery {
  height: 200vh;
  background-color: cyan;
}

.rocks {
  position: absolute;
  transition: all 0.3s;
}

.rock-1 {
  width: 100px;
  height: 100px;
  left: 10%;
  top: 100px;
}

.rock-2 {
  width: 120px;
  height: 120px;
  left: 20%;
  top: 120px;
}

.rock-3 {
  width: 80px;
  height: 80px;
  left: 10%;
  top: 80px;
}

.rock-4 {
  width: 130px;
  height: 130px;
  top: 130px;
  left: 31%;
}

.rock-5 {
  width: 110px;
  height: 110px;
  top: 110px;
  left: 5%;
  -webkit-transform: scaleX(-1);
  transform: scaleX(-1);
}

.rock-6 {
  width: 70px;
  height: 70px;
  top: 70px;
  left: 20%;
}

.rock-7 {
  width: 120px;
  height: 120px;
  top: 35%;
  left: 120px;
  -webkit-transform: scaleX(-1);
  transform: scaleX(-1);
}

.rock-8 {
  width: 50px;
  height: 50px;
  top: 50px;
  left: 25%;
  -webkit-transform: scaleX(-1);
  transform: scaleX(-1);
}

.rock-9 {
  width: 70px;
  height: 70px;
  top: 70px;
  left: 30%;
}

#temp {
  height: 300vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section>
  // this is another section
</section>

<section class="section-study-gallery" id="gallery"> // when user scroll from here, EventListener firing.
  <div class="container-fluid">
    <div class="row">
      <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
        <div class="gallery-container">
          <img class="rock-1 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock" />
          <img class="rock-2 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock" />
          <img class="rock-3 rocks" src="https://i.imgur.com/AZumOFI.png" alt="rock" />
          <img class="rock-4 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock" />
          <img class="rock-5 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock" />
          <img class="rock-6 rocks" src="https://i.imgur.com/MZutMpv.png" alt="rock" />
          <img class="rock-7 rocks" src="https://i.imgur.com/AZumOFI.png" alt="rock" />
          <img class="rock-8 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock" />
          <img class="rock-9 rocks" src="https://i.imgur.com/yIbmDYw.png" alt="rock" />
        </div>
      </div>
    </div>
  </div>
</section> // when section end, EventListener stop.
<section id="temp">
  // this is another section
</section>

【讨论】:

  • @UmairFaroow 感谢 Umair 先生的努力和完整的回答。但是当我实现它时,EventListener 从窗口顶部触发,而不是 #gallery 部分的顶部。我认为停止的触发器已经正确,但 EventListener 仍然不正确。如果您将代码中的#temp 放在#gallery 部分的上方。它从窗口顶部开始 :) 我想要触发 EventListener 从 #gallery 部分开始,并在 #gallery 部分结束时停止。不过谢谢你的回答,真的很感激!
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
相关资源
最近更新 更多