Flexbox:等宽项目,除非一个项目溢出它的容器?
Flexbox: Even-width items, unless one item overflows its container?
我想创建一个由两个块并排组成的布局,可能在一个弹性框中。这些块可以包含动态文本。在大多数情况下,我希望块的大小相同。通过在每个项目上设置 flex: 1,我发现这很简单。看起来像:
https://codepen.io/benrhere/pen/mdpqjJx
<ul class="flex-container">
<li class="flex-item">This is some text</li>
<li class="flex-item">This is also some text</li>
</ul>
.flex-container {
display: flex;
justify-content: stretch;
padding: 0;
margin: 0;
list-style: none;
}
但是,如果一个项目的内容超出了它的框(比如里面有更长的字符串),那么如果另一个框有额外的 space,溢出的框应该占用额外的 space(但仅在需要时)。
参见:https://codepen.io/benrhere/pen/KKZyBdj
<ul class="flex-container">
<li class="flex-item">This is some text</li>
<li class="flex-item">This is also some text which overflows</li>
</ul>
(与上面相同 CSS,并且几乎相同 HTML 但第二个字符串更长
目前,溢出是不可见的,因为盒子不能超过 50%,这是有道理的)。
是否有可能完全在 CSS 内实现这种动态行为? Flexbox 是否适合这种情况?
谢谢...
我想你在找 flex: auto
例如
.flex-container {
/* We first create a flex layout context */
display: flex;
/* Then we define the flow direction
and if we allow the items to wrap
* Remember this is the same as:
* flex-direction: row;
* flex-wrap: wrap;
*
/* Then we define how is distributed the remaining space */
justify-content: stretch;
padding: 0;
margin: 0;
list-style: none;
}
.flex-item {
flex: auto;
background: tomato;
padding: 5px;
rwidth: 0;
height: 150px;
margin: 10px;
line-height: 150px;
color: white;
font-weight: bold;
font-size: 3em;
text-align: center;
flex-grow: 1;
}
<ul class="flex-container">
<li class="flex-item">This is some text and a lot more of it</li>
<li class="flex-item">This</li>
</ul>
这将解决您的问题。
flex-basis:100%;
基本上说 flex childs 都得到了 parent(屏幕宽度)的 100% 宽度,但他们只能得到 50%,因为两个兄弟姐妹都试图得到 % 100。
您可以使用 flex-basis:50%
也可以,因为您希望所有 child 容器占屏幕宽度的 50%,但如果您转到 flex-basis:35%;
,两个容器将只使用屏幕的 70%。
white-space:nowrap;
使 div 中的文本不换行。
*,
*::before,
*::after {
box-sizing: border-box;
}
html{
font-size: 62.5%;
}
body {
min-height: 100vh;
background-color: bisque;
margin: 0;
}
ul,li
{
margin:0;
display: block;
padding: 0;
}
.flex-container {
display: flex;
flex-direction: row;
list-style: none;
}
.flex-item {
background-color: tomato;
color: white;
font-weight: bold;
font-size: 3em;
text-align: center;
margin:1rem;
padding: 1rem;
white-space:nowrap;
flex-basis: 100%;
height: 10rem;
display: flex;
flex-direction: column;
justify-content: center;
}
<div class="container">
<ul class="flex-container">
<li class="flex-item long-text">
Lorem ipsum dolor sit amet consectetur</
</li>
<li class="flex-item">
This
</li>
</ul>
</div>
我想创建一个由两个块并排组成的布局,可能在一个弹性框中。这些块可以包含动态文本。在大多数情况下,我希望块的大小相同。通过在每个项目上设置 flex: 1,我发现这很简单。看起来像: https://codepen.io/benrhere/pen/mdpqjJx
<ul class="flex-container">
<li class="flex-item">This is some text</li>
<li class="flex-item">This is also some text</li>
</ul>
.flex-container {
display: flex;
justify-content: stretch;
padding: 0;
margin: 0;
list-style: none;
}
但是,如果一个项目的内容超出了它的框(比如里面有更长的字符串),那么如果另一个框有额外的 space,溢出的框应该占用额外的 space(但仅在需要时)。 参见:https://codepen.io/benrhere/pen/KKZyBdj
<ul class="flex-container">
<li class="flex-item">This is some text</li>
<li class="flex-item">This is also some text which overflows</li>
</ul>
(与上面相同 CSS,并且几乎相同 HTML 但第二个字符串更长 目前,溢出是不可见的,因为盒子不能超过 50%,这是有道理的)。
是否有可能完全在 CSS 内实现这种动态行为? Flexbox 是否适合这种情况?
谢谢...
我想你在找 flex: auto
例如
.flex-container {
/* We first create a flex layout context */
display: flex;
/* Then we define the flow direction
and if we allow the items to wrap
* Remember this is the same as:
* flex-direction: row;
* flex-wrap: wrap;
*
/* Then we define how is distributed the remaining space */
justify-content: stretch;
padding: 0;
margin: 0;
list-style: none;
}
.flex-item {
flex: auto;
background: tomato;
padding: 5px;
rwidth: 0;
height: 150px;
margin: 10px;
line-height: 150px;
color: white;
font-weight: bold;
font-size: 3em;
text-align: center;
flex-grow: 1;
}
<ul class="flex-container">
<li class="flex-item">This is some text and a lot more of it</li>
<li class="flex-item">This</li>
</ul>
这将解决您的问题。
flex-basis:100%;
基本上说 flex childs 都得到了 parent(屏幕宽度)的 100% 宽度,但他们只能得到 50%,因为两个兄弟姐妹都试图得到 % 100。
您可以使用 flex-basis:50%
也可以,因为您希望所有 child 容器占屏幕宽度的 50%,但如果您转到 flex-basis:35%;
,两个容器将只使用屏幕的 70%。
white-space:nowrap;
使 div 中的文本不换行。
*,
*::before,
*::after {
box-sizing: border-box;
}
html{
font-size: 62.5%;
}
body {
min-height: 100vh;
background-color: bisque;
margin: 0;
}
ul,li
{
margin:0;
display: block;
padding: 0;
}
.flex-container {
display: flex;
flex-direction: row;
list-style: none;
}
.flex-item {
background-color: tomato;
color: white;
font-weight: bold;
font-size: 3em;
text-align: center;
margin:1rem;
padding: 1rem;
white-space:nowrap;
flex-basis: 100%;
height: 10rem;
display: flex;
flex-direction: column;
justify-content: center;
}
<div class="container">
<ul class="flex-container">
<li class="flex-item long-text">
Lorem ipsum dolor sit amet consectetur</
</li>
<li class="flex-item">
This
</li>
</ul>
</div>