【问题标题】:dynamic div height with static footer (css only)带静态页脚的动态 div 高度(仅限 CSS)
【发布时间】:2017-12-21 00:48:12
【问题描述】:

我有一个滑出式菜单,当打开到顶部:0、底部:0、右侧:0 时,它是绝对定位的,宽度为 480 像素。它包含一些标题行的文本。在此之下,它包含一些动态创建的选项行(可以是 1 到 100 行)。在其下方是带有两个按钮的页脚行。

我想做的是:

  1. 将标题设为静态,使其不会滚动。
  2. 将按钮行设为静态,使其始终在页面底部可见
  3. 使带有选项的容器具有 y 滚动条,并且它的高度始终占据任何剩余可用空间(窗口高度 - 标题行的高度,减去按钮行的高度)

我正在寻找一个全 CSS 解决方案(没有 js/jquery)。我只需要支持现代浏览器(最后两个版本,即chrome,firefox)。

<body>
  <div>
    <div class='configuration-drawer-container configuration-drawer-container-open'>
      <div class="configuration-drawer-body">
        <div class="configuration-drawer-content">
          <div class="title-row-wrapper">
            <div class="title">
              Dashboard Configuration
            </div>
            <div>
            <p>
              Select the data tiles you want displayed on the PM Dashboard.
            </p>
            <p>
              <span>Note:</span>
              Dashboard configurations are shared across all workspaces of the same type.  Changes to the configuration will affect other workspaces.
            </p>
            <p>
              Select up to five rows
            </p>
          </div>
          </div>
          <div class='data-box-row-wrapper'>
            <div class="configuration-drawer-data-box-row" >
              Option 1
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 2
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 3
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 4
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 5
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 6
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 7
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 8
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 9
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 10
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 11
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 12
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 13
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 14
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 15
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 16
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 17
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 18
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 19
            </div>
            <div class="configuration-drawer-data-box-row" >
              Option 20
            </div>
          </div>
          <div class="button-wrapper">
            <div class="cancel" >
              Close
            </div>
            <div class="save">
              Save
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>


body {
  background-color: gray;
  height: 100%;
  overflow-y: hidden;
}

.configuration-drawer-container {
    background-color: #fff;
    bottom: 0;
    color: #333;
    font-size: 15px;
    font-weight: 300;
    height: 100vh;
    padding: 24px 24px 0 24px;
    position: absolute;
    top: 0;
    z-index: 9998;
}

.configuration-drawer-container-open {
    height: 100vh;
   /*overflow-y: auto;*/
    visibility: visible;
    width: 480px;
    right: 0;
}

.configuration-drawer-body {
  min-height: 100%;
    position: relative;
}

.configuration-drawer-content {
    position: relative;
    height: 100%;

     heigth: calc(100vh - 500px);
     overflow: auto;
    /* padding-bottom: 90px; */
}

.title-row-wrapper {
    margin-bottom: 24px;
    position: relative;
    width: 100%;
}

.title {
    color: #333;
    display: inline;
    font-size: 20px;
    font-weight: 500;
}

.data-box-row-wrapper {
  overflow-y: auto;
  background-color: light-gray;
  border: 1px red solid;
}

.configuration-drawer-data-box-row {
    align-items: center;
    border-bottom: 1px solid #eee;
    cursor: pointer;
    display: flex;
    height: 48px;
    text-align: left;
}

.button-wrapper {
    padding: 24px 0;
}

.cancel {
    color: #007ec2;
    margin-right: 16px;
    padding: 0 8px 0 8px;
    border: 1px solid black;
    display: inline-block;
    font-size: 14px;
    font-weight: 500;
    height: 36px;
    line-height: 36px;
    min-width: 64px;
    text-align: center;
    vertical-align: middle;
}

.save {
    color: #007ec2;
    margin-right: 16px;
    padding: 0 8px 0 8px;
    border: 1px solid black;
    display: inline-block;
    font-size: 14px;
    font-weight: 500;
    height: 36px;
    line-height: 36px;
    min-width: 64px;
    text-align: center;
    vertical-align: middle;
}

