JavaScript更改滚动条上的背景色

JavaScript更改滚动条上的背景色,javascript,html,css,background-color,Javascript,Html,Css,Background Color,我正在练习Javascript和css。我想在向下滚动时更改背景色。我不想用图书馆来做那个。我跟随这个演示来学习逻辑,但他使用了jquery。我遵循了scrollTop。我的javascript逻辑可以工作,但它不是这样工作的。我想我必须针对每个div来改变背景色,但不知道如何改变 函数showScrollColorChange(){ //让scroll=window.scrollTop()+(window.height()/3); 如果(document.body.scrollTop>20

我正在练习Javascript和css。我想在向下滚动时更改背景色。我不想用图书馆来做那个。我跟随这个演示来学习逻辑,但他使用了jquery。我遵循了scrollTop。我的javascript逻辑可以工作,但它不是这样工作的。我想我必须针对每个
div
来改变背景色,但不知道如何改变

函数showScrollColorChange(){ //让scroll=window.scrollTop()+(window.height()/3); 如果(document.body.scrollTop>20 | | document.documentElement.scrollTop>30){ document.body.classList.add('color-violet') }if(document.body.scrollTop>40 | | document.documentElement.scrollTop>40){ document.body.classList.add('color-green') }否则{ document.body.classList.add('color-orange') } } /*document.body.addEventListener('scroll',()=>{ showScrollColorChange() }) */ window.onscroll=函数(){showcollColorChange()}
*{
框大小:边框框;
}
身体{
保证金:0;
填充:0;
过渡:背景300毫秒线性,颜色300毫秒线性;
}
.集装箱{
显示器:flex;
证明内容:中心;
边缘顶部:20px;
填充:50px;
最小高度:100vh;
}
p{
宽度:50%;
字体大小:20px;
}
img{
宽度:500px;
高度:500px;
边界半径:5px;
}
/*颜色*/
.紫罗兰色{
背景色:#7A4EAB;
}
.靛蓝{
背景色:#4332CF;
}
.蓝色{
背景色:#2F8FED;
}
.绿色{
背景色:#4DCF42;
}
.黄色{
背景色:#FAEB33;
}
.橙色{
背景色:#F19031;
}
.红色{
背景色:#F2293A;
}

我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官
圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

我看到了两种解决方案:

  • 您只向主体中添加类,因此随着时间的推移,主体将拥有每个类,并且其颜色将设置为添加的最后一个类,因此您还应该使用
    类列表删除每个未使用的类。删除('className')
  • 只需使用
    document.body.style.background='#FFFFFF'
    更改正文背景,并为每个更改的颜色添加注释,以避免混淆

  • IntersectionObserver
    非常方便。你只要观察每个容器

    我在元素中添加了一个名为
    \u class
    的自定义属性。它包含在elemen进入/离开视口时应添加/删除的类的名称

    观察者从主线程运行,因此其性能更高

    要查看它是如何工作的,您需要打开全屏。阈值设置为0.9,这意味着在将类添加到主体之前,90%的div需要可见

    let containers=document.querySelectorAll(“.container”)
    让观察者=新的相交观察者((条目)=>{
    条目.forEach((条目,i)=>{
    让color=entry.target.attributes.\u class.nodeValue;
    if(输入。isIntersecting){
    document.body.className=“”;
    document.body.classList.add(颜色);
    }
    })
    },{阈值:0.9})
    containers.forEach(container=>{
    观察者,观察者(容器);
    })
    *{
    框大小:边框框;
    填充:0;
    保证金:0;
    }
    身体{
    保证金:0;
    填充:0;
    过渡:背景300毫秒线性,颜色300毫秒线性;
    }
    .集装箱{
    显示器:flex;
    证明内容:中心;
    边缘顶部:20px;
    填充:50px;
    最小高度:100vh;
    }
    p{
    宽度:50%;
    字体大小:20px;
    }
    img{
    宽度:500px;
    高度:500px;
    边界半径:5px;
    }
    /*颜色*/
    .紫罗兰色{
    背景色:#7A4EAB;
    }
    .靛蓝{
    背景色:#4332CF;
    }
    .蓝色{
    背景色:#2F8FED;
    }
    .绿色{
    背景色:#4DCF42;
    }
    .黄色{
    背景色:#FAEB33;
    }
    .橙色{
    背景色:#F19031;
    }
    .红色{
    背景色:#F2293A;
    }
    
    我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官
    圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

    我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

    我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

    我的同僚们都是精英。尼希尔在阿利奎姆阿苏门达的埃克。行政长官 圣奎拉特·马格尼。圣彼得堡市临时劳工协会(nihil molestias dolores tempora voluptas LABROUM sint)

    containers = document.getElementsByClassName("container");
    var containertops = [];
    containertops.push(0);  // add for space before 1st container
    for (var i = 0; i < containers.length; i++) {
      containertops.push(containers[i].offsetTop);
    }
    
    // array of colours to use
    var colours = [
      "white",
      "color-violet",
      "color-indigo",
      "color-blue",
      "color-green",
      "color-yellow",
      "color-orange",
      "color-red",
    ];
    
    // loop through the containers and add a new colour as the containers change
      for (var i = 0; i < containertops.length; i++) {
    
        // if this container is at the top of the screen get a new colour class
        if (document.body.scrollTop >= containertops[i] || document.documentElement.scrollTop >= containertops[i]) {
          document.body.className = '';  // clear class
    
          // if we have not enough colours, use the last colour class again
          colourclass= (i>=colours.length?colours.length-1: i);
          document.body.classList.add(colours[colourclass]);
        }
      }