CSS居中的几种实现
无论是水平还是垂直居中,对于子元素是单行内联文本与多行内联文本及块状元素的触发方案是不同的。首先,如果父元素的高度没有写死!父元素的高度没有写死!父元素的高度没有写死!那就用方法1!最简单!
方法1:上下相同padding
条件:针对多行内容居中;
缺点:父容器固定高度不写死,否则无效;
css代码
.vertical {
padding: 20% 0;
}
如果父容器宽度写死了,再看下面的其他的方法!
方法2:line-height同高度
条件:父元素定高,元素内容为单行文本;
设置父元素的行高等于高度,line-height = height
;
缺点:仅适用于文本、图片,不适用于多行文本;
方法3:绝对定位+负margin
HTML代码
<div class="box">
<div class="vertical">haha</div>
</div>
CSS代码
.box {
width: 300px;
height: 300px;
background: #ddd;
position: relative;
margin: 0 auto;
}
.vertical {
position: absolute;
width: 60px;
height: 60px;
top: 50%;
left: 50%;
margin-left: -30px;
margin-top: -30px;
border: 1px solid red;
text-align: center;
line-height: 60px;
}
运行效果如下(本例顺带用相同方法做了水平居中):
Screen Shot 2018-01-23 at 10.12.38 AM.png总结
这个方法简单好理解,唯一的不足在于他必须已知被居中块级元素的宽高,否则也谈不上用绝对定位来调整了。
方法4:绝对定位+transform
transform
是css3带给我们的新属性,借用它可以更简单的达到对多行文本,且无需知道居中元素的宽高达到垂直居中的目的。首先我们迅速过一下本例中需要用到的translate属性。
-
translate
是一个位移属性,也就是2D平面的移动; - 相应的属性由
translate
,``translateX,
translateY`属性等; - 其值可以是单值,也可以是双值。正数表示XY轴正向位移,负数表示反向位移。需要特别注意,
transform: translate(100px);
表示的是依x轴向右位移100px距离,这点和其他CSS属性不同,不要误以为是X,T轴都位移100px,因此建议无论如何都用双值,或者translateX; - 其效果类似于relative,都是基于自身的尺寸和位置做位移;
HTML代码
<div class="box">
<div class="vertical">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </div>
</div>
CSS代码
.box {
width: 300px;
height: 300px;
background: #ddd;
position: relative;
}
.vertical {
position: absolute;
background: pink;
top: 50%;
transform: translate(0, -50%);
}
运行效果如下
Screen Shot 2018-01-23 at 10.39.09 AM.png总结
这个方法实际和上面的类似都是通过定位,但是更方便的是调位置使用了transform
属性,代码实现更为简洁,此外,另一个好处是我们不用知道居中元素的具体尺寸了,因为transform中translate偏移的百分比就是相对于元素自身的尺寸而言的。
方法5:绝对定位+margin:auto;
在写这个例子的时候,我还遇到了多行文本垂直居中的问题!当然,单行文本垂直居中我们就用line-height解决啦~
HTML代码
<div class="father">
<div class="child">
<div class="wrap">
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>
</div>
</div>
CSS代码
.father {
width: 300px;
height: 300px;
background: #ddd;
position: relative;
}
.child {
width: 70%;
height: 50%;
background: lightblue;
position: absolute;
top: 0;
bottom: 0;
margin: auto;
/*多行文本垂直居中*/
display: table;
}
.wrap {
display: table-cell;
vertical-align: middle;
}
运行效果如下
Screen Shot 2018-01-23 at 11.55.47 AM.png如上代码,即实现了盒子的垂直居中,也实现了多行文本的垂直居中,前者使用margin: auto,后者使用table-cell的方法;
方法6:多行文本用table-cell
display:table/table-cell的方法实际上等价于直接写一组
<table>``<tr>``<td>
,使用了表格的方式进行渲染,下面直接看代码!
HTML代码
<body>
<!-- 直接用table标签 -->
<!-- <table class="parent">
<tr>
<td class="child">
卬埒氝婇柟灏痻溾圪朼胗忷刱祅杋稗乇岮翞楻。艴一帣晢揎腷屮僛醍仉,耟屮洨軡敨牏乜槔丬犮。庹一臿蛌惢亶丌蜺鮇仈,梣乜玿梛匒滘乇嶈丮夗。彘佴襾嬨馰向汜一尌婒哱昑屳陎乇,嗀粞兀盱郇裺迖氕丌呦榬竑冇疘。
</td>
</tr>
</table> -->
<!-- 用table-cell -->
<div class="parent">
<div class="child">
卬埒氝婇柟灏痻溾圪朼胗忷刱祅杋稗乇岮翞楻。艴一帣晢揎腷屮僛醍仉,耟屮洨軡敨牏乜槔丬犮。庹一臿蛌惢亶丌蜺鮇仈,梣乜玿梛匒滘乇嶈丮夗。彘佴襾嬨馰向汜一尌婒哱昑屳陎乇,嗀粞兀盱郇裺迖氕丌呦榬竑冇疘。
</div>
</div>
</body>
CSS代码
/* 所以说,两种方法实现的效果是一样的,两种都理解之后,方便你的记忆! */
/* .parent{
border: 1px solid red;
height: 600px;
}
.child{
border: 1px solid green;
} */
.parent {
border: 1px solid red;
height: 60vh;
display: table;
}
.child {
display: table-cell;
vertical-align: middle;
}
这里需要说明:
- vertical-align元素仅仅对表格,inline及inline元素*有效;
- 实现步骤:父元素设置display:table,子元素设置display: table-cell,然后为需要定位的元素再增加vertical-align即可;
不定宽高实现元素水平垂直居中的两种方法
方法7:伪元素+inline-block
适用场景:不定宽高的块在水平垂直居中
HTML代码
<body>
<div class="parent">
<div class="child">
<p>
卬埒氝婇柟灏痻溾圪朼胗忷刱祅杋稗乇岮翞楻。艴一帣晢揎腷屮僛醍仉,耟屮洨軡敨牏乜槔丬犮。庹一臿蛌惢亶丌蜺鮇仈,梣乜玿梛匒滘乇嶈丮夗。彘佴襾嬨馰向汜一尌婒哱昑屳陎乇,嗀粞兀盱郇裺迖氕丌呦榬竑冇疘。
<p>
</div>
</div>
</body>
CSS代码
.parent{
border: 1px solid red;
height: 600px;
text-align: center;
}
.child{
border: 3px solid black;
display: inline-block;
width: 300px;
vertical-align: middle;
}
/*用伪元素可以省标签*/
.parent::before, .parent::after {
content:"";
/* outline: 3px solid red;
*/
display: inline-block;
height: 100%;
vertical-align: middle;
}
/* .parent .before{
outline: 3px solid red;
display: inline-block;
height: 100%;
vertical-align: middle;
}
.parent .after{
outline: 3px solid red;
display: inline-block;
height: 100%;
vertical-align: middle;
} */
效果如下
Screen Shot 2018-01-24 at 1.31.03 PM.png这个方法的原理是,在居中元素前后加上两个无内容但是占据相同空间的inline-block达到水平居中,再通过vertical-align: middle;
达到垂直居中的目的,使用伪元素可以减少在HTML中增加标签的步骤。
方法8:绝对定位+translate方法
适用场景:不定宽高的块在水平垂直居中
我利用Translate和定位相结合,制作了一个全屏『企业站』,还只是一个小demo,已练习水平垂直居中的实现为主,效果图如下:
Screen Shot 2018-01-24 at 7.53.48 PM.png最后
这是我在简书上的第一篇博客,记录了对CSS居中几种方式的实践。今后还会继续修改文章。
网友评论