这是我的代码笔:

https://codepen.io/johnsontroye/pen/XVdyGN?editors=1100

【问题讨论】:

  • 仅供参考,codepen 是空的
  • 另外,您可以使用代码sn-p,而不是代码示例,它将在页面上呈现它
  • codepen 问题已解决。

标签: html css


【解决方案1】:

您可以使用calc()

.data-box-row-wrapper {
  height: calc(100vh - (24px + 24px + 24px + 24px + 125px + 38px + 24px + 24px));
}

.data-box-row-wrapper {
  height: calc(100vh - 283px);
}

283 是静态部分高度的总和,包括它们的填充和边距。

body {
  background-color: gray;
  height: 100%;
  overflow-y: hidden;
}

.configuration-drawer-container {
  background-color: #fff;
  bottom: 0;
  color: #333;
  font-size: 15px;
  font-weight: 300;
  height: 100vh;
  padding: 24px 24px 0 24px;
  position: absolute;
  top: 0;
  z-index: 9998;
}
.data-box-row-wrapper {
  height: calc(100vh - (24px + 24px + 24px + 24px + 125px + 38px + 24px + 24px));
}
.configuration-drawer-container-open {
  height: 100vh;
  /*overflow-y: auto;*/
  visibility: visible;
  width: 480px;
  right: 0;
}

.configuration-drawer-body {
  min-height: 100%;
  position: relative;
}

.configuration-drawer-content {
  position: relative;
  height: 100%;
  heigth: calc(100vh - 500px);
  overflow: auto;
  /* padding-bottom: 90px; */
}

.title-row-wrapper {
  margin-bottom: 24px;
  position: relative;
  width: 100%;
}

.title {
  color: #333;
  display: inline;
  font-size: 20px;
  font-weight: 500;
}

.data-box-row-wrapper {
  overflow-y: auto;
  background-color: light-gray;
  border: 1px red solid;
}

.configuration-drawer-data-box-row {
  align-items: center;
  border-bottom: 1px solid #eee;
  cursor: pointer;
  display: flex;
  height: 48px;
  text-align: left;
}

.button-wrapper {
  padding: 24px 0;
}

.cancel {
  color: #007ec2;
  margin-right: 16px;
  padding: 0 8px 0 8px;
  border: 1px solid black;
  display: inline-block;
  font-size: 14px;
  font-weight: 500;
  height: 36px;
  line-height: 36px;
  min-width: 64px;
  text-align: center;
  vertical-align: middle;
}

.save {
  color: #007ec2;
  margin-right: 16px;
  padding: 0 8px 0 8px;
  border: 1px solid black;
  display: inline-block;
  font-size: 14px;
  font-weight: 500;
  height: 36px;
  line-height: 36px;
  min-width: 64px;
  text-align: center;
  vertical-align: middle;
}
<body>
  <div>
    <div class='configuration-drawer-container configuration-drawer-container-open'>
      <div class="configuration-drawer-body">
        <div class="configuration-drawer-content">
          <div class="title-row-wrapper">
            <div class="title">
              Dashboard Configuration
            </div>
            <div>
              <p>
                Select the data tiles you want displayed on the PM Dashboard.
              </p>
              <p>
                <span>Note:</span> Dashboard configurations are shared across all workspaces of the same type. Changes to the configuration will affect other workspaces.
              </p>
              <p>
                Select up to five rows
              </p>
            </div>
          </div>
          <div class='data-box-row-wrapper'>
            <div class="configuration-drawer-data-box-row">
              Option 1
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 2
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 3
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 4
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 5
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 6
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 7
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 8
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 9
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 10
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 11
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 12
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 13
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 14
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 15
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 16
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 17
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 18
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 19
            </div>
            <div class="configuration-drawer-data-box-row">
              Option 20
            </div>
          </div>
          <div class="button-wrapper">
            <div class="cancel">
              Close
            </div>
            <div class="save">
              Save
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

