将背景色链接到滚动位置

时间:2018-06-25 23:19:31

标签: javascript jquery html css

我想将body元素的背景色链接到滚动位置,这样,当页面一直滚动到顶部时,它的颜色1,但是然后当它滚动超过screen.height时,它完全是不同的颜色,但是我希望对它进行插值,以使其在滚动一半时才过渡一半颜色。到目前为止,我已将其链接到

$(window).scrollTop() > screen.height 

$(window).scrollTop() < screen.height 

添加和删除一个更改背景颜色的类,但我希望它不仅依赖于滚动位置来触发事件,还希望平滑地为其设置动画,以便快速滚动过渡迅速,缓慢滚动过渡缓慢。

3 个答案:

答案 0 :(得分:1)

可能的解决方案之一是将rgb颜色绑定到当前高度,计算步数并根据当前滚动位置设置新的rgb颜色。在这里,我创建了最简单的情况-黑白过渡:

const step = 255 / $('#wrapper').height();
const multiplier = Math.round( 
  $('#wrapper').height() / 
  $('#wrapper').parent().height()
);

$('body').scroll(() => {
  const currentStyle = $('body').css('backgroundColor');
  const rgbValues = currentStyle.substring(
    currentStyle.lastIndexOf("(") + 1, 
    currentStyle.lastIndexOf(")")
  );
  const scrolled = $('body').scrollTop();
  const newValue = step * scrolled * multiplier;
  $('#wrapper').css('background-color', `rgb(${newValue}, ${newValue}, ${newValue})`);
});
html,
body {
  padding: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  overflow-x: hidden;
  background-color: rgb(0, 0, 0);
}

#wrapper {
  height: 200%;
  width: 100%;
  overflow: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<section id="wrapper"></section>

这是从黄色到蓝色过渡的另一个示例:

const step = 255 / $('#wrapper').height();
const multiplier = Math.round( 
  $('#wrapper').height() / 
  $('#wrapper').parent().height()
);

$('body').scroll(() => {
  const currentStyle = $('body').css('backgroundColor');
  const rgbValues = currentStyle.substring(
    currentStyle.lastIndexOf("(") + 1, 
    currentStyle.lastIndexOf(")")
  );
  const scrolled = $('body').scrollTop();
  const newValue = step * scrolled * multiplier;
  $('#wrapper').css('background-color', `rgb(${255 - newValue}, ${255 - newValue}, ${newValue})`);
});
html,
body {
  padding: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  overflow-x: hidden;
  background-color: rgb(255, 255, 0);
}

#wrapper {
  height: 200%;
  width: 100%;
  overflow: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<section id="wrapper"></section>

答案 1 :(得分:0)

一种非常简单的方法来完成您想要的工作,只需使用渐变作为背景即可。

这里绝对不需要任何JS,这只会减慢页面速度。

body {
  height: 600vh;
  background: linear-gradient(#2E0854, #EE3B3B)
}

您是否有特定的理由要使用JS做到这一点?

答案 2 :(得分:0)

var randomHex = function () {
  return (parseInt(Math.random()*16)).toString(16) || '0';
};
var randomColor = function () {
  return '#'+randomHex()+randomHex()+randomHex();
};
var randomGradient = function () {
  $('.longContent').css('background', 'linear-gradient(0.5turn, #222, '+randomColor()+','+randomColor()+')');
};
$(window).on('load', randomGradient);
body {
  margin: 0;
}
.longContent {
  height: 400vh;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/17.2.0/Tween.min.js"></script>

<div class="longContent"></div>