代码之家  ›  专栏  ›  技术社区  ›  Oliver Williams

三行模式,带有固定标题、底部行和可滚动中间行

  •  0
  • Oliver Williams  · 技术社区  · 7 年前

    我试图创建一个具有顶部、中部和底部的模态。顶部总是固定高度。

    底部必须“粘”到底部,可能会有所不同。它内部的所有内容和元素都必须从底部构建。因此,如果有一行文字,底部将是该行的高度。如果有3或4行文字,底部将根据需要向上推。

    中间需要填满剩下的东西, 如果内容 overflow-y

    我该怎么做?当我尝试的时候,我发现了 overflow-y: auto #wrap

    https://codepen.io/sfullman/pen/XGZoJb

        body{
          font-family: Arial;
        }
        .table{
          display: table;
          height: 100%;
          width: 100%;
        }
        .row{
          display: table-row;
        }
        .cell{
          display: table-cell;
          width: 75%;
        }
        #top{
          background-color: burlywood;
          height: 41px;
        }
        #middle .cell{
          overflow-y: scroll;
        }
        #bottom{
          height: 15px; /* make this height less than expected height, table row/cell behavior will successfully exceed it an push content up */
          border-top: 1px solid darkred;
          background-color: rgba(0,0,0,.15);
        }
        #wrap{
          /* this div is designed to be a dialog/modal and will normally be abs. positioned */
          border: 1px solid darkred;
          width: 425px;
          height: 300px;
          position: absolute;
          top: 20px;
          left: 20px;
        }
        <div id="wrap">
          <div id="innerTable" class="table">
          <div id="top" class="row">
            <div class="cell">
            top
            </div>
          </div>
          <div id="middle" class="row">
            <div class="cell">
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
              middle<br>
            </div>
          </div>
          <div id="bottom" class="row">
            <div class="cell">
            bottom<br>
            bottom<br>
            bottom<br>
            </div>
          </div>
        </div>
        </div>
    0 回复  |  直到 7 年前
        1
  •  1
  •   Oliver Williams    7 年前

    在网上搜索后,我在JS fiddle上找到了一些东西,然后对其进行了修改以创建解决方案 here

    以下是HTML:

    <div id="body">
         <div id="head">
           <!-- if your have content larger than declared height here, it will simply roll under the bottom with no scrolling -->
            <p>Fixed size without scrollbar 1</p>
            <p>Fixed size without scrollbar 2</p>
            <p>Fixed size without scrollbar 3</p>
            <p>Fixed size without scrollbar 4</p>
        </div> 
        <div id="content">
            <!--
            add or remove these to see scrool/non-scroll behavior
            -->
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <!--
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            <p>Dynamic size with scrollbar</p>
            -->
        </div>
        <div id="foot">
          <!-- this content will build from the bottom, pushing the top wall up. #content's bottom will adjust up accordingly -->
            <p>Dynamic size without scrollbar 1</p>
            <p>Dynamic size without scrollbar 2</p>
            <p>Dynamic size without scrollbar 3</p>
        </div> 
    </div>
    

    #body {
        position: absolute;
        top: 15px;
        left: 15px;
        height: 300px;
        width: 500px;
        outline: black dashed 1px;
        display: flex;
        flex-direction: column;
    }
    
    #head {
        /*border: blue solid 1px;*/
        background-color: rgba(0,0,255,0.25);
        height: 50px;
        flex-shrink: 0;
    }
    #content{
        /*border: red solid 1px;*/
        background-color: palegoldenrod;
        overflow-y: auto;
        height: 100%;
    }
    
    #foot {
        /*border: green solid 1px;*/
        background-color: whitesmoke;
        flex-shrink: 0;
    }
    
        2
  •  0
  •   Jennifer Goncalves    7 年前

    我使用flexbox创建了一个示例: https://codepen.io/jgoncalves/pen/XGEqoj

    .container {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      display: flex;
    }
    
    .main {
      flex: 1;
      display: flex;
      flex-direction: column;
    }
    
    .content {
      flex: 1;
      display: flex;
      overflow: auto;
    }
    
    body {
      font-family: sans-serif;
      font-size: 20px;
      line-height: 50px;
      text-transform: uppercase;
      font-weight: bold;
    }
    
    .header {
      text-align: center;
      color: #fff;
      background: #444;
    }
    
    .footer {
      padding: 6px 20px;
      background: #004141;
      color: #fff;
    }
    
    .content {
      background: #ddd;
    }
    <div class="container">
    	<div class="main">
          <div class="header">Main header Main headerMain headerMain headerMain headerMain headerMain headerMain header</div>
    		<div class="content">
    			  Scroll me Scroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll meScroll me
    		</div>
        <div class="footer">Footer end of page. Footer end of page. Footer end of page. Footer end of page. Footer end of page. Footer end of page. Footer end of page. Footer end of page. </div>
    	</div>
    </div>

    中心行在具有不同高度的固定页眉和固定页脚时滚动。

        3
  •  0
  •   kukkuz    7 年前

    柱形柔性箱 用一个 max-height this flexbox-based question

    body {
      margin: 0;
    }
    *{
      box-sizing: border-box;
    }
    .row {
      display: flex;
      flex-direction: column;
      max-height: 100vh;
    }
    .flex {
      flex: 1;
      overflow-y: auto;
    }
    .row, .row > * {
      border: 1px solid;
    }
    <div class="row">
      <div>some content</div>
      <div class="flex">This fills the available space</div>
      <!-- fills/grows available space -->
      <div>another content</div>
    </div>

    请注意 header footer 动态地 CSS Grid layouts 最好是 而CSS网格是一个 解决方案-参见 one example here


    middle 第节:

    body {
      font-family: Arial;
    }
    
    .table {
      display: flex;
      flex-direction: column;
      max-height: 100%;
      width: 100%;
    }
    
    .cell {
      width: 75%;
    }
    
    #top {
      background-color: burlywood;
    }
    
    #middle {
      flex: 1;
      overflow-y: auto;
    }
    
    #bottom {
      border-top: 1px solid darkred;
      background-color: rgba(0, 0, 0, .15);
    }
    
    #wrap {
      border: 1px solid darkred;
      width: 425px;
      height: 300px;
      position: absolute;
      top: 20px;
      left: 20px;
    }
    <div id="wrap">
      <div id="innerTable" class="table">
        <div id="top" class="row">
          <div class="cell">
            top
          </div>
        </div>
        <div id="middle" class="row">
          <div class="cell">
            middle<br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
          </div>
        </div>
        <div id="bottom" class="row">
          <div class="cell">
            bottom
          </div>
        </div>
      </div>
    </div>

    现在看看它是如何工作的,当内容是非常少的 页脚 部分是

    身体{
    字体系列:Arial;
    }
    
    显示器:flex;
    最大高度:100%;
    宽度:100%;
    }
    
    .细胞{
    宽度:75%;
    
    #顶{
    背景颜色:白肋木;
    
    #中间的{
    弹性:1;
    
    #底部{
    边框顶部:1px实心暗色;
    背景色:rgba(0,0,0,15);
    
    宽度:425px;
    高度:300px;
    位置:绝对位置;
    左:20px;
    <div id="wrap">
      <div id="innerTable" class="table">
        <div id="top" class="row">
          <div class="cell">
            top
          </div>
        </div>
        <div id="middle" class="row">
          <div class="cell">
            middle<br> middle
            <br> middle
            <br> middle
            <br> middle
    
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
            <br> middle
          </div>
        </div>
        <div id="bottom" class="row">
          <div class="cell">
            bottom
          </div>
        </div>
      </div>
    </div>