如何在 flex 布局中混合宽度和百分比 (left/right)?
How do I mix width and percentage(left/right) in flex layout?
我有 3 个积木,我需要:
- 第一个块需要 200px 宽并触摸左侧。
- 第二个块紧跟在第一个块之后,它的右边缘刚好在其容器宽度的 50% 处
- 第三个块接管 space 剩下的任何内容。
我在一些游戏引擎中做了类似的东西:
但是我怎样才能用 css 实现呢?
我不想嵌套内部 div,因为它们起着相同的作用。
我试过了,但没用:(
* {
box-sizing: border-box;
}
.wrapper {
width: 100%;
display: flex;
position: relative;
}
.wrapper > * {
height: 300px;
display block;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
width: 200px;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
right: 50%;
}
.wrapper > *:nth-child(3) {
background-color: violet;
width: 50%;
}
<div class="wrapper">
<pre>
left: 0;
width: 200px;
</pre>
<pre>
left: 200px;
right: 50%;
</pre>
<pre>
left: 50%;
right: 0;
</pre>
</div>
试试这个
* {
box-sizing: border-box;
}
body{
display: flex;
flex-direction: row;
}
.wrapper, .wrapper-1 {
width: 50%;
display: flex;
position: relative;
}
.wrapper > *, .wrapper-1 > * {
height: 300px;
margin: 0;
display: inline;
white-space: nowrap;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
flex-basis: 200px;
}
.wrapper-1 > *:nth-child(1) {
background-color: violet;
flex: 1 1 auto;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
flex: 1 1 auto;
}
.wrapper > *:nth-child(3) {
background-color: violet;
flex: 1 auto;
}
<body>
<div class="wrapper">
<pre> flex-basis: 200px;
</pre>
<pre> flex: 1 1 auto;
</pre>
</div>
<div class="wrapper-1">
<pre>flex: 1 1 auto; </pre>
</div>
</body>
您可以将 flex: 0 0 50%
设置为 第三个 child 这意味着该元素 不会 增长,收缩并且总是占据 flexbox 容器宽度的一半。
现在允许 second child 占据剩余的 space 剩下的其他两个元素你可以设置 flex-grow: 1
并设置min-width: 0
(允许它比其固有宽度进一步缩小 - 请注意,对于 flex 项目 ,默认 min-width
是自动的)。
参见下面的演示:
* {
box-sizing: border-box;
}
.wrapper {
width: 100%;
display: flex;
position: relative;
}
.wrapper > * {
height: 300px;
display: block;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
width: 200px;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
flex-grow: 1; /* grow width automatically if needed */
min-width: 0; /* allow shrinking below default width */
}
.wrapper > *:nth-child(3) {
background-color: violet;
flex: 0 0 50%; /* added */
}
<div class="wrapper">
<pre>
left: 0;
width: 200px;
</pre>
<pre>
left: 200px;
right: 50%;
</pre>
<pre>
left: 50%;
right: 0;
</pre>
</div>
我有 3 个积木,我需要:
- 第一个块需要 200px 宽并触摸左侧。
- 第二个块紧跟在第一个块之后,它的右边缘刚好在其容器宽度的 50% 处
- 第三个块接管 space 剩下的任何内容。
我在一些游戏引擎中做了类似的东西:
但是我怎样才能用 css 实现呢?
我不想嵌套内部 div,因为它们起着相同的作用。
我试过了,但没用:(
* {
box-sizing: border-box;
}
.wrapper {
width: 100%;
display: flex;
position: relative;
}
.wrapper > * {
height: 300px;
display block;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
width: 200px;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
right: 50%;
}
.wrapper > *:nth-child(3) {
background-color: violet;
width: 50%;
}
<div class="wrapper">
<pre>
left: 0;
width: 200px;
</pre>
<pre>
left: 200px;
right: 50%;
</pre>
<pre>
left: 50%;
right: 0;
</pre>
</div>
试试这个
* {
box-sizing: border-box;
}
body{
display: flex;
flex-direction: row;
}
.wrapper, .wrapper-1 {
width: 50%;
display: flex;
position: relative;
}
.wrapper > *, .wrapper-1 > * {
height: 300px;
margin: 0;
display: inline;
white-space: nowrap;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
flex-basis: 200px;
}
.wrapper-1 > *:nth-child(1) {
background-color: violet;
flex: 1 1 auto;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
flex: 1 1 auto;
}
.wrapper > *:nth-child(3) {
background-color: violet;
flex: 1 auto;
}
<body>
<div class="wrapper">
<pre> flex-basis: 200px;
</pre>
<pre> flex: 1 1 auto;
</pre>
</div>
<div class="wrapper-1">
<pre>flex: 1 1 auto; </pre>
</div>
</body>
您可以将 flex: 0 0 50%
设置为 第三个 child 这意味着该元素 不会 增长,收缩并且总是占据 flexbox 容器宽度的一半。
现在允许 second child 占据剩余的 space 剩下的其他两个元素你可以设置 flex-grow: 1
并设置min-width: 0
(允许它比其固有宽度进一步缩小 - 请注意,对于 flex 项目 ,默认 min-width
是自动的)。
参见下面的演示:
* {
box-sizing: border-box;
}
.wrapper {
width: 100%;
display: flex;
position: relative;
}
.wrapper > * {
height: 300px;
display: block;
}
.wrapper > *:nth-child(1) {
background-color: salmon;
width: 200px;
}
.wrapper > *:nth-child(2) {
background-color: khaki;
flex-grow: 1; /* grow width automatically if needed */
min-width: 0; /* allow shrinking below default width */
}
.wrapper > *:nth-child(3) {
background-color: violet;
flex: 0 0 50%; /* added */
}
<div class="wrapper">
<pre>
left: 0;
width: 200px;
</pre>
<pre>
left: 200px;
right: 50%;
</pre>
<pre>
left: 50%;
right: 0;
</pre>
</div>