【问题标题】:Increase element opacity when user scrolls down the page当用户向下滚动页面时增加元素不透明度
【发布时间】:2019-07-02 04:40:12
【问题描述】:

我看到了很多与在用户滚动时修改元素不透明度相关的问题,但还没有找到可以帮助我以我需要的方式的问题。试了好几个配方都没有达到我想要的效果。

我有一个带有 BG 图像的标题,在其中有一个用作叠加层的 div,我希望它在用户向下滚动时平滑地变暗(不透明度增加)。

编辑: 想要的效果是:

不透明度在 CSS 中默认设置为 0.2。当用户开始向下滚动时,它将开始从 0.2 增加到 1。当用户再次向上滚动时,它将从 1(或任何值)减少到 0.2。

小提琴:https://jsfiddle.net/z7q2qtc6/

<div class='nice-header'>
  <div class='header-overlay'></div>
</div>

CSS

.nice-header {
  position: relative;
  height: 300px;
  background: center center;
  background-size: cover;
  background-image: url(http://www.boeing.com/resources/boeingdotcom/commercial/787/assets/images/marquee-787.jpg);
}

.header-overlay {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  background: rgb(0,0,0);
  opacity: 0.2;
}

JS

$(window).scroll(function() {
  $('.header-overlay').css({
    opacity: function() {
      var opacity = 0;
      //TODO:
      //Set opacity to a higer value whilst user scrolls
      return opacity;
    }
  });
});

【问题讨论】:

    标签: javascript jquery html css


    【解决方案1】:

    您可以使用.scrollTop() method 检索当前滚动位置。

    要计算不透明度,请从元素的高度中减去 scrollTop 值,然后再除以元素的高度。

    Example Here

    $(window).scroll(function() {
      var scrollTop = $(this).scrollTop();
    
      $('.header-overlay').css({
        opacity: function() {
          var elementHeight = $(this).height();
          return 1 - (elementHeight - scrollTop) / elementHeight;
        }
      });
    });
    

    如果要考虑元素的初始不透明度0.2

    Updated Example

    $('.header-overlay').css({
      opacity: function() {
        var elementHeight = $(this).height(),
            opacity = ((1 - (elementHeight - scrollTop) / elementHeight) * 0.8) + 0.2;
    
        return opacity;
      }
    });
    

    【讨论】:

    • 哦,太聪明了!这正是我所需要的!而且很容易调整
    • 上述脚本的唯一更新是以“jQuery(function($){”开头并相应地关闭括号。否则在开发者工具中会出现脚本错误。谢谢回答。
    【解决方案2】:

    对于任何尝试这样做但相反的人(元素在您滚动时淡出)

    opacity = ((elementHeight - scrollTop) / elementHeight);

    $(window).scroll(function() {
        var scrollTop = $(this).scrollTop();
    
            $('.header-overlay').css({
            opacity: function() {
                var elementHeight = $(this).height(),
                opacity = ((elementHeight - scrollTop) / elementHeight);
                return opacity;
            }
        });
    });
    .nice-header {
      position: relative;
      height: 300px;
      background: center center;
      background-size: cover;
      background-image: url(http://www.boeing.com/resources/boeingdotcom/commercial/787/assets/images/marquee-787.jpg);
    }
    
    .header-overlay {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgb(0, 0, 0);
      opacity: 1;
    }
    
    .dummy {
      height: 900px;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class='nice-header'>
      <div class='header-overlay'>
    
      </div>
    </div>
    <div class='dummy'>
    
    </div>

    【讨论】:

      【解决方案3】:

      使用 rbga 代替 rbg 并在用户滚动时更改 alpha 值。我显然不是 100% 确定你想要什么效果,但在大多数情况下,使用 rgba 是比使用 rgb 和不透明度更好的方法。

      What are differences between RGB vs RGBA other than 'opacity'

      这是另一篇文章的链接,该文章更详细地解释了这一点。

      【讨论】:

      • 谢谢您的好先生您的回答。但我已经确切地知道 RGBA 和 RGB 是什么。这更像是一个问题,要找到一个合适的公式来计算相对于滚动从 0.2 到 1 的递增值。
      • 啊,我明白了——我很抱歉!这是一个更复杂的解决方案!
      • api.jquery.com/scroll 可能会有所帮助,如果您可以使用 Jquery,那么您应该能够编写一个简单的函数,将用户可以滚动的总量除以 8,并且每次跳转到下一个范围,将不透明度增加 0.1,这应该使您达到 1.0 最大滚动(或最小滚动,但您想要它) - 我希望这至少可以帮助您朝着更有用的方向前进。
      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多