【讨论】:

    【解决方案2】:

    flexbox 将是一个很好的解决方案。如果您将容器设置为显示弹性,flex-direction: column; 弹性项目将填充可用空间,这将设置您的容器,然后您需要将 overflow: auto; 应用于内容溢出时要滚动的元素

    codepen 示例:https://codepen.io/tylerfowle/pen/qpNrvJ

    这是一个如何工作的简化示例

    .offcanvas-container {
      position: absolute;
      top: 0;
      right: 0;
      width: 480px;
      max-width: 100%;
      height: 100%;
      display: flex;
      flex-direction: column;
      background: lightgrey;
    }
    
    .title {
      background: grey;
      padding: 20px;
    }
    
    .list-container {
      overflow: auto;
    }
    
    .list-item {
      padding: 10px;
    }
    
    .footer {
      display: flex;
      background: grey;
      padding: 20px;
    }
    <div class='offcanvas-container'>
      <div class='title'>Dashboard Configuration</div>
      <div class='list-container'>
        <div class='list-item'>1 - List item</div>
        <div class='list-item'>2 - List item</div>
        <div class='list-item'>3 - List item</div>
        <div class='list-item'>4 - List item</div>
        <div class='list-item'>5 - List item</div>
        <div class='list-item'>6 - List item</div>
        <div class='list-item'>7 - List item</div>
        <div class='list-item'>8 - List item</div>
        <div class='list-item'>9 - List item</div>
        <div class='list-item'>10 - List item</div>
        <div class='list-item'>11 - List item</div>
        <div class='list-item'>12 - List item</div>
        <div class='list-item'>13 - List item</div>
        <div class='list-item'>14 - List item</div>
        <div class='list-item'>15 - List item</div>
        <div class='list-item'>16 - List item</div>
        <div class='list-item'>17 - List item</div>
        <div class='list-item'>18 - List item</div>
        <div class='list-item'>19 - List item</div>
        <div class='list-item'>20 - List item</div>
        <div class='list-item'>21 - List item</div>
        <div class='list-item'>22 - List item</div>
        <div class='list-item'>23 - List item</div>
        <div class='list-item'>24 - List item</div>
        <div class='list-item'>25 - List item</div>
        <div class='list-item'>26 - List item</div>
        <div class='list-item'>27 - List item</div>
        <div class='list-item'>28 - List item</div>
        <div class='list-item'>29 - List item</div>
        <div class='list-item'>30 - List item</div>
        <div class='list-item'>31 - List item</div>
        <div class='list-item'>32 - List item</div>
        <div class='list-item'>33 - List item</div>
        <div class='list-item'>34 - List item</div>
        <div class='list-item'>35 - List item</div>
        <div class='list-item'>36 - List item</div>
        <div class='list-item'>37 - List item</div>
        <div class='list-item'>38 - List item</div>
        <div class='list-item'>39 - List item</div>
        <div class='list-item'>40 - List item</div>
        <div class='list-item'>41 - List item</div>
        <div class='list-item'>42 - List item</div>
        <div class='list-item'>43 - List item</div>
        <div class='list-item'>44 - List item</div>
        <div class='list-item'>45 - List item</div>
        <div class='list-item'>46 - List item</div>
        <div class='list-item'>47 - List item</div>
        <div class='list-item'>48 - List item</div>
        <div class='list-item'>49 - List item</div>
        <div class='list-item'>50 - List item</div>
        <div class='list-item'>51 - List item</div>
        <div class='list-item'>52 - List item</div>
        <div class='list-item'>53 - List item</div>
        <div class='list-item'>54 - List item</div>
        <div class='list-item'>55 - List item</div>
        <div class='list-item'>56 - List item</div>
        <div class='list-item'>57 - List item</div>
        <div class='list-item'>58 - List item</div>
        <div class='list-item'>59 - List item</div>
        <div class='list-item'>60 - List item</div>
      </div>
      <div class='footer'>
        <div class='button'>save</div>
        <div class='button'>close</div>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2014-07-23
      • 2011-12-21
      • 2010-10-22
      相关资源
      最近更新 更多