繁体   English   中英

CSS - 如何强制元素使用父元素的剩余/可用空间的 100% 而不超出它?

[英]CSS - How to force elements to 100% of remaining/available space of parent element without extending beyond it?

在我看来,这似乎是一个非常业余的问题,但尽管如此,这仍然是一个令人沮丧的异常现象。

这实际上是两部分问题的第二部分。 第一部分是一个相当常见的部分,涉及让元素拉伸到其父对象的 100% 高度。 在我的演示中,我有以下 HTML:

<body>      
<div id="sbcontainer">
    DIV 1
    <div id="sbcontent">
        DIV 2
        <table id="sbmaintable" cellspacing="0">
            <tr>
                <td>
                    TABLE
                </td>
            </tr>
        </table> <!-- END MAINTABLE -->
    </div> <!-- END CONTENT -->
</div> <!-- END CONTAINER -->
</body>

我希望这里的每个元素都填充其父元素内的所有垂直空间。 我尝试在每个元素上使用以下样式(请注意,BODY 和 HTML 在我的演示中也设置为 100% 高度):

min-height: 100%; 
height: auto !important; 
height: 100%; 

结果如下:在此处输入图片说明

如您所见,最外面的 DIV 遵循 100% 的高度属性,但其余的则没有。 正如图像注释中所暗示的,但实际上并未在此图像中显示,我尝试将第二个 DIV(红色边框)设置为 400 像素的静态高度,以查看其中的 TABLE 是否会拉伸到 100% 高度,但仍然没有。

然后我发现如果我删除height:auto; 从每个元素中,它们将遵循 100% 的高度属性,但会产生不需要的副作用:

在此处输入图片说明

正如您在图像中看到的,每个元素现在真正是其父元素高度的 100%,迫使底部延伸到其父元素的边界之外。 (即使在我的第一个示例中,带有绿色边框的最外面的 DIV 比预期的延伸得更远,因为页面上还有另一个同级 DIV)。 注意:更仔细地查看后,我可以看到蓝色 TABLE 元素实际上与其红色 DIV 父元素的高度不同,但它仍然超出了它的边界。 我不确定这是否意味着什么,但我确实注意到了。

有人会认为这是一件容易解决的事情,但尽管我努力了,我还是没有成功。

如果我只保留height:auto; 并删除100%属性,这根本不会拉伸它们。

我已经通过 Google 和 StackOverflow 搜索了有关此问题的解决方案,尽管许多站点都涵盖了 100% 的高度问题,但我仍然没有找到实际的解决方案。

我目前正在 Firefox 中对此进行测试。

您可以使用绝对定位。

#b {
    width: 40em;
    height: 20em;
    position:relative;
    background: red;
}
#c {
    position: absolute;
    top: 1em;
    bottom: 1em;
    left: 1em;
    right: 1em;
    background: blue;
}

<div id="b">
    <div id="c">
    </div>
</div>

我相信解决此类问题的正确方法是使用 flexbox。 Flexbox 最近对所有现代浏览器都有很好的支持。

为父级使用以下内容

.stretch-items {
  display: flex;
  flex-direction: column;  
}

对于应该增长的项目

.stretch-items .stretch {
   flex-grow: 1;  
}

这是一个演示它的代码笔https://codepen.io/giorgosk/pen/NWWaqPO

