admin管理员组文章数量:1399887
I have a flex-box (see the below snippet for examples).
I want to set it so that in all cases, the <h2>
is in the center of the flex-box and the other spans will flow around that, based on their markup.
I am basically looking for an align-self
CSS code, but for the main axis, not the cross axis (this might help explain what I am asking).
I am also applying margin: auto;
to my <h2>
, which I learned about after reading this (a fantastic page, but it still leaves me with my following question—unless I didn't fully understand all of it).
Here's the code I got:
.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>
I have a flex-box (see the below snippet for examples).
I want to set it so that in all cases, the <h2>
is in the center of the flex-box and the other spans will flow around that, based on their markup.
I am basically looking for an align-self
CSS code, but for the main axis, not the cross axis (this might help explain what I am asking).
I am also applying margin: auto;
to my <h2>
, which I learned about after reading this (a fantastic page, but it still leaves me with my following question—unless I didn't fully understand all of it).
Here's the code I got:
.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>
To fully reiterate my question: I want to know how to center the
<h2>
on my page so that where ever the other<span>
s are, the<h2>
will always be in the dead center of the flex-box.
P.S.: I am willing to use JavaScript and jQuery, but I would prefer a pure CSS way of achieving this.
After an answer by Michael Benjamin:
His answer got me thinking. While I have not found a way to do this, I believe the following is a step in the right direction:
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>
Basically, the theory is that while the amount of total <span>
s are unknown, it is known that there will be a total of three elements: <div><h2><div>
Share Improve this question edited Nov 28, 2022 at 22:36 Peter Mortensen 31.6k22 gold badges110 silver badges133 bronze badges asked Aug 18, 2016 at 23:28 4lackof4lackof 1,40016 silver badges35 bronze badges 0As you can see in my above snippet, I have tried (
flex: 0 0 auto
andflex: 1 1 auto
, etc.) to get it to work but have not been successful. Can anyone give me some insight as to if this is a step in the right direction and maybe how to push it through to an actual product?
2 Answers
Reset to default 6Flex alignment properties work by distributing free space in the container.
Hence, there's no single-step method to center one flex item when it shares space with other items, unless the total length of the siblings is equal on both sides.
In your second example, the total length of the spans is equal on either side of the h2
. As a result, the h2
is perfectly centered in the container.
.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>
Just keep in mind that centering the h2
with justify-content: center
(or space-around
or space-between
), only works because there is equal balance on both sides. Each pixel of difference between sides will throw off the h2
by a mensurate amount.
In your first and last examples there is a clear imbalance between sides. Standard alignment properties such as justify-content
and margin
will not work because they center within the available space, not the total space.
You could insert duplicate spans on opposite sides with visibility: hidden
to achieve equal balance. But this bloats your mark-up with semantically worthless elements.
Instead, if you have the ability to calculate the width of each span, you can insert pseudo-elements to achieve equal balance.
.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>
Ultimately, as a last resort with CSS, you can center the h2
with absolute positioning. This will remove the element from the document flow, but keep it perfectly centered in the container at all times.
.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>
UPDATE (based on revised question)
Basically, the theory is that while the amount of total
<span>
s are unknown, what is known is that there will be a total of three elements:<div><h2><div>
.
So, if we know there will always be three elements, there is a potential solution using flex properties.
.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>
Here's what's happening:
- The three elements are flex items, as their parent is a flex container
- Each item is given a
flex: 1
, which causes them to distribute container space equally among themselves. The end result is three items of equal width. - Now, centering the
h2
text in theh2
element will also center the text in the container. - Each div can be made a nested flex container, and the spans can be aligned with flex properties.
More information and solutions:
- Center and right align flexbox elements
- Keep the middle item centered when side items have different widths
One way would be to add empty spans on both sides, then set the spans and the h2 to a certain flex value, like so:
.container {
align-items: center;
border: 1px solid red;
display: flex;
justify-content: center;
width: 100%;
}
h2 {
margin: auto;
text-align: center;
flex: 3 0;
}
span{
flex: 1 0;
}
<div class="container">
<span></span>
<span></span>
<span></span>
<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>
<span></span>
<h2>I'm an h2</h2>
<span>I'm span 3</span>
<span></span>
<span></span>
</div>
So you guarantee that the space on the sides are equal. The only issue then is that you have to determine how much width you want the h2 to take.
本文标签: javascriptCenter flex item in containerwhen surrounded by other flex itemsStack Overflow
版权声明:本文标题:javascript - Center flex item in container, when surrounded by other flex items - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744229466a2596257.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论