Javascript eventListener 滚动仅在向下滚动时有效,在向上滚动时无效

Javascript eventListener scrolling only works when scrolling down, not when scrolling up

我几乎没有使用 HTML/CSS/JS 的经验,所以大部分都是复制粘贴的。我正在使用一个名为 cargo 的网站建设服务。我正在尝试根据用户的滚动位置更改背景颜色。从顶部开始向下滚动时,一切都完美无缺。但是向上滚动根本不允许颜色改变(到达顶部后“主体”颜色除外)。

HTML/JS:

<script>
    function changeBackground(){
        if(scrollY >= 300 && scrollY < 900)    {
        document.body.classList.add('bg-color');
        }  
      
        else if(scrollY >= 900 && scrollY < 1900){
          document.body.classList.add('bg-color-orangeyellow');
          }
        else if(scrollY >=1900 && scrollY < 2700){
            document.body.classList.add('bg-color-white');
            } 
        
        else{  
            document.body.classList.remove('bg-color');
          document.body.classList.remove('bg-color-orangeyellow');
            document.body.classList.remove('bg-color-white');
    
        
          }
        }
        addEventListener('scroll', changeBackground); 
    </script>

CSS:

body {
    background-color:rgb(166, 199, 255);
    transition: all 0.5s ease;
  }
.bg-color{
    background-color: #11923d;
    
}
.bg-color-orangeyellow{
    background-color: #ffb217;
        
}
.bg-color-white{
    background-color: white;

问题在于,在每个 if 语句中,您都在 添加 类 而不是删除它们。

一个选项是在每个 if 语句中删除另一个 类,您也可以只使用内联样式设置背景颜色,而不是像这样打开和关闭这些 类所以:

    function changeBackground(){
        const bodStyle = document.body.style;
        if(scrollY >= 300 && scrollY < 900)    {
          bodStyle.backgroundColor = '#11923d';
        }  
      
        else if(scrollY >= 900 && scrollY < 1900){
          bodStyle.backgroundColor = '#ffb217';
          }
        else if(scrollY >=1900 && scrollY < 2700){
          bodStyle.backgroundColor = '#ffffff'
        }
        else{  
          bodStyle.backgroundColor = 'rgb(166, 199, 255)';
          }
        }
        document.addEventListener('scroll', changeBackground); 
body {
    background-color: rgb(166, 199, 255);
    transition: all 0.5s ease;
    height: 5000px;
  }

注意:我只将高度添加到 CSS,这样您就可以在代码片段中滚动。

基本上你的代码存在于匹配的第一个条件块上并且 else 没有被调用,所以当你返回时那些 类 不会被删除。您可以像这样使您的代码更加动态。

function changeBackground() {
  const positions = [{
      dist: (scrollY >= 300) && (scrollY < 900),
      cls: 'bg-color'
    },
    {
      dist: (scrollY >= 900) && (scrollY < 1900),
      cls: 'bg-color-orangeyellow'
    },
    {
      dist: (scrollY >= 1900) && (scrollY < 2700),
      cls: 'bg-color-white'
    }
  ]

  positions.forEach(({
    dist,
    cls
  }) => {
    const action = dist ? 'add' : 'remove'
    document.body.classList[action](cls)
  })


}

addEventListener('scroll', changeBackground);
body {
  background-color: rgb(166, 199, 255);
  transition: all 0.5s ease;
  height: 2700px;
}

.bg-color {
  background-color: #11923d;
}

.bg-color-orangeyellow {
  background-color: #ffb217;
}

.bg-color-white {
  background-color: white;
}