如何让容器从上到下向下滚动

Posted

技术标签:

【中文标题】如何让容器从上到下向下滚动【英文标题】:how to let the container scroll down from top to bottom 【发布时间】:2016-10-23 18:49:10 【问题描述】:

我想像这样实现这个html效果:

来自this website

图像从上到下滚动显示,很酷。

但我的工具是:

http://codepen.io/devbian/pen/dXOvGj

<div class="container container0">
  <img src='http://special.porsche.com/microsite/mission-e/assets/images/content/reveal/intro/intro-01.jpg' class='fixed'/>
</div>

<div class="container container1">
  <img src="http://special.porsche.com/microsite/mission-e/assets/images/content/reveal/intro/intro-02.jpg" class="moveable">
</div>

<div class="container container2">
  <img src="http://special.porsche.com/microsite/mission-e/assets/images/content/reveal/intro/intro-04.png" class="moveable">
</div>

<div class="container container3">
  <img src="http://special.porsche.com/microsite/mission-e/assets/images/content/reveal/intro/intro-05.jpg" class="moveable">
</div>




* 
  padding: 0;
  margin: 0;


body
  min-height:2000px;


.container 
  overflow: hidden;
  padding: 10px;
  position: relative;
  min-height: 300px;


.container img
  width:100%;
  height:300px;


/* .container0 
  background-color: #e67e22;

.container1 
  background-color: #ecf0f1;

.container2 
  background-color: #f39c12;

.container3 
  background-color: #1abc9c;
 */

.fixed 
  position:fixed;

.moveable 
  position:absolute;



$(function() 
  function setLogo() 
    $('.moveable').each(function() 
    $(this).css('top',
      $('.fixed').offset().top -  $(this).closest('.container').offset().top
    );
  );
    
  $(window).on('scroll', function() 
     setLogo();
  );
  setLogo();
)

这是从下到上。

如何通过滚动从上到下更改图像?

【问题讨论】:

【参考方案1】:

Plunker

这是我为使这项工作自上而下所做的工作:

定位 - 每张汽车幻灯片都有position: absolute 并以bottom: 0% 开头,当您滚动它时,通过过渡到bottom: 100% 慢慢地显示幻灯片。例外情况是从左到右发生的第三次转换,即从left: -100% 移动到left: 0%当前幻灯片 - 当前幻灯片的计算方法是将滚动位置除以视图高度,然后像 Math.floor( scrollTop / height ) 这样向下取整。 当前幻灯片百分比 - 每个幻灯片过渡的当前百分比(用于过渡 bottomleft 样式)通过使用 @987654330 获取当前幻灯片位置之外的像素量来计算@,然后将其除以视图高度并将结果转换为像这样的百分比(partPixels / height) * 100

然后,只要滚动位置发生变化,只需使用相关样式更新 DOM。

完整代码

