为什么溢出-y:隐藏在我的 flex 布局中创建一个水平滚动条?

Rod*_*igo 8 html css flexbox

我有两个并排的面板。右侧的包含物种名称,不应换行(它们足够小,仅占屏幕的一小部分)。左侧面板包含更多内容,并占据了大部分屏幕。这是我的代码。

html,body {
  height: 100%;
}
body {
  display: flex;
  margin: 0;
  overflow-y: hidden;
}
#left {
  background-color: skyblue;
  flex-grow: 1;
  padding: 1em;
}
#right {
  background-color: indianRed;
	white-space: nowrap;
  padding: 1em;
  display: flex;
  flex-direction: column;
}
Run Code Online (Sandbox Code Playgroud)
<div id='left'>
Some text wide enough to compete with the red panel -- some more words needed.
</div>
<div id='right'>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

当没有滚动条时,右侧面板的宽度是正确的。但是一旦我添加了一个垂直滚动条 ( overflow-y: auto),它的宽度就会变得更小,同时也创建了一个水平滚动条。为什么?以及如何解决?我只想要垂直滚动条。面板的宽度应足以包含其上的所有文字。

html,body {
  height: 100%;
}
body {
  display: flex;
  margin: 0;
  overflow-y: hidden;
}
#left {
  background-color: skyblue;
  flex-grow: 1;
  padding: 1em;
}
#right {
  background-color: indianRed;
  white-space: nowrap;
  padding: 1em;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
}
Run Code Online (Sandbox Code Playgroud)
<div id='left'>
Some text wide enough to compete with the red panel -- some more words needed.
</div>
<div id='right'>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
<p>Some names.</p>
<p>Some names a little larger.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

Zoh*_*lak 3

您当前的 Flex 属性如下:

div#左

flex-grow:1;
flex-shrink:1;
flex-basis:auto;
Run Code Online (Sandbox Code Playgroud)

这意味着:

div 的宽度将首先填充内容,flex-basis:auto;然后填充剩余空间flex-grow:1;

div#right

flex-grow:0;
flex-shrink:1;
flex-basis:auto;
Run Code Online (Sandbox Code Playgroud)

这意味着:

div 的宽度将首先是内容flex-basis:auto;并缩小以适应flex-shrink:1;

这就是为什么在添加垂直滚动时您会看到水平滚动条,因为它会占用整体宽度。


解决方案#1

flex-basis:0;在左侧 div 上,这将使其首先填充剩余空间,然后放置内容

flex-grow:1;
flex-shrink:1;
flex-basis:auto;
Run Code Online (Sandbox Code Playgroud)
flex-grow:0;
flex-shrink:1;
flex-basis:auto;
Run Code Online (Sandbox Code Playgroud)


解决方案#2

flex-shrink:0;放在右边的 div 上,这样可以防止它缩小

html,
body {
  height: 100%;
}

body {
  display: flex;
  margin: 0;
  overflow-y: hidden;
}

#left {
  background-color: skyblue;
  flex-grow: 1;
  flex-basis: 0;
  padding: 1em;
}

#right {
  background-color: indianRed;
  white-space: nowrap;
  padding: 1em;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
}
Run Code Online (Sandbox Code Playgroud)
<div id='left'>
  Some text wide enough to compete with the red panel -- some more words needed.
</div>
<div id='right'>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

这个解决方案的问题是如果左边div的内容太长就会溢出

html,
body {
  height: 100%;
}

body {
  display: flex;
  margin: 0;
  overflow-y: hidden;
}

#left {
  background-color: skyblue;
  flex-grow: 1;
  padding: 1em;
}

#right {
  background-color: indianRed;
  white-space: nowrap;
  padding: 1em;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
}
Run Code Online (Sandbox Code Playgroud)
<div id='left'>
  Some text wide enough to compete with the red panel -- some more words needed.
</div>
<div id='right'>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
  <p>Some names.</p>
  <p>Some names a little larger.</p>
</div>
Run Code Online (Sandbox Code Playgroud)