我有一个伸缩框(请参见下面的示例片段)。
我想进行设置,以便在所有情况下,<h2>都位于 弹性框 的中心,其他跨度将根据其标记在其周围流动。
<h2>
我基本上是在寻找align-selfCSS代码,但在寻找主轴,而不是在交叉轴这可能有助于解释我的要求)。
align-self
我也正在申请margin:auto;我的<h2>,这是我在阅读本文后了解到的(很棒的页面,但仍然让我提出以下问题-除非我不完全理解所有问题)。
margin:auto;
这是我得到的代码:
.container { align-items: center; border: 1px solid red; display: flex; justify-content: center; width: 100%; } h2 { margin: auto; ] <div class="container"> <h2>I'm an h2</h2> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> <h2>I'm an h2</h2> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <h2>I'm an h2</h2> <span>I'm span 3</span> </div>
为了充分重申我的问题:我想知道如何中心在<h2>我的网页上,这样在以往任何时候其他<span>s为中,<h2>将始终处于 死 柔性盒的中心。
<span>
谢谢。
PS我愿意使用JS和jQuery,但更愿意使用纯CSS的方式来实现这一点。
更新
他的回答让我思考。尽管我还没有找到解决方法,但我相信以下是朝正确方向迈出的一步:
HTML
<div class="container"> <div> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <h2>I'm an h2</h2> <div> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> </div>
CSS
.container div { flex: 1 1 auto; text-align: center; } h2 { flex: 0 0 auto; margin: auto; } .container { align-items: center; border: 1px solid red; display: flex; justify-content: center; width: 100%; } .container div { flex: 1 1 auto; text-align: center; } h2 { flex: 0 0 auto; margin: auto; } <div class="container"> <div> </div> <h2>I'm an h2</h2> <div> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> </div> <div class="container"> <div> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <h2>I'm an h2</h2> <div> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> </div> <div class="container"> <div> <span>I'm span 1</span> <span>I'm span 2</span> </div> <h2>I'm an h2</h2> <div> <span>I'm span 3</span> </div> </div>
从根本上说,理论上说,虽然合计<span>s的数量未知,但已知总共会有三个元素:<div><h2><div>
<div><h2><div>
正如您在上面的代码段中所看到的,我已经尝试了(flex: 0 0 auto和flex:11auto等)使其正常工作,但没有成功。任何人都可以给我一些见解,以了解这是否是朝正确方向迈出的一步,以及如何将其推向实际产品?
flex: 0 0 auto
flex:11auto
再次感谢你。
Flex对齐属性通过在容器中分配可用空间来工作。
因此,当一个弹性项目与其他项目共享空间时,没有单步方法将其居中, 除非两个兄弟姐妹的总长度相等 。
在您的第二个示例中,跨度的总长度在的两侧相等h2。结果,它们h2完美地位于容器的中心。
h2
.container { display: flex; justify-content: center; align-items: center; border: 1px solid red; margin: 5px; padding: 5px; } p { text-align: center;} p > span { background-color: aqua; padding: 5px; } <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> <h2>I'm an h2</h2> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> <p><span>TRUE CENTER</span></p>
只要记住,该中心h2与justify-content: center(或space-around或space- between),只能因为双方平等的平衡。两侧差异的每个像素都将h2产生相称的误差。
justify-content: center
space-around
space- between
在您的第一个和最后一个示例中,双方之间显然存在不平衡。标准对齐属性(例如justify-content和)margin将不起作用,因为它们在 可用空间 而不是 总空间中 居中。
justify-content
margin
您可以在两侧插入重复的跨度,visibility: hidden以达到相等的平衡。但是,这会增加语义上毫无价值的元素,从而使您的标记变得肿。
visibility: hidden
相反,如果您有能力计算每个跨度的宽度,则可以插入伪元素以实现相等的平衡。
.container { display: flex; justify-content: center; align-items: center; border: 1px solid red; margin: 5px; padding: 5px; } span { flex: 0 0 75px; border: 1px dashed black; box-sizing: border-box; } div.container:first-child::before { content: ""; width: 225px; } .container:nth-child(2)::after { content: ""; width: 75px; } p { text-align: center;} p > span { background-color: aqua; padding: 5px; border: none; } <div class="container"> <h2>I'm an h2</h2> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <h2>I'm an h2</h2> <span>I'm span 3</span> </div> <p><span>TRUE CENTER</span></p>
最终,作为CSS的不得已而为之,您可以h2使用绝对定位来居中。这将从文档流中删除该元素,但始终使其始终完美地位于容器的中心。
.container { display: flex; justify-content: center; align-items: center; border: 1px solid red; position: relative; /* NEW */ height: 50px; } h2 { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); margin: 0; } .container:nth-child(1) { justify-content: flex-end; } .container:nth-child(2) > span:nth-of-type(4) { margin-left: auto; } .container:nth-child(3) > span:nth-of-type(2) { margin-right: auto; } p { text-align: center;} p > span { background-color: aqua; padding: 5px; } <div class="container"> <h2>I'm an h2</h2> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> <h2>I'm an h2</h2> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> <div class="container"> <span>I'm span 1</span> <span>I'm span 2</span> <h2>I'm an h2</h2> <span>I'm span 3</span> </div> <p><span>TRUE CENTER</span></p>
更新 (基于修订后的问题)
基本上,理论是,虽然合计<span>s的数量未知,但已知总共会有三个元素:<div><h2><div>。
因此,如果我们知道总会有三个元素,那么就有一个使用flex属性的潜在解决方案。
.container { display: flex; } .container > * { flex: 1; /* KEY RULE */ } h2 { text-align: center; margin: 0; } .container > div { display: flex; justify-content: space-around; } /* non-essential decorative styles */ .container { background-color: lightgreen; border: 1px solid #ccc; padding: 5px; } .container > * { border: 1px dashed red; } p { text-align: center;} p > span { background-color: aqua; padding: 5px; } <div class="container"> <div> <span>I'm span 1</span> <span>I'm span 2</span> <span>I'm span 3</span> </div> <h2>I'm an h2</h2> <div> <span>I'm span 4</span> <span>I'm span 5</span> <span>I'm span 6</span> </div> </div> <p><span>TRUE CENTER</span></p>
这是正在发生的事情:
flex: 1