在 flexbox 中制作一个 div 可滚动
Make a div scrollable inside flexbox
我有一个包含 2 个窗格的边栏。当我垂直调整 window 大小时,我希望顶部窗格动态调整大小,底部窗格保持固定大小。当侧边栏的总高度小于两个窗格时,我希望顶部窗格收缩小于其内容,并变得可滚动。
预期的行为与 VS Code 的侧边栏相同。
目前,在调整大小时,顶部窗格会将底部窗格向下“推”。
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
flex-shrink: 1;
display: flex;
flex-direction: column;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>
在代码段中使用“整页”查看大小调整行为。
在您的顶部面板上添加:
.top-panel {
overflow-y: auto;
}
基本上,您需要告诉 div 当它达到最小值时如何表现,同时显示其所有内容。
flex-shrink: 1
有助于让它知道 top-panel 应该缩小而 bottom-panel 不应该缩小,但是一旦它缩小到 children 的高度,你需要让它知道它可以进一步收缩。添加 overflow-y: auto
即可。
那应该解决了:)
将 overflow-y
属性 添加到 top-panel class 应该可以。如果内容对于 div 高度而言太大,则给它 auto 的值使其滚动。
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
flex-shrink: 1;
display: flex;
flex-direction: column;
overflow-y: auto;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>
您可以将 overflow-y: auto
添加到顶部面板,以便仅在必要时显示滚动条。
您还可以通过添加 height: 100px
等方式向底部面板添加固定尺寸。顶部面板会自动缩小以适应剩余的 space.
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
overflow-y: auto;
flex-shrink: 1;
display: flex;
flex-direction: column;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>
我有一个包含 2 个窗格的边栏。当我垂直调整 window 大小时,我希望顶部窗格动态调整大小,底部窗格保持固定大小。当侧边栏的总高度小于两个窗格时,我希望顶部窗格收缩小于其内容,并变得可滚动。
预期的行为与 VS Code 的侧边栏相同。
目前,在调整大小时,顶部窗格会将底部窗格向下“推”。
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
flex-shrink: 1;
display: flex;
flex-direction: column;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>
在代码段中使用“整页”查看大小调整行为。
在您的顶部面板上添加:
.top-panel {
overflow-y: auto;
}
基本上,您需要告诉 div 当它达到最小值时如何表现,同时显示其所有内容。
flex-shrink: 1
有助于让它知道 top-panel 应该缩小而 bottom-panel 不应该缩小,但是一旦它缩小到 children 的高度,你需要让它知道它可以进一步收缩。添加 overflow-y: auto
即可。
那应该解决了:)
将 overflow-y
属性 添加到 top-panel class 应该可以。如果内容对于 div 高度而言太大,则给它 auto 的值使其滚动。
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
flex-shrink: 1;
display: flex;
flex-direction: column;
overflow-y: auto;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>
您可以将 overflow-y: auto
添加到顶部面板,以便仅在必要时显示滚动条。
您还可以通过添加 height: 100px
等方式向底部面板添加固定尺寸。顶部面板会自动缩小以适应剩余的 space.
document.addEventListener("DOMContentLoaded", () => {
const listItem = document.querySelector(".top-panel .list-item");
for (let i = 0; i < 25; i++) {
listItem.parentNode.appendChild(listItem.cloneNode(true));
}
});
html,
body {
margin: 0;
}
.main {
margin-left: 12rem;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 12rem;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: 1px solid #454545;
}
.top-panel {
overflow-y: auto;
flex-shrink: 1;
display: flex;
flex-direction: column;
}
.bottom-panel {
flex-shrink: 0;
display: flex;
flex-direction: column;
}
.header {
background-color: #ababbc;
font-weight: 700;
}
.panel-top .list {
flex-shrink: 1;
overflow-y: auto;
}
.panel-bottom .list {
flex-shrink: 0;
}
.list-item {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<aside class="sidebar">
<div class="top-panel">
<div class="header">Top panel</div>
<div class="list">
<div class="list-item"><span>https://example.com/users/helloworld</span></div>
<!-- copied 25 times in the JS -->
</div>
</div>
<div class="bottom-panel">
<div class="header">Bottom panel</div>
<div class="list">
<div class="list-item"><span>Lorem</span></div>
<div class="list-item"><span>Ipsum</span></div>
</div>
</div>
</aside>
<main class="main">Main content</main>