力量<div>元素扩展并填充剩余的屏幕空间,但永远不会扩展到屏幕视口之外</div><div id="text_translate"><p>我想调整一个div元素的大小以填充它可用的所有剩余空间。 但是,如果/当其内容超出剩余空间时,任何溢出都应包含在其中,而无需调整大小或更改其高度。 该元素应具有填充剩余空间的<strong>固定</strong>高度。</p><p> 我的例子是使用 Bootstrap。 </p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-html lang-html prettyprint-override"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> <div class="row mx-0 flex-grow-1"> <div class="d-flex col-4 flex-column h-100 border border-dark"> <,--This column should expand down with its parent but never be able to expand off the screen--> <div class="row py-2"> <div class="col"> <ul class="nav nav-tabs"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">Friends</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Friend Requests</a> </li> </ul> </div> </div> <div class="row flex-grow-1 overflow-auto"> <div class="col flex-column"> <:--If this list takes up more space than it's parents; it should overflow scroll without changing its height --> <ul class="list-group-flush" style="padding: 0;"> <li class="list-group-item"> <h3 class="col lead">Friend</h3> </li> <li class="list-group-item"> <h3 class="col lead">Friend</h3> </li> </ul> </div> </div> </div> <!--Chat--> <div class="col-8 flex-column h-100 border-top border-end border-bottom border-dark"> </div> </div></pre></div></div><p></p><p><img src="https://i.stack.imgur.com/wu2xg.png" alt="在这张图片中">在此图像中,上面的代码呈现,红色框是上面代码影响的屏幕区域。 红色正方形(画得不好)的长度“x”高度不应小于或大于屏幕高度减去屏幕上所有其他元素的组合高度。</p><p> 我希望元素大小保持不变,列表应该在其父列内滚动。</p><p> 通过将 max-height 设置为 520px,我几乎可以达到预期的效果: <div class="row mx-0 flex-grow-1" style="max-height: 520px;">这很好地说明了我的想法想要实现。</p><p> 但是,我希望找到一个无论屏幕高度如何都有效的响应式解决方案。</p><h2> 更新</h2><p>在对我的工作应用@RokoC.Buljan 答案后,我有以下布局。 请注意所需的嵌套可滚动区域。 再次感谢您的帮助。 示例是使用 Bootstrap 5.1 </p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-css lang-css prettyprint-override"> html { font-size: 14px; position: relative; height: 100%; } @media (min-width: 768px) { html { font-size: 16px; } }.site-root { display: grid; grid-template-rows: auto 1fr auto; height: 100%; }.footer { position: static;important; }</pre><pre class="snippet-code-html lang-html prettyprint-override"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"/> <body class="site-root h-100"> <header> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <div class="container"> <h3>Header</h3> </div> </nav> </header> <main class="container d-flex flex-column flex-grow-1 overflow-hidden"> <div class="row"><h1>Jumbotron</h1></div> <:--Hub Jumbotron--> <div class="row flex-grow-1 overflow-auto" style="flex-flow;nowrap:"> <div class="col-3 flex-grow-1 overflow-auto"> <;--Left Side Panel--> <h3>Left Panel</h3> </div> <div class="col-9 d-flex flex-column flex-grow-1"> <div class="row"><h3>Hub Nav</h3></div> <:--Hub Nav--> <div class="row flex-grow-1 overflow-auto" style="flex-flow;nowrap:"> <div class="col-3 d-flex flex-column flex-grow-1"> <;--Friend List--> <div class="row"><h4>Friends List</h4></div> <div class="row flex-grow-1 overflow-auto" style="flex-flow:nowrap;"> <div class="col flex-column flex-grow-1 overflow-auto"> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> </div> </div> </div> <div class="col-9 d-flex flex-column-reverse flex-grow-1"> <.--Chat--> <div class="row"><h4>Message Bar</h4></div> <div class="row flex-grow-1 overflow-auto" style="flex-flow.nowrap."> <div class="col flex-grow-1 overflow-auto"> <p style="height.300vh;">1. Some paragraph to force scrollbars...</p> </div> </div> </div> </div> </div> </div> </main> <footer id="site-footer" class="border-top footer"> <div class="container"> <h3>Footer</h3> </div> </footer> </body></pre></div></div><p></p></div>