window.onload = function()   
  var scrollTop, currentIndex, partPercentage, height, totalHeight;
  var stylesLastUpdate = ;
  var elementsCache = 
    partWrapper: document.getElementById("part-wrapper"),
    spacer: document.getElementById("spacer"),
    segment: document.getElementById("segment")
  ;
  var whiteBackgrounds = document.getElementsByClassName('part-background-light');
  var wbLength = whiteBackgrounds.length;
  var partElements = elementsCache.partWrapper.getElementsByClassName("part");
  var partsLength = partElements.length;
  var specialIndex = 3;
  partsLength += 1;
  for (var i = 0; i < partsLength; i++) 
    if (i < specialIndex) 
      elementsCache[i] = partElements[i];
    
    else 
      elementsCache[i] = partElements[i-1];
    
  

  resize();
  onScroll();
  document.addEventListener("scroll", onScroll);
  window.addEventListener("resize", resize);

  function onScroll() 
    scrollTop = document.body.scrollTop;
    if (scrollTop > totalHeight) 
      elementsCache.segment.classList.remove("fixed");
    
    else 
      elementsCache.segment.classList.add("fixed");
    
    currentIndex = Math.floor( scrollTop / height );
    var partPixels = scrollTop % height;
    partPercentage = (partPixels / height) * 100;
    updateDom();
  

  function updateDom() 
    var nextIndex = currentIndex + 1;
    for (var i = 0; i < partsLength; i++) 
      if (i === currentIndex && nextIndex < partsLength) 
        if (currentIndex !== (specialIndex-1)) 
          updateStyle(nextIndex, 'bottom:' + (100 - partPercentage) + '%;display:block');
        
      
      if (i <= currentIndex) 
        updateStyle(i, 'bottom:0%; display: block');
      
      if (i > nextIndex) 
        updateStyle(i, 'bottom:100%; display: none');
      
    
    updateWhiteBackgrounds();
  

  function updateStyle(index, newStyle) 
    if (!(index in stylesLastUpdate) || stylesLastUpdate[index] !== newStyle) 
      stylesLastUpdate[index] = newStyle;
      elementsCache[index].style.cssText = newStyle;
    
  

  function updateWhiteBackgrounds() 
    var wbPercentage = -100; // default
    if (currentIndex === (specialIndex-1)) 
      wbPercentage = -100 + partPercentage;
    
    else if (currentIndex > (specialIndex-1)) 
      wbPercentage = 0;
    
    var newStyle = 'left:' + wbPercentage + '%;display:block';
    if (!('whiteBackgrounds' in stylesLastUpdate) || stylesLastUpdate['whiteBackgrounds'] !== newStyle) 
      for (var m = 0; m < wbLength; m++) 
        whiteBackgrounds[m].style.cssText = newStyle;
      
    
  

  function resize() 
    height = elementsCache.partWrapper.clientHeight;
    totalHeight = height * (partsLength-1);
    updateStyle('spacer', 'padding-top:' + totalHeight + 'px')
  

body 
    margin: 0;


.special-scroll 
    padding-top: 1567px;


.segment 
    margin: auto;
    top: 0px;
    left: 0px;
    bottom: auto;
    right: auto;

.segment.fixed 
    position: fixed;


.animation-sequence 
    background-color: black;


.part-spacer 
    height: 15vh;
    position: relative;

.part-background-dark 
    background-color: black;
    position: absolute;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    


.part-background-light 
    background-color: white;
    position: absolute;
    width: 100%;
    height: 100%;
    left: -100%;
    top: 0;
    



.part-wrapper 
    position: relative;

.part 
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 100%;
    overflow: hidden;
    display: none;

.part-0 
    position: relative;
    display: block;

.part-2 img 
    position: absolute;

.part img 
    width: 100%;

.content 
    min-height: 2000px;
<!-- special-scroll -- start -->
    <div class="special-scroll" id="spacer">
      <div class="segment fixed" id="segment">
        <div class="animation-sequence">
          <div class="part-spacer spacer-top">
            <div class="part-background-light"></div>
          </div>
          
          <div class="part-wrapper" id="part-wrapper">
            <div class="part part-0">
              <img src="http://i.imgur.com/B6fq5d3.jpg">
            </div>
            <div class="part part-1">
              <img src="http://i.imgur.com/pE44BJ8.jpg">
            </div>
            <div class="part part-2">
              <div class="part-background-dark"></div>
              <div class="part-background-light"></div>
              <img src="http://i.imgur.com/U7bEh2I.png">
            </div>
            <div class="part part-4">
              <img src="http://i.imgur.com/HSNVbkR.jpg">
            </div>
            <div class="part part-5">
              <img src="http://i.imgur.com/1OGlaDI.jpg">
            </div>
            <div class="part part-6">
              <img src="http://i.imgur.com/CuTgGME.jpg">
            </div>
          </div>

          <div class="part-spacer spacer-bottom">
            <div class="part-background-light"></div>
          </div>
        </div>
      </div>
    </div>
    <!-- special-scroll -- end -->
    <div class="content">
    </div>

【讨论】:

太棒了!我有这个在我的最爱......因为我花了很多时间试图找到并失败了。竖起大拇指!赞成。 ;) 太棒了,很高兴它有帮助!

以上是关于如何让容器从上到下向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

单击同一个div时如何从上到下和从下到上缓慢滚动?

将图片从上到下移动

如何从上到下创建 UINavigationController 动画 [重复]

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

从上到下 Swift 呈现 ViewController

如何在离子4中单击向下和向上箭头图标按钮垂直离子项目滚动到底部和顶部?