css - CSS flex:防止孙子溢出(即强制滚动)
问题描述
鉴于以下情况:
<main>
<h1>Hello World</h1>
<nav><button>Home</button> - <button>Contact</button> - <button>About</button></nav>
<br>
<div class=wrapper>
<b>List header</b>
<ul></ul>
</div>
</main>
如何强制ul
滚动,而不是溢出main
也不.wrapper
?即,滚动条应该出现在ul
, not main
, nor.wrapper
上。没有硬编码值。
我尝试了以下 CSS,但失败了。如果我试图滚动它会起作用.wrapper
,但我试图滚动它的孩子。
main {
display: flex;
flex-direction: column;
max-height: 100vh;
}
.wrapper {
flex: 1;
}
ul {
overflow: auto; /* How to force this to scroll? */
}
代码笔: https ://codepen.io/mustafa0x/pen/oNLXyxm
解决方案
block
默认情况下,元素会尽可能地增长。这就是为什么您的ul
元素不显示任何条形的原因。
尝试设置一个高度,就像height: 150px
你会看到一些滚动条。
// Lorem ipsum
const $ = q => document.querySelector(q);
const url = 'https://baconipsum.com/api/?type=all-meat&sentences=100';
fetch(url).then(r => r.json()).then(data => {
$('ul').innerHTML = data[0].split('. ').map(l => '<li>' + l).join('\n');
});
main {
display: flex;
flex-direction: column;
max-height: 100vh;
/* Styling */
max-width: 600px;
margin: 0 auto;
text-align: center;
}
.wrapper {
flex: 1;
}
ul {
overflow: auto; /* How to force this to scroll? */
height: 150px;
/* Styling */
text-align: left;
}
<main>
<h1>Hello World</h1>
<nav><button>Home</button> - <button>Contact</button> - <button>About</button></nav>
<br>
<div class=wrapper>
<b>List header</b>
<ul></ul>
</div>
</main>
由于不允许使用固定值,也不允许修改 HTML,您可以做的是引入另一个 flex。
弹性项目,默认情况下,有min-height: auto
. 这意味着弹性项目不能小于其内容的大小。
要覆盖它,你需要设置min-height: 0
你的弹性项目,在这种情况下.wrapper
。这将导致.wrapper
直到屏幕结束。
但是,该ul
元素将继续增加。为了防止这种情况,在不使用固定单位的情况下,您还需要将其转换.wrapper
为列导向的弹性框。
// Lorem ipsum
const $ = q => document.querySelector(q);
const url = 'https://baconipsum.com/api/?type=all-meat&sentences=100';
fetch(url).then(r => r.json()).then(data => {
$('ul').innerHTML = data[0].split('. ').map(l => '<li>' + l).join('\n');
});
main {
display: flex;
flex-direction: column;
max-height: 100vh;
max-width: 600px;
margin: 0 auto;
text-align: center;
}
.wrapper {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
ul {
overflow: auto; /* How to force this to scroll? */
text-align: left;
}
<main>
<h1>Hello World</h1>
<nav><button>Home</button> - <button>Contact</button> - <button>About</button></nav>
<br>
<div class=wrapper>
<b>List header</b>
<ul></ul>
</div>
</main>
推荐阅读
- excel - 如果现在在 IF 公式中添加值,则保持单元格空白
- powerbi - 如何从 csv、excel 或 db 为 Powerbi 中的列或表列表添加描述?
- wpf - 从 WPF 应用程序执行 OAuth 身份验证
- android - 当图像不适合屏幕时缩小图像
- html - 如何将文本移动到框的末尾?
- sql - 用于 Laravel 的 Firebase 与 Google Cloud SQL
- python - 在python中读取csv文件
- mysql - 关于连接表的 SQL
- eclipse - 如何在 Eclipse(氧气版本)中以编程方式关闭索引器?
- mongodb - 如何为 MongoDb 调用注入 spring aop 建议?