【问题标题】:Why is percentage height not working on my div? [duplicate]为什么百分比高度不适用于我的 div? [复制]
【发布时间】:2015-10-22 01:28:40
【问题描述】:

我有两个高度为 90% 的 div,但显示不同。

我试图在它们周围放置一个外部 div,但这没有帮助。此外,在 Firefox、Chrome、Opera 和 Safari 上也是如此。

谁能解释我为什么会遇到这个问题?

下面是我的代码:

<div style="height: 90%">
    <div ng-controller="TabsDataCtrl" style="width: 20%; float: left;">
        <tabset>
            <tab id="tab1" heading="{{tabs[0].title}}" ng-click="getContent(0)" active="tabs[0].active"
               disabled="tabs[0].disabled">
            </tab>


            <tab id="tab2" heading="{{tabs[2].title}}" ng-click="getContent(2)" active="tabs[2].active"
                 disabled="tabs[2].disabled">
            </tab>
        </tabset>
    </div>

    <div id="leaflet_map" ng-controller="iPortMapJobController">
        <leaflet center="center" markers="markers" layers="layers" width="78%"></leaflet>
    </div>
</div>

【问题讨论】:

    标签: html css


    【解决方案1】:

    使用 CSS height 属性和百分比值

    CSS height 属性与百分比值一起使用时,是根据元素的包含块计算的。

    假设您的body 元素具有height: 1000px。那么height: 90% 的孩子将获得 900 像素。

    如果您没有为包含块设置显式高度(并且子元素不是绝对定位的),那么具有百分比高度的子元素将无事可做,高度将由内容和其他属性确定。

    来自规范:

    10.5 Content height: the height property

    百分比
    指定百分比高度。百分比是根据生成框的高度计算的 包含块。如果包含块的高度不是 明确指定并且此元素不是绝对定位的,该值计算为“自动”。

    auto
    高度取决于其他属性的值。

    因此,如果您想在 div 中使用百分比高度,请指定所有父元素的高度,包括根元素(例如,html, body {height:100%;}

    请注意,min-heightmax-height 是不可接受的。它必须是height 属性。

    这里有一个小总结:

    John:我想将 div 的高度设置为 100%
    简:100% 什么?
    约翰:100% 的容器。所以,父级上一级。
    简:好的。 div 的父级的高度是多少?
    约翰:没有。汽车,我猜。内容驱动。
    简:那么,您希望 div 具有未知变量的 100% 高度吗?
    约翰:[沉默]
    简:嘿,约翰,我可以要 50% 吗?
    约翰:50% 什么?
    简:没错!
    简:百分比是相对值。你总是要问“什么的百分比?”。通过为每个父级声明一个明确的高度,一直到bodyhtml,您可以为每个子级建立一个具有百分比高度的参考框架,从而使高度起作用。

    示例

    假设您希望 div 的高度是其父级的 50%。

    这行不通:

    <article>
        <section>
            <div style="height:50%"></div>
        </section>
    </article>
    

    这也不会:

    <article>
        <section style="height:100%">
            <div style="height:50%"></div>
        </section>
    </article>
    

    这也不会:

    <article style="height:100%">
        <section style="height:100%">
            <div style="height:50%"></div>
        </section>
    </article>
    

    这也会失败:

    <body style="height:100%">
        <article style="height:100%">
            <section style="height:100%">
                <div style="height:50%"></div>
            </section>
        </article>
    </body>
    

    现在,它终于可以工作了:

    <html style="height:100%">
        <body style="height:100%">
            <article style="height:100%">
                <section style="height:100%">
                    <div style="height:50%"></div>
                </section>
            </article>
        </body>
     </html>
    

    这也可以:

    <article>
        <section style="height: 500px">
            <div style="height:50%"></div>
        </section>
    </article>
    

    但不是这个:

    <article>
        <section style="min-height: 500px">
            <div style="height:50%"></div>
        </section>
    </article>
    

    sample code


    使用100vh

    如您所见,百分比高度有点棘手。您可以通过简单地使用视口百分比高度来避免复杂性(即,永远不必考虑父元素)。每当您想要一个框作为视口的高度时,请使用height: 100vh 而不是height: 100%。不需要其他任何东西。

    绝对定位异常

    the spec 中所述,绝对定位元素是百分比高度规则的一个例外。更多细节在这里:Applying 100% height to nested, non-flex elements

    【讨论】:

    • @Bjango,是的,这是不正确的。 HTML 元素一般默认为height: auto(内容的高度),而不是height: 100%。另一方面,块级元素的宽度默认为width: 100%(父级的宽度)。
    • 这里有更详细的解释:stackoverflow.com/a/46546152/3597276
    • 哈哈,在阅读了这个答案的摘要部分后,我觉得我刚刚读了一本 Head First CSS 书。干得好!
    • @Michael_B 唷,我真的没想到你会在几天后回答哈哈。非常感谢你的回复。好的,我将发布一个关于这个问题的正式问题,因为我已经做了一些研究并且它不是任何东西的重复(你可能已经注意到了)。在那个线程上见,我会用链接在这里联系你
    • 非常感谢您的回答!我的问题是链中有一个min-height,我不知道它会导致孩子height: 100%s 失败
    【解决方案2】:

    使用vh(视口高度)而不是百分比。它将获取浏览器的高度并相应地调整大小,例如

    height:90vh;
    

    试试这个代码

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>JS Bin</title>
    </head>
    <body>
    <div id ="wrapper">
        <div id="tabs" ng-controller="TabsDataCtrl">
            <tabset>
                <tab id="tab1" heading="{{tabs[0].title}}" ng-click="getContent(0)" active="tabs[0].active"
                   disabled="tabs[0].disabled">
                </tab>
    
    
                <tab id="tab2" heading="{{tabs[2].title}}" ng-click="getContent(2)" active="tabs[2].active"
                     disabled="tabs[2].disabled">
                </tab>
            </tabset>
        </div>
    
        <div id="leaflet_map" ng-controller="iPortMapJobController">
            <leaflet center="center" markers="markers" layers="layers"></leaflet>
        </div>
        </div>
    </body>
    </html>
    

    用css

    <style>
        #wrapper{height:60vh;}
        #tabs {width:20% float:left; height:60vh; overflow-y:scroll; overflow-x:hidden;}
        #leaflet-map{width:78%; height:60vh; overflow-y:scroll;  overflow-x:hidden;}
    </style>
    

    【讨论】:

    • 没有任何影响
    • 我稍微改变了css,它现在就像#wrapper { height: 90vh; } #tabs { 宽度:20%;向左飘浮;高度:90vh;溢出-y:滚动;溢出-x:隐藏; } #leaflet-map { 宽度:78%;浮动:对;溢出-y:滚动;溢出-x:隐藏; }
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 2011-08-05
    • 2015-07-20
    • 2019-09-30
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多