想象一下以下布局,其中圆点代表方框之间的空间:
[Left box]......[Center box]......[Right box]
当我移除右侧框时,我喜欢中心框仍然位于中心,如下所示:
[Left box]......[Center box].................
如果我要删除左框,也是如此。
................[Center box].................
现在,当中心框内的内容变得更长时,它将占用尽可能多的可用空间,同时保持居中。左侧和右侧的框永远不会缩小,因此当没有空间时,overflow:hidden
和text-overflow: ellipsis
将生效以打破内容;
[Left box][Center boxxxxxxxxxxxxx][Right box]
以上所述是我理想的情况,但我不知道如何实现这一效果。因为当我创建一个像这样的flex结构时:
.parent {
display : flex; // flex box
justify-content : space-between; // horizontal alignment
align-content : center; // vertical alignment
}
如果左右框的大小完全相同,我会得到所需的效果。然而,当其中一个来自不同的尺寸时,居中的盒子不再真正居中。
有没有人可以帮助我?
更新
justify-self
会很好,这是理想的:
.leftBox {
justify-self : flex-start;
}
.rightBox {
justify-self : flex-end;
}
答案 0 :(得分:74)
如果左右框的大小完全相同,我会得到所需的效果。然而,当两者中的一个是不同尺寸时,居中的盒子不再真正居中。有没有人可以帮助我?
这是一种使用flexbox将中间项目居中的方法,无论兄弟姐妹的宽度如何。
主要特点:
使用嵌套的flex容器和auto
边距:
.container {
display: flex;
}
.box {
flex: 1;
display: flex;
justify-content: center;
}
.box:first-child > span { margin-right: auto; }
.box:last-child > span { margin-left: auto; }
/* non-essential */
.box {
align-items: center;
border: 1px solid #ccc;
background-color: lightgreen;
height: 40px;
}
p {
text-align: center;
margin: 5px 0 0 0;
}
<div class="container">
<div class="box"><span>short text</span></div>
<div class="box"><span>centered text</span></div>
<div class="box"><span>loooooooooooooooong text</span></div>
</div>
<p>↑<br>true center</p>
以下是它的工作原理:
.container
)是一个弹性容器。.box
)现在都是一个弹性项目。.box
项目都会flex: 1
,以便平均分配容器空间(more details)。justify-content: center
。span
元素都是一个居中的灵活项目。auto
页边距向左和向右移动span
。您也可以放弃justify-content
并仅使用auto
页边距。
但是justify-content
可以在这里工作,因为auto
页边距始终具有优先权。
8.1. Aligning with
auto
margins在通过
justify-content
和align-self
进行对齐之前 正空闲空间被分配到该维度的自动边距。
答案 1 :(得分:18)
flex: 1
设置为第一个和最后一个。这使得它们平等地增长以填充中间留下的可用空间。但是,如果第一个或最后一个项目的内容较宽,则该Flex项目也会因新的min-width: auto
初始值而增长。
注意Chrome似乎无法正确实现此功能。但是,您可以将min-width
设置为-webkit-max-content
或-webkit-min-content
,它也会有效。
只有在这种情况下,中间元素才会被推出中心。
.outer-wrapper {
display: flex;
}
.item {
background: lime;
margin: 5px;
}
.left.inner-wrapper, .right.inner-wrapper {
flex: 1;
display: flex;
min-width: -webkit-min-content; /* Workaround to Chrome bug */
}
.right.inner-wrapper {
justify-content: flex-end;
}
.animate {
animation: anim 5s infinite alternate;
}
@keyframes anim {
from { min-width: 0 }
to { min-width: 100vw; }
}
&#13;
<div class="outer-wrapper">
<div class="left inner-wrapper">
<div class="item animate">Left</div>
</div>
<div class="center inner-wrapper">
<div class="item">Center</div>
</div>
<div class="right inner-wrapper">
<div class="item">Right</div>
</div>
</div>
<!-- Analogous to above --> <div class="outer-wrapper"><div class="left inner-wrapper"><div class="item">Left</div></div><div class="center inner-wrapper"><div class="item animate">Center</div></div><div class="right inner-wrapper"><div class="item">Right</div></div></div><div class="outer-wrapper"><div class="left inner-wrapper"><div class="item">Left</div></div><div class="center inner-wrapper"><div class="item">Center</div></div><div class="right inner-wrapper"><div class="item animate">Right</div></div></div>
&#13;
答案 2 :(得分:10)
关键是使用flex-basis
。那么解决方案很简单:
.parent {
display: flex;
justify-content: space-between;
}
.left, .right {
flex-grow: 1;
flex-basis: 0;
}
CodePen 可用 here。
答案 3 :(得分:8)
这是一个使用网格而不是flexbox的答案。此解决方案不需要HTML中多余的孙元素,就像接受的答案一样。即使一侧的内容足够长以溢出到中心,它也可以正常工作,这与2019年的网格答案不同。
此问题不做的一件事就是显示省略号或将多余的内容隐藏在中心框中,如问题所述。
section {
display: grid;
grid-template-columns: 1fr auto 1fr;
}
section > *:last-child {
white-space: nowrap;
text-align: right;
}
/* not essential; just for demo purposes */
section {
background-color: #eee;
font-family: helvetica, arial;
font-size: 10pt;
padding: 4px;
}
section > * {
border: 1px solid #bbb;
padding: 2px;
}
<section>
<div>left</div>
<div>center</div>
<div>right side is longer</div>
</section>
<section>
<div>left</div>
<div>center</div>
<div>right side is much, much longer</div>
</section>
<section>
<div>left</div>
<div>center</div>
<div>right side is much, much longer, super long in fact</div>
</section>
答案 4 :(得分:6)
你可以这样做:
.bar {
display: flex;
background: #B0BEC5;
}
.l {
width: 50%;
flex-shrink: 1;
display: flex;
}
.l-content {
background: #9C27B0;
}
.m {
flex-shrink: 0;
}
.m-content {
text-align: center;
background: #2196F3;
}
.r {
width: 50%;
flex-shrink: 1;
display: flex;
flex-direction: row-reverse;
}
.r-content {
background: #E91E63;
}
&#13;
<div class="bar">
<div class="l">
<div class="l-content">This is really long content. More content. So much content.</div>
</div>
<div class="m">
<div class="m-content">This will always be in the center.</div>
</div>
<div class="r">
<div class="r-content">This is short.</div>
</div>
</div>
&#13;
答案 5 :(得分:2)
这是另一种方法,在父母和孩子中使用display: flex
:
.Layout{
display: flex;
justify-content: center;
}
.Left{
display: flex;
justify-content: flex-start;
width: 100%;
}
.Right{
display: flex;
justify-content: flex-end;
width: 100%;
}
<div class = 'Layout'>
<div class = 'Left'>I'm on the left</div>
<div class = 'Mid'>Centered</div>
<div class = 'Right'>I'm on the right</div>
</div>
答案 6 :(得分:1)
使用网格可以在两行CSS中解决它,而不是默认使用flexbox,而无需在顶级子代中添加任何标记。
HTML:
.header {
display: grid;
grid-template-columns: [first] 20% auto [last] 20%;
}
.middle {
/* use either */
margin: 0 auto;
/* or */
text-align: center;
}
CSS:
SetNumberOfWorkers(0)
Flexbox摇摇欲坠,但不能解决所有问题。在这种情况下,网格显然是最干净的选择。
甚至为您的测试乐趣制作了一个Codepen: https://codepen.io/anon/pen/mooQOV
答案 7 :(得分:0)
您还可以使用这种简单的方法来实现中间元素的精确中心对齐:
.container {
display: flex;
justify-content: space-between;
}
.container .sibling {
display: flex;
align-items: center;
height: 50px;
background-color: gray;
}
.container .sibling:first-child {
width: 50%;
display: flex;
justify-content: space-between;
}
.container .sibling:last-child {
justify-content: flex-end;
width: 50%;
box-sizing: border-box;
padding-left: 100px; /* .center's width divided by 2 */
}
.container .sibling:last-child .content {
text-align: right;
}
.container .sibling .center {
height: 100%;
width: 200px;
background-color: lightgreen;
transform: translateX(50%);
}
答案 8 :(得分:0)
虽然我在这个问题上可能会迟到,但所有这些解决方案似乎都很复杂,并且可能无法奏效,具体取决于您面临的情况。
很简单,只需将要居中的组件用 position : absolute
包裹起来,同时让其他两个用 justify-content : space-between
包裹,如下所示:
CSS:
.container {
display: flex;
justify-content: space-between;
align-items: center;
background-color: lightgray;
}
.middle {
position: absolute;
margin-left: auto;
margin-right: auto;
/* You should adapt percentages here if you have a background ; else, left: 0 and right: 0 should do the trick */
left: 40%;
right: 40%;
text-align: center;
}
/* non-essential, copied from @Brian Morearty answer */
.element {
border: 1px solid #ccc;
background-color: lightgreen;
}
p {
margin: 5px;
padding: 5px;
}
<div class="container">
<p class="element">First block</p>
<p class="middle element">Middle block</p>
<p class="element">Third THICC blockkkkkkkkk</p>
</div>
答案 9 :(得分:0)
稍微更强大的网格解决方案如下所示:
.container {
overflow: hidden;
border-radius: 2px;
padding: 4px;
background: orange;
display: grid;
grid-template-columns: minmax(max-content, 1fr) auto minmax(max-content, 1fr);
}
.item > div {
display: inline-block;
padding: 6px;
border-radius: 2px;
background: teal;
}
.item:last-child > div {
float: right;
}
<div class="container">
<div class="item"><div contenteditable>edit the text to test the layout</div></div>
<div class="item"><div contenteditable>just click me and</div></div>
<div class="item"><div contenteditable>edit</div></div>
</div>
您可以在 Codepen 中看到它:https://codepen.io/benshope2234/pen/qBmZJWN
答案 10 :(得分:0)
我想要问题中显示的确切结果,我结合了 gamliela 和 Erik Martín Jordán 的答案,它最适合我。
.parent {
display: flex;
justify-content: space-between;
}
.left, .right {
flex-grow: 1;
flex-basis: 0;
}
.right {
display: flex;
justify-content: flex-end;
}