在滚动时动态更改背景颜色

Hid*_*ide 7 javascript css dom-events

有没有办法在滚动时动态更改背景颜色?

例如,参考这个网站(https://www.samsung.com/sec/smartphones/galaxy-note9/

当您第一次访问该站点时,背景颜色为蓝色。

向下滚动时,它的颜色平滑地变为黑色。

另见本站( codepen.io/Funsella/pen/yLfAG/)

第二个站点与第一个相同。但它的颜色一下子就变了。

但是第一个站点的颜色不会立即改变。

它随着滚动位置逐渐改变。

body {
  height: 100vh;
}
.section1 {
  background-color: white;
  height: 100%;
}
.section2 {
  background: linear-gradient(#f05fa6, #ed1654);
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<html>
<body>
  <section class="section1">
    SECTION1
  </section>
  <section class="section2">
    SECTION2
  </section>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

上面的代码是我正在处理的。

当前它的颜色被每个部分分开。

当我向下滚动时,我想改变颜色background-color: white->background: linear-gradient(#f05fa6, #ed1654)

有什么解决办法吗?

ato*_*iks 13

您需要通过考虑页面的滚动偏移(window.scrollY,或window.pageYOffset在较旧的浏览器上)来平滑地插入颜色。

三星网站正在过渡纯色而不是渐变,这更简单一些。

像这样(见 CodePen):

const [red, green, blue] = [69, 111, 225]
const section1 = document.querySelector('.section1')

window.addEventListener('scroll', () => {
  let y = 1 + (window.scrollY || window.pageYOffset) / 150
  y = y < 1 ? 1 : y // ensure y is always >= 1 (due to Safari's elastic scroll)
  const [r, g, b] = [red/y, green/y, blue/y].map(Math.round)
  section1.style.backgroundColor = `rgb(${r}, ${g}, ${b})`
})
Run Code Online (Sandbox Code Playgroud)

您可以将相同的逻辑应用于渐变颜色。