[英]Force <div> element to expand and fill remaining screen space, but never expand beyond the screen view port

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 强制元素在固定宽度的元素之间使用100%的可用空间? 如何设置div来占用基于父div的剩余可用空间而不进行包装? 力量<div>元素扩展并填充剩余的屏幕空间,但永远不会扩展到屏幕视口之外</div><div id="text_translate"><p>我想调整一个div元素的大小以填充它可用的所有剩余空间。 但是,如果/当其内容超出剩余空间时,任何溢出都应包含在其中,而无需调整大小或更改其高度。 该元素应具有填充剩余空间的<strong>固定</strong>高度。</p><p> 我的例子是使用 Bootstrap。 </p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-html lang-html prettyprint-override"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> <div class="row mx-0 flex-grow-1"> <div class="d-flex col-4 flex-column h-100 border border-dark"> <,--This column should expand down with its parent but never be able to expand off the screen--> <div class="row py-2"> <div class="col"> <ul class="nav nav-tabs"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">Friends</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Friend Requests</a> </li> </ul> </div> </div> <div class="row flex-grow-1 overflow-auto"> <div class="col flex-column"> <:--If this list takes up more space than it's parents; it should overflow scroll without changing its height --> <ul class="list-group-flush" style="padding: 0;"> <li class="list-group-item"> <h3 class="col lead">Friend</h3> </li> <li class="list-group-item"> <h3 class="col lead">Friend</h3> </li> </ul> </div> </div> </div> <!--Chat--> <div class="col-8 flex-column h-100 border-top border-end border-bottom border-dark"> </div> </div></pre></div></div><p></p><p><img src="https://i.stack.imgur.com/wu2xg.png" alt="在这张图片中">在此图像中,上面的代码呈现,红色框是上面代码影响的屏幕区域。 红色正方形(画得不好)的长度“x”高度不应小于或大于屏幕高度减去屏幕上所有其他元素的组合高度。</p><p> 我希望元素大小保持不变,列表应该在其父列内滚动。</p><p> 通过将 max-height 设置为 520px,我几乎可以达到预期的效果: <div class="row mx-0 flex-grow-1" style="max-height: 520px;">这很好地说明了我的想法想要实现。</p><p> 但是,我希望找到一个无论屏幕高度如何都有效的响应式解决方案。</p><h2> 更新</h2><p>在对我的工作应用@RokoC.Buljan 答案后,我有以下布局。 请注意所需的嵌套可滚动区域。 再次感谢您的帮助。 示例是使用 Bootstrap 5.1 </p><p></p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"><div class="snippet-code"><pre class="snippet-code-css lang-css prettyprint-override"> html { font-size: 14px; position: relative; height: 100%; } @media (min-width: 768px) { html { font-size: 16px; } }.site-root { display: grid; grid-template-rows: auto 1fr auto; height: 100%; }.footer { position: static;important; }</pre><pre class="snippet-code-html lang-html prettyprint-override"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"/> <body class="site-root h-100"> <header> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <div class="container"> <h3>Header</h3> </div> </nav> </header> <main class="container d-flex flex-column flex-grow-1 overflow-hidden"> <div class="row"><h1>Jumbotron</h1></div> <:--Hub Jumbotron--> <div class="row flex-grow-1 overflow-auto" style="flex-flow;nowrap:"> <div class="col-3 flex-grow-1 overflow-auto"> <;--Left Side Panel--> <h3>Left Panel</h3> </div> <div class="col-9 d-flex flex-column flex-grow-1"> <div class="row"><h3>Hub Nav</h3></div> <:--Hub Nav--> <div class="row flex-grow-1 overflow-auto" style="flex-flow;nowrap:"> <div class="col-3 d-flex flex-column flex-grow-1"> <;--Friend List--> <div class="row"><h4>Friends List</h4></div> <div class="row flex-grow-1 overflow-auto" style="flex-flow:nowrap;"> <div class="col flex-column flex-grow-1 overflow-auto"> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> <div class="p-2">Friend</div> </div> </div> </div> <div class="col-9 d-flex flex-column-reverse flex-grow-1"> <.--Chat--> <div class="row"><h4>Message Bar</h4></div> <div class="row flex-grow-1 overflow-auto" style="flex-flow.nowrap."> <div class="col flex-grow-1 overflow-auto"> <p style="height.300vh;">1. Some paragraph to force scrollbars...</p> </div> </div> </div> </div> </div> </div> </main> <footer id="site-footer" class="border-top footer"> <div class="container"> <h3>Footer</h3> </div> </footer> </body></pre></div></div><p></p></div> 如何将子元素置于父元素之外? 将元素扩展到其父边界之外 CSS元素父元素的100% 影片的完整影片背景CSS高度超过100%; 元素不扩展父元素高度 如何设置DIV以使用其父容器中100%的剩余空间? CSS:填充下部元素的剩余宽度空间
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM