This article brings you a summary of 10 ways to achieve horizontal and vertical centering in CSS that are worth collecting. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
Mark the key points. This is a must-have interview question. Many interviewers like to ask this question. I have been asked it several times
It seems very simple to achieve the effect of the above picture, but in fact there is a hidden secret. This article summarizes the following ways to achieve horizontal and vertical centering in CSS. This article will introduce them one by one.
Only centered elements Width and height apply
absolute negative margin
absolute margin auto
- ##absolute calc
The centered element has variable width and height
- absolute transform
- lineheight
- writing-mode
- table
- css-table
- flex
- #grid
absolute negative margin
In order to achieve the above effect, let’s do some preparatory work. Assume that the HTML code is as follows, a total of two elements, parent elements and child elements
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
wp is the class name of the parent element, box is the class name of the child element, because there is a difference between fixed width and variable width, size is used to indicate the specified width, the following are all The common code used for all effects is mainly to set the color and width and height
Note: This common code will not be repeated later, only the corresponding prompt will be given
/* 公共代码 */
.wp {
border: 1px solid red;
width: 300px;
height: 300px;
}
.box {
background: green;
}
.box.size{
width: 100px;
height: 100px;
}
/* 公共代码 */
Copy after login
The percentage of absolute positioning is relative to the width and height of the parent element. This feature allows the child element to be displayed in the center, but absolute positioning is based on the upper left corner of the child element. The desired effect is that the center of the child element is displayed
In order to correct this problem, you can use the negative value of the margin. Negative margins can position the element in the opposite direction. By specifying the margin of the sub-element as a negative value that is half the width of the sub-element, the sub-element can be centered. , the css code is as follows
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
position: relative;
}
.box {
position: absolute;;
top: 50%;
left: 50%;
margin-left: -50px;
margin-top: -50px;
}
Copy after login
This is my more commonly used method. This method is easier to understand and has good compatibility. The disadvantage is that you need to know the width and height of the child elements
Click to view the complete DEMO
absolute margin auto
This method also requires that the width and height of the centered element must be fixed. The HTML code is as follows
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
This method sets the distance in each direction. 0. At this time, if the margin is set to auto, it can be centered in all directions.
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
position: relative;
}
.box {
position: absolute;;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
Copy after login
This method is also very compatible. The disadvantage is that you need to know the width and height of the child elements
Click to view the complete DEMO
absolute calc
This method also requires that the width and height of the centered element must be fixed, so we add a size class to the box. The HTML code is as follows
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Thanks CSS3 brings calculated properties. Since the percentage of top is based on the upper left corner of the element, then just subtract half of the width. The code is as follows
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
position: relative;
}
.box {
position: absolute;;
top: calc(50% - 50px);
left: calc(50% - 50px);
}
Copy after login
The compatibility of this method depends on the compatibility of calc. Disadvantages Do you need to know the width and height of the child element
Click to view the complete DEMO
absolute transform
or absolute positioning, but this method does not require the child element to have a fixed width and height, so no more The size class is needed. The HTML code is as follows
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
To fix the absolute positioning problem, you can also use the new transform in CSS3. The translate attribute of transform can also set a percentage, which is relative to its own width and height, so It can be said that if translate is set to -50%, it can be centered. The code is as follows
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
position: relative;
}
.box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Copy after login
The compatibility of this method depends on the compatibility of translate2d
Click to view the complete DEMO
lineheight
Using the centering attribute of inline elements, you can also achieve horizontal and vertical centering. The HTML code is as follows
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Set the box as an inline element through
text-align Achieve horizontal centering, but many students may not know that it can also be vertically centered through
vertical-align, the code is as follows
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
line-height: 300px;
text-align: center;
font-size: 0px;
}
.box {
font-size: 16px;
display: inline-block;
vertical-align: middle;
line-height: initial;
text-align: left; /* 修正文字 */
}
Copy after login
This method requires text to be placed in the child element The display is reset to the desired effect
Click to view the complete DEMO
writing-mode
Many students must not know it like me
writing-mode Attribute, thanks to teacher @张鑫兴 for the feedback. Simply put, writing-mode can change the display direction of text. For example, writing-mode can be used to change the display direction of text to vertical direction
<div>水平方向</div>
<div>垂直方向</div>
Copy after login
rrreeThe display effect is as follows:
.div2 {
writing-mode: vertical-lr;
}
Copy after login
What’s more amazing is that all horizontal css attributes will become vertical attributes, such as
text-align, through
writing-mode and
text-align can achieve horizontal and vertical centering, but it is a little more troublesome
水平方向
垂
直
方
向
Copy after login
<div>
<div>
<div>123123</div>
</div>
</div>
Copy after login
This method is a little complicated to implement and understand
Click View the complete DEMO
table
Tables used to be used for page layout, but no one does this anymore, but tables can also achieve horizontal and vertical centering, but it will add a lot of redundant code
/* 此处引用上面的公共代码 */
/* 此处引用上面的公共代码 */
/* 定位代码 */
.wp {
writing-mode: vertical-lr;
text-align: center;
}
.wp-inner {
writing-mode: horizontal-tb;
display: inline-block;
text-align: center;
width: 100%;
}
.box {
display: inline-block;
margin: auto;
text-align: left;
}
Copy after login
The content in the tabel cell is naturally vertically centered. Just add a horizontal centering attribute.
This method is too redundant in code and is not the correct usage of table
点击查看完整DEMO
css-table
css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
下面通过css属性,可以让p显示的和table一样
.wp {
display: table-cell;
text-align: center;
vertical-align: middle;
}
.box {
display: inline-block;
}
Copy after login
这种方法和table一样的原理,但却没有那么多冗余代码,兼容性也还不错
点击查看完整DEMO
flex
flex作为现代的布局方案,颠覆了过去的经验,只需几行代码就可以优雅的做到水平垂直居中
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
.wp {
display: flex;
justify-content: center;
align-items: center;
}
Copy after login
目前在移动端已经完全可以使用flex了,PC端需要看自己业务的兼容性情况
点击查看完整DEMO
grid
感谢@一丝姐 反馈的这个方案,css新出的网格布局,由于兼容性不太好,一直没太关注,通过grid也可以实现水平垂直居中
<div>
<div>123123</div>
</div>
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
Copy after login
.wp {
display: grid;
}
.box {
align-self: center;
justify-self: center;
}
Copy after login
代码量也很少,但兼容性不如flex,不推荐使用
点击查看完整DEMO
总结
下面对比下各个方式的优缺点,肯定又双叒叕该有同学说回字的写法了,简单总结下
小贴士:
方法 |
居中元素定宽高固定 |
PC兼容性 |
移动端兼容性 |
absolute + 负margin |
是 |
ie6+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
absolute + margin auto |
是 |
ie6+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
absolute + calc |
是 |
ie9+, chrome19+, firefox4+ |
安卓4.4+, iOS6+ |
absolute + transform |
否 |
ie9+, chrome4+, firefox3.5+ |
安卓3+, iOS6+ |
writing-mode |
否 |
ie6+, chrome4+, firefox3.5+ |
安卓2.3+, iOS5.1+ |
lineheight |
否 |
ie6+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
table |
否 |
ie6+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
css-table |
否 |
ie8+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
flex |
否 |
ie10+, chrome4+, firefox2+ |
安卓2.3+, iOS6+ |
grid |
否 |
ie10+, chrome57+, firefox52+ |
安卓6+, iOS10.3+ |
最近发现很多同学都对css不够重视,这其实是不正确的,比如下面的这么简单的问题都有那么多同学不会,我也是很无语
<div>123</div>
<div>123</div>
Copy after login
.red {
color: red
}
.blue {
color: blue
}
Copy after login
相关推荐:
CSS实现div水平垂直居中的五种方法
css 实现DIV水平垂直居中于屏幕
The above is the detailed content of Summary of 10 ways to achieve horizontal and vertical centering with CSS worth collecting. For more information, please follow other related articles on the PHP Chinese website!