|
【一】知道居中元素的宽高
+ _3 {6 @* N3 D5 g% `6 labsolute + 负margin
# a% A, l- a6 X代码实现- .wrapBox5{ width: 300px; height: 300px; border:1px solid red; position: relative;}.wrapItem5{ width: 100px; height: 50px; position: absolute; background:yellow; top: 50%; left:50%; margin-top: -25px; margin-left: -50px;}
复制代码 运行结果! K9 I% Z9 u$ A' C1 x
% b3 A1 k8 `& g2 G" i* labsolute + margin auto
& ~1 t3 n$ L/ o代码实现- .wrapBox{ width: 300px; height: 300px; background: yellow; position: relative;}.wrapItem{ width: 100px; height: 50px; background:green; display: inline-block; position: absolute; top: 0px; bottom:0px; left: 0px; right: 0px; margin:auto;}
复制代码 6 Z. e0 `) |9 ~ a8 H1 J0 H& r
absolute + calc
' p- U+ D; s) ?( `: L代码实现- .wrapBox6{ width: 300px; height: 300px; border:1px solid green; position: relative;}.wrapItem6{ width: 100px; height: 50px; position: absolute; background:yellow; top: calc(50% - 25px); left:calc(50% - 50px);}
复制代码 运行结果
& G& P6 Q9 e, s% O4 U
: z, R, T1 V0 g/ a: J三种对比总结
! h) |8 w7 `3 h当居中元素知道宽高的时候,设置居中的方式比较简单单一。三种方法的本质是一样的,都是对居中元素进行绝对定位,在定位到上50%,左50%后再拉回居中元素的一半宽高实现真正的居中。三种方式的区别就在于拉回元素本身宽高的方式不同。' {( U: m M( n" k
【二】居中元素的宽高未知
6 T f! Z- p( k# _1 Y, Yabsolute + transform
/ j% Y0 { g4 ^0 u9 [! c: I* h: W代码实现- .wrapBox{ width: 300px; height: 300px; background:#ddd; position: relative;}.wrapItem{ width: 100px; height: 50px; background:green; position: absolute; top: 50%; left:50%; transform: translate(-50% , -50%);}
复制代码 运行结果
R- K' n( [( q* S4 Z- v- C2 `% Y5 v) E5 K, B
原理
% v I3 j8 I( K/ h* b原理类似于已知宽高的实现方式,只不过当前居中元素宽高未知,所以需要自动获取当前居中元素的宽高。translate属性正好实现了该功能。
# R7 F! w6 n& h$ K/ m1 q优缺点
( o4 g: p. J1 S0 o4 o7 A/ F优点:自动计算本身的宽高
/ X' `) L# n2 C6 `5 |' U" q& K" z缺点:如果同时使用transform的其他属性会产生相互影响。
7 ?2 [( X6 ?# U* y5 I所以:在不使用transform的其他属性时推荐使用该方式/ f' L' W! a# }& z% v, q- l4 R
flex布局- .wrapBox2{ width: 300px; height: 300px; background: blue; display: flex; justify-content: center; align-items: center;}/*注意:即使不设置子元素为行块元素也不会独占一层*/.wrapItem2{ width: 100px; height: 50px; background:green;}
复制代码运行结果 , N0 H9 M: n3 r$ n# H' G
) I8 T- p6 r. o! Z, y6 N9 }原理* j1 m6 a* H- V8 J t
将父级元素设置为流式布局,根据flex布局的属性特性,设置子元素居中。" a3 {4 k6 M( N9 A$ f5 M
优缺点
/ l7 D: K3 y( y6 ?优点:flex布局灵活,不需要对子元素进行任何的设置& `, E. G0 L5 n& y9 K
缺点:具有兼容性。子元素的float、clear、position等无法使用,如果同时具有其他布局,容易产生影响。1 `' h) ^3 D0 G+ u9 j3 J- N
table-cell布局1 t p6 _" b/ {) L
代码实现- .wrapBox3{ width: 300px; height: 300px; background: yellow; display: table-cell; vertical-align: middle; text-align: center;}.wrapItem3{ width: 100px; height: 50px; background:green; display: inline-block;}
复制代码 运行结果3 O" u' r$ T; E2 O5 f1 s. G
% b& [3 L+ A: A- ~# r. [+ O原理( j7 d3 i% y& [0 ]" C& ?4 p
根据table的vertical-align属性,可以在表格元素内设置元素居中,再根据text-align设置水平居中
) A1 m8 D4 u. k _1 u$ J" itable元素' J* F9 T0 U5 L$ P8 Y, Y a
代码实现- .tableBox{ border:2px solid yellow; width: 300px; height: 300px;}.tableBox table{ width:100%; height:100%;}.centerWrap{ text-align: center; vertical-align: middle;}.centerItem{ display: inline-block; background:pink;}
复制代码 运行结果+ `0 \# E b1 E$ E& `: l
! F! h: ^8 z3 F7 W, u总结4 ~$ {; \; q) ~ m+ ?
使用table标签进行布局,主要还是使用了vertical-align属性和text-align属性。但是相对于上一种方式,使用table标签会产生大量的冗余代码。不推荐使用
0 O7 v- N+ R, z' S% J: b" u到此这篇关于css实现元素垂直居中显示的7种方式的文章就介绍到这了,更多相关css 元素垂直居中内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!
; X9 B$ d- X4 D" ^
, \( t9 i" Z6 N# j6 A9 ~. P7 U来源:http://www.jb51.net/css/743771.html
) Q0 {4 l7 c+ {+ m免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|