Is there any way to change background color dynamically on scroll?
For example, refer this site(https://www.samsung.com/sec/smartphones/galaxy-note9/)
When you first access that site, background color is blue.
While scroll down, it's color change to black smoothly.
Also see this site(codepen.io/Funsella/pen/yLfAG/)
Second site is same with first. But it's color changed at once.
But first site's color is not change at once.
It changed gradually related to scroll position.
body {
  height: 100vh;
}
.section1 {
  background-color: white;
  height: 100%;
}
.section2 {
  background: linear-gradient(#f05fa6, #ed1654);
  height: 100%;
}
<html>
<body>
  <section class="section1">
    SECTION1
  </section>
  <section class="section2">
    SECTION2
  </section>
</body>
</html>
Above code is what I'm worked on.
Current it's color is split by each section.
When I scroll down, I want to change color background-color: white -> background: linear-gradient(#f05fa6, #ed1654)
Is there any solution about this?
You need to smoothly interpolate the colors by taking into account the page's scroll offset (window.scrollY, or window.pageYOffset on older browsers). 
The Samsung site is transitioning a solid color instead of a gradient, which is a bit simpler.
Like this (see 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})`
})
You can apply the same logic to the gradient colors.
I tried to use the solution of atomiks with a custom end color but it was too difficult. I found myself a better solution by using chroma.js
You need to generate a scale with your two colors (or more) :
var scale = chroma.scale(['#1abc9c', '#e74c3c']).domain([0, $(document).height()]);
$(window).on('scroll', function () {
    $('.section').css('background-color', scale(window.pageYOffset));
});
Here I create a scale with the color I want and then I add a custom domain so that my scale can use the offset position which can go from 0 (top of the page) 3600 (bottom of my page). Or, you can try to get the scroll position value between 0 and 1 with some math.
Then, when we scroll, we can use our scale with the current scroll position. It will generate a RGBA color between our two colors before reaching the last one at the bottom of the page #e74c3c
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With