最新的 Chrome 和 Flexbox/overflow 有问题
Problem with latest Chrome and Flexbox/overflow
我们有一个包含很多子元素的 div 元素,这在 Mac 的最新 Chrome (79) 中显示不正确。我们得到了两个滚动条,看起来列表占用了太多 space 并迫使 titlePanel 和 actionPanel 离开视口。查看屏幕截图。
我们希望 UI 占据浏览器的整个高度 window,我们希望列表元素占据剩余的 space 并在其中有一个滚动条。
正确:
不正确(注意两个蓝色面板和两个滚动条):
这在 Chrome 78 之前都可以正常工作,并且在 Mac 上的最新 Safari 中仍然可以正常工作。我们还在最新的 iOS 上对 Chrome/Safari 进行了测试,在这里它也可以工作。它不适用于 Mac 上的最新 Chrome 和三星 S10,因此我们预计 Chrome 的最新更新会引入一些变化。
但是,我不能完全确定我们的 HTML/CSS 是否正确。我们可以通过将 overflow-y:auto 添加到 contentPanel 来解决这个问题,但我预计列表元素上的溢出就足够了(直到最近的 Chrome 更新都是如此)。
是我们的 HTML/CSS 不好还是最新的 Chrome 有问题?
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
min-height: 100%;
}
.container {
width: 100%;
height: 100%;
}
.mainPanel {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: stretch;
background: blue;
}
.contentPanel {
flex: 1 1 auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
height: 100%;
/*overflow-y:auto*/;
}
.titlePanel {
flex: 0 0 auto;
}
.actionPanel {
flex: 0 0 auto;
}
.list {
height:100%;
overflow-y:auto;
background:tomato;
}
<div class="container">
<div class="mainPanel">
<div class="contentPanel">
<div class="titlePanel">TITLE</div>
<div class="list">
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
</div>
</div>
<div class="actionPanel">Actions</div>
</div>
</div>
你的 html/css 的一个问题是你的 contentPanel
有 100% height
并且你有另一个兄弟元素 (actionPanel
) 在下面。总高度超过 100%,所以你得到那个外滚动条。
快速修复是将 actionPanel
放入 contentPanel
。
或者让 contentPanel
的高度变小。
例如height: calc(100% - 18px);
我试图从您的代码中删除所有高度属性,它运行良好,正如您在显示的第一张图片中提到的那样。也许只设置一个容器 div 到 height: 100%;
将确保您想要的结果
只是想提出另一种可能的解决方案。我已经为这个问题苦苦挣扎了几个小时(这就是我来到这里的方式),事实上它只发生在 Mac 昨天更新 Chrome 之后。
我最终做的是将 .list
上的 height: 100%
替换为:
flex: 1 1 auto;
height: 0;
这似乎对 Chrome 79 有效,并且它在 Chrome、Windows 和 Safari 上仍然可以正常工作。我还没有在其他浏览器中测试过它,所以你可能想这样做。
我们有一个包含很多子元素的 div 元素,这在 Mac 的最新 Chrome (79) 中显示不正确。我们得到了两个滚动条,看起来列表占用了太多 space 并迫使 titlePanel 和 actionPanel 离开视口。查看屏幕截图。 我们希望 UI 占据浏览器的整个高度 window,我们希望列表元素占据剩余的 space 并在其中有一个滚动条。
正确:
不正确(注意两个蓝色面板和两个滚动条):
这在 Chrome 78 之前都可以正常工作,并且在 Mac 上的最新 Safari 中仍然可以正常工作。我们还在最新的 iOS 上对 Chrome/Safari 进行了测试,在这里它也可以工作。它不适用于 Mac 上的最新 Chrome 和三星 S10,因此我们预计 Chrome 的最新更新会引入一些变化。
但是,我不能完全确定我们的 HTML/CSS 是否正确。我们可以通过将 overflow-y:auto 添加到 contentPanel 来解决这个问题,但我预计列表元素上的溢出就足够了(直到最近的 Chrome 更新都是如此)。
是我们的 HTML/CSS 不好还是最新的 Chrome 有问题?
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
min-height: 100%;
}
.container {
width: 100%;
height: 100%;
}
.mainPanel {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: stretch;
background: blue;
}
.contentPanel {
flex: 1 1 auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
height: 100%;
/*overflow-y:auto*/;
}
.titlePanel {
flex: 0 0 auto;
}
.actionPanel {
flex: 0 0 auto;
}
.list {
height:100%;
overflow-y:auto;
background:tomato;
}
<div class="container">
<div class="mainPanel">
<div class="contentPanel">
<div class="titlePanel">TITLE</div>
<div class="list">
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
<div>entry</div>
</div>
</div>
<div class="actionPanel">Actions</div>
</div>
</div>
你的 html/css 的一个问题是你的 contentPanel
有 100% height
并且你有另一个兄弟元素 (actionPanel
) 在下面。总高度超过 100%,所以你得到那个外滚动条。
快速修复是将 actionPanel
放入 contentPanel
。
或者让 contentPanel
的高度变小。
例如height: calc(100% - 18px);
我试图从您的代码中删除所有高度属性,它运行良好,正如您在显示的第一张图片中提到的那样。也许只设置一个容器 div 到 height: 100%;
将确保您想要的结果
只是想提出另一种可能的解决方案。我已经为这个问题苦苦挣扎了几个小时(这就是我来到这里的方式),事实上它只发生在 Mac 昨天更新 Chrome 之后。
我最终做的是将 .list
上的 height: 100%
替换为:
flex: 1 1 auto;
height: 0;
这似乎对 Chrome 79 有效,并且它在 Chrome、Windows 和 Safari 上仍然可以正常工作。我还没有在其他浏览器中测试过它,所以你可能想这样做。