我正在使用 Bootstrap 5.3 开发响应式布局,其中包括导航栏、侧边栏、内容面板和状态栏。该应用程序应始终为 100% 视图高度和视图宽度,并包含所有信息 无需获取页面滚动条!
ContentPanel 包含顶部的一个元素、一个具有动态值的表格和底部的一个元素。我希望表格尽可能高,而不会将其下方的元素和状态栏推到视口之外!
当我只有几行时,看起来不错,这里是一个例子:
当表格有很多行时,我的问题就出现了:表格将下面的元素和状态栏推出视口,整个页面变成垂直滚动条!这是一个例子:
当表格的内容超出 ContentPanel 的大小时,我希望在 ContentPanel 内的表格中出现一个滚动条,这样您就可以滚动表格行,而不会看不到 StatusBar。在渲染其他元素后,表格应占据 ContentPanel 的剩余高度。 到目前为止,只有当我在桌子上设置最大高度时,我才能完成这项工作,但是它变得不那么敏感,请参见此处:
[
有人可以帮我吗?这是我的 StackBlitz 示例:
height
,你就可以实现这一点,我想它的接触变化不会像内容面板那样变化。然后,将
max-height: calc(100vh - 25px);
添加到内容包装器,并将 overflow-y: auto;
添加到可滚动表格,以便滚动条出现在表格内而不是整个页面。请参阅下面的片段。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://getbootstrap.com/docs/5.3/assets/css/docs.css" rel="stylesheet" />
<title>Bootstrap Example</title>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<style>
.status {
height: 25px;
}
.content {
max-height: calc(100vh - 25px);
display: flex;
flex-direction: column;
}
.scrollable-table {
overflow-y: auto;
}
</style>
</head>
<body class="m-0 p-0 border-0 bd-example bd-example-flex">
<div class="vh-100 d-flex flex-column">
<div class="d-flex flex-grow-1">
<nav class="border p-2">NavBar</nav>
<aside class="border p-2">SideBar</aside>
<div class="border p-2 flex-grow-1 content">
ContentPanel
<div class="above-table">Element above table</div>
<div class="scrollable-table">
<table class="table" class="table-responsive">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
<th scope="col">Username</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">4</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">5</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">6</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">7</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">8</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">9</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">10</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">11</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">12</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">13</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">14</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">15</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">16</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">17</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">18</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">19</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
</div>
<div class="below-table">Element below table</div>
</div>
</div>
<div class="border status">StatusBar</div>
</div>
</body>
</html>
height: 100vh
类将
<div>
应用于包裹整个网页的 vh-100
元素。凭借其垂直柔性布局和此类,这可用于限制内部元素的大小。我们将 min-height: 0
应用于各种内部元素,以覆盖由于垂直弹性布局而默认应用的
min-height: min-content
。我们通过 max-height: 100%
应用
mh-100
,并调用垂直弹性布局来为 ContentPanel
<div>
提供其父元素的高度约束,以便内部 .scrollable-table
元素将具有收缩约束。
.scrollable-table {
overflow-y: auto;
}
.min-h-0 {
min-height: 0;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
/>
<link
href="https://getbootstrap.com/docs/5.3/assets/css/docs.css"
rel="stylesheet"
/>
<title>Bootstrap Example</title>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="m-0 p-0 border-0 bd-example bd-example-flex">
<div class="vh-100 d-flex flex-column vh-100">
<div class="d-flex flex-grow-1 min-h-0">
<nav class="border p-2">NavBar</nav>
<aside class="border p-2">SideBar</aside>
<div class="border p-2 flex-grow-1 d-flex flex-column min-h-0 mh-100">
ContentPanel
<div>Element above table</div>
<div class="scrollable-table min-h-0">
<table class="table" class="table-responsive">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
<th scope="col">Username</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">4</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">5</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">6</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">7</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">8</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">9</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">10</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">11</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">12</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">13</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">14</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">15</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">16</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">17</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">18</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">19</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">20</th>
<td>Larry</td>
<td>The Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
</div>
<div>Element below table</div>
</div>
</div>
<div class="border">StatusBar</div>
</div>
</body>
</html>