【问题标题】:Dynamic height DIV without overflowing parent container不溢出父容器的动态高度 DIV
【发布时间】:2013-08-17 12:46:40
【问题描述】:

我想在另一个包装器内有一个动态高度 div,它总是填充父容器,并通过显示垂直滚动条来自动缩小其大小,以便用户在发生溢出时滚动。

下面的插图是我所期待的:

目前内容窗格刚刚溢出包装器并将页脚窗格也推到了视线之外。

在这里提琴http://jsfiddle.net/WWcAz/1/

#wrapper{
    padding: 10px;   
    vertical-align: middle;
    background-color: cyan;
    min-height: 100px;
    height: 300px;
    max-height: 300px;    
}

#dynamic{
    background-color: green;
    overflow: auto;
    overflow-x: hidden;
    min-height: 40px;
}

纯 CSS 可以做到这一点吗?

(** 更新:) 我不希望我的包装器有任何滚动条,并且包装器必须是固定大小,希望这很清楚 - 谢谢:)

【问题讨论】:

  • 页脚在您提供的小提琴中完全可见。
  • 我不希望内容和页脚溢出包装(青色),我想要实现的是插图右侧的内容。

标签: css


【解决方案1】:

我相信这就是您所追求的结构。当然,您必须根据您的具体尺寸要求对其进行修改。

FIDDLE

HTML

<div id="wrapper">
    <div id="header">Header</div>
    <div id="content"></div>
    <div id="footer">Footer</div>    
</div>

CSS

#wrapper{
position: relative;
background: #f5f5f5;
height: 400px;
margin: 0;
padding:  10px;
}

#header, #footer{
    position: absolute;
    background: #000;
    color: #fff;
    height: 20px;
    width: 100%;
    margin-left: -10px;
}

#header{
    top: 0;
}

#footer{
    bottom: 0;
}

#content{
    position: absolute;
    top: 20px;
    bottom: 20px;
    overflow: auto;
    width: 100%;
    margin-left: -10px;
}

【讨论】:

  • 不,我不希望我的包装器有任何滚动条,并且包装器必须是固定大小。我只是希望内部动态 DIV 真的很聪明并且可以自我调整。
  • 您不能这样做,因为您将字体大小设置为 1000%(这是怎么回事?)。你必须改变它。
  • 这只是为了表明我在DIV中有一些内容,无论如何它不应该打扰这个问题(您可以删除字体样式并替换为几行数据)
  • 希望您正确理解这一点。您有一个已设置为固定高度的盒子,因此,显然您不能在该盒子内放置大于该尺寸的东西。您需要做的是应用 % heights 但同样您需要注意固定高度 div 的内容,因为内部的所有内容(高度 + 填充 + 边距)不应超过容器 div 的大小,否则它将溢出。
  • 谢谢,我完全理解你的观点。但似乎你是没有得到它的人。我希望动态 DIV 能够填充包装器 DIV 的剩余高度,并且如果包装器 DIV 中需要更多空间以显示其他信息,则能够缩小。如果内容 DIV 缩小,则应显示垂直滚动条,因此即使其高度比父框长,用户仍然可以看到所有信息。希望这是有道理的。
【解决方案2】:

我看不到您的图像(被防火墙阻止),但是按照您的描述,您可以执行以下操作:

#dynamic{
   position: absolute;
   width: 100%;
   top: 0;
   bottom: 0;
   overflow: auto;
}

#wrapper {
   position: relative;
}

通过设置position: absolute 并将topbottom 属性都设置为0,您将强制它占据offsetParent 的高度。你还告诉它,如果它的大小小于它的内容,那么让它溢出可滚动。

显然这带来了它自己的问题,因为元素必须绝对定位并从常规文档流中取出。您很可能需要进行一些重组。

【讨论】:

    【解决方案3】:

    据我所知,这只能通过 Flexbox 完成。

    FIDDLE

    (相关)CSS

    #wrapper{
        padding: 10px;   
        vertical-align: middle;
        background-color: cyan;
        min-height: 100px;
        max-height: 300px; 
        -ms-box-orient: vertical;
       display: -ms-flex;
       height: 100%;
       display: -webkit-box;   /* OLD: Safari,  iOS, Android browser, older WebKit browsers.  */
       display: -moz-flex; 
       display: -ms-flexbox;   /* MID: IE 10 */
       display: -webkit-flex;  /* NEW, Chrome 21+ */ 
       display: flex;          /* NEW: Opera 12.1, Firefox 22+ */    
    
       -ms-flex-direction: column; 
       -webkit-flex-direction: column;
       flex-direction: column;
       -moz-box-sizing: border-box;
       box-sizing: border-box;
    }
    #content
    {
        -ms-flex: 1 1 auto;
        -webkit-flex: 1 1 auto;
        flex: 1 1 auto;
        overflow: auto;
        height:0;
        min-height: 0;
    }
    

    提几点:

    0)(编辑:)为了仅在(绿色)内容上滚动,我不得不稍微更改标记以将黄色区域放在标题中。

    1) 我只对可滚动内容应用 flex-grow:1(即 flex:11 auto);其他项目可以具有固定或动态高度。

    2) 我看到 here 有一个 hack(?),将 height:0 放置在容器元素上会触发垂直滚动条。 (这里我同时使用了 height 和 min-height 因为这个 hack 只在具有 min-height 的 Firefox 中有效)

    3) 要在 Firefox this

    4) 对 flexbox 的支持在现代浏览器中出奇的好(参见 here),但您需要添加一些特定于浏览器的 css 才能使其正常工作(参见上面的小提琴)

    【讨论】:

    • 正是我想要的。谢谢丹尼尔!
    【解决方案4】:

    试试这种风格。这将产生类似于您的第二张图像的结果。我不确定你的第一个结果,完全是在 CSS 中完成的。

    body,html
    {
        height: 97%;
    }
    
    #wrapper
    {
        padding: 1%;   
        vertical-align: middle;
        background-color: cyan;
        height: 100%;   
    }
    
    #expand{
        background-color: yellow;
    
    }
    
    #dynamic{
        background-color: green;
        position : relative;
        height : 50%;
        overflow-y: scroll;
        overflow-x:hidden;
    }
    
    #header,#footer
    {
        background-color: purple;
        height: 7%;
    }
    
    #content
    {
        height: 86%;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2012-02-04
      • 2015-09-11
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多