【问题标题】:Change Background Colour Along a Gradient as User Scrolls用户滚动时沿渐变更改背景颜色
【发布时间】:2018-10-14 14:16:59
【问题描述】:

我试图让页面的背景颜色随着用户滚动而在黑白之间的渐变上发生变化。如果有意义,颜色将取决于用户当前在页面上滚动到的位置?这是我已经有的一些代码,但是唯一的问题是当用户没有滚动网页不是黑色的任何地方时。

function scroll(){
	var body = document.body,
		  html = document.documentElement;
	var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );
	var color = Math.round(((body.scrollTop + html.offsetHeight) / height) * 255);
	body.style.backgroundColor = "rgb("+color+","+color+","+color+")";
}
html{
	height: 100%;
}
body{
	height: 200%;
	background: rgb(126,126,126);
}
<!DOCTYPE html>
<html lang="en" dir="ltr">

  <body onscroll="scroll()">
    <script src="assets/JS/ScrollEffect.js"></script>
  </body>

</html>

【问题讨论】:

    标签: javascript html css background-color


    【解决方案1】:

    您必须使用html.scrollTop 而不是body.scrollTop。 那是因为 html 元素变得可滚动。高度为 200% 的 body 元素溢出高度为 100% 的 html,即视口高度。

    正文不会在此处滚动,因此您总是得到body.scrollTop = 0。 但是html确实会滚动,所以你必须使用html.scrollTop

    元素bodyhtml 有时表现得好像它们是一个元素。滚动行为就是这种情况。但有时它们表现得好像它们是两个独立的元素。这就是使用 CSS 进行样式设置的情况。

    要从黑色变为白色(而不是灰色变为白色),您必须更改 var height = html.scrollHeight - html.clientHeight;var color = Math.round((html.scrollTop / height) * 255);

    要使其在 IE 中运行,您需要添加: &lt;html onscroll="scroll()"&gt;

    如果可以的话,你应该使用 jquery(就像 Kushtrim 建议的那样)。

    function scroll(){
    	var body = document.body,
    		  html = document.documentElement;
    	var height = html.scrollHeight - html.clientHeight;
    	var color = Math.round((html.scrollTop / height) * 255);
    	body.style.backgroundColor = "rgb("+color+","+color+","+color+")";
    }
    html{
    	height: 100%;
    }
    body{
    	height: 200%;
    	background: rgb(0,0,0);
    }
    <!DOCTYPE html>
    <html lang="en" dir="ltr" onscroll="scroll()">
    
      <body onscroll="scroll()">
        <script src="assets/JS/ScrollEffect.js"></script>
      </body>
    
    </html>

    【讨论】:

    • 我看到了一个更改请求,要求将var color = Math.round((html.scrollTop / height) * 255); 更改为使用body.scrollTop 而不是html.scrollTop。如果您更改它,该示例将不再适用。
    • 如果正文中有内​​容并且样式溢出,我删除了关于使用 body.scrollTop 的声明:滚动,因为我认为这不起作用。似乎您总是必须从 html 元素中获取滚动信息。相反,我添加了一段提到 html 和 body 令人困惑的行为。
    【解决方案2】:

    试试看,阅读更多here

    .container {
      width: 100%;
      min-width: 1200px;
      height: 100%;
      background-size: cover;
      background-position: center;
      background-attachment: fixed;
    }
    .container .overlay {
      background: linear-gradient(to bottom, rgba(0, 160, 227, 0.5) 0%, rgba(176, 203, 31, 0.5) 50%, rgba(239, 127, 26, 0.5) 100%);
    }
    .container .slide {
      width: 100%;
      height: 600px;
      position: relative;
    }
    
    .secs {
      position: relative;
      height: 100%;
    }
    .secs .inside {
      width: 1200px;
      margin: 0 auto;
      height: 100%;
    }
    .secs.first {
      text-align: center;
    }
    .secs.first h1 {
      font-size: 60px;
      font-weight: bold;
      color: white;
      position: absolute;
      top: 50%;
      left: 50%;
      text-shadow: 1px 1px 1px #999,2px 2px 1px #999,3px 3px 1px #999,4px 4px 1px #999;
      transform: translate(-50%, -155%);
      z-index: 10;
    }
    .secs.first .inside {
      display: flex;
      justify-content: center;
      padding-top: 100px;
      position: relative;
    }
    .secs.first .bar {
      width: 80px;
      height: 350px;
      opacity: 0.54;
      box-shadow: 0px 0px 50px #fff;
      display: inline-block;
      margin-right: 25px;
      background: #fff;
    }
    .secs.first .bar:nth-child(1) {
      background: #00a0e3;
      animation: bars 5s infinite;
    }
    .secs.first .bar:nth-child(2) {
      transform: translateY(130px);
      background: #00a0e3;
      animation: bars1 5s infinite;
    }
    .secs.first .bar:nth-child(3) {
      transform: translateY(30px);
      background: #b0cb1f;
      animation: bars2 5s infinite;
    }
    .secs.first .bar:nth-child(4) {
      transform: translateY(80px);
      background: #b0cb1f;
      animation: bars3 5s infinite;
    }
    .secs.first .bar:nth-child(5) {
      transform: translateY(-30px);
      background: #ef7f1a;
      animation: bars4 5s infinite;
    }
    .secs.first .bar:nth-child(6) {
      transform: translateY(135px);
      background: #ef7f1a;
      animation: bars5 5s infinite;
    }
    .secs.first .bar:nth-child(7) {
      transform: translateY(55px);
      background: #e31e24;
      animation: bars6 5s infinite;
    }
    .secs.first .bar:nth-child(8) {
      background: #e31e24;
      animation: bars7 5s infinite;
    }
    
    @keyframes bars {
      0% {
        transform: translateY(0px);
      }
      50% {
        transform: translateY(130px);
      }
      100% {
        transform: translateY(0px);
      }
    }
    @keyframes bars1 {
      0% {
        transform: translateY(130px);
      }
      50% {
        transform: translateY(10px);
      }
      100% {
        transform: translateY(130px);
      }
    }
    @keyframes bars2 {
      0% {
        transform: translateY(30px);
      }
      50% {
        transform: translateY(0px);
      }
      100% {
        transform: translateY(30px);
      }
    }
    @keyframes bars3 {
      0% {
        transform: translateY(0px);
      }
      50% {
        transform: translateY(80px);
      }
      100% {
        transform: translateY(0px);
      }
    }
    @keyframes bars4 {
      0% {
        transform: translateY(-30px);
      }
      50% {
        transform: translateY(0px);
      }
      100% {
        transform: translateY(-30px);
      }
    }
    @keyframes bars5 {
      0% {
        transform: translateY(135px);
      }
      50% {
        transform: translateY(10px);
      }
      100% {
        transform: translateY(135px);
      }
    }
    @keyframes bars6 {
      0% {
        transform: translateY(55px);
      }
      50% {
        transform: translateY(0px);
      }
      100% {
        transform: translateY(55px);
      }
    }
    @keyframes bars7 {
      0% {
        transform: translateY(0px);
      }
      50% {
        transform: translateY(120px);
      }
      100% {
        transform: translateY(0px);
      }
    }
    <div class='container'>
      <div class='overlay'>
        <div class='slide secs first'></div>
        <div class='slide'></div>
        <div class='slide'></div>
        <div class='slide'></div>
        <div class='slide'></div>
        <div class='slide'></div>
        <div class='slide'></div>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      这样的?

      $(window).on('scroll', function(){
        var s = $(window).scrollTop(),
            d = $(document).height(),
            c = $(window).height();
      
        var scrolledArea = (s / (d - c));
        $("div").css("opacity", scrolledArea);
      })
      body{
        margin: 0;
      }
      
      div{
        height: 500vh;
        background: #000;
        opacity: 0;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div>
      
      </div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-10
        • 2012-02-04
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多