元素居中的N种方法

1.行内元素居中

1.1 文本垂直居中

1.1.1 单行文本垂直居中

单行文本垂直居中是最简单的,设置line-height与盒子高度一样就可以。
这里有一个误区,很多人设置单行文本居中的时候会同时设置height与line-height相同,其实大可不必设置height,只设置line-height就可以,这时候盒子的高度由line-height撑起来,与line-height完全相同。

.center {
    // 完全可以不设置高度
    // height: 20px;
    line-height: 20px;
}

1.1.2 多行文本垂直居中

方法一:vertical-align
vertical-align可以指定行内元素的垂直对齐方式。
这种方法需要多增加一个.center元素将需要居中的内容包裹起来。设置父元素的line-height为元素的高度,居中子元素.center的display为inline-block,使其拥有行内元素的特性,因为line-height的继承性,所以设置line-height:20px;垂直居中子元素的line-height,然后设置vertical-align:middle;在盒子内垂直居中对齐。

<div class="box">
    <div class="center">
        虽然你们是扮演路人甲乙丙丁,但是一样是有生命、有灵魂的。
    </div>
</div>
<style>
.box {
    background-color: orange;
    line-height: 200px;
    width: 300px;
}
.center {
    background-color: green;
    line-height: 20px;
    display: inline-block;
    vertical-align: middle;
}
</style>

方法二:table-cell
不同于行内元素设置利用vertical-align设置会使当前元素垂直居中对齐,table-cell元素设置vertical-align会让他的子元素垂直居中对齐。就算子元素是块级元素也会垂直居中,所以想要实现块级元素的垂直居中也可以使用这个方法。

.box {
       height: 200px;
       display: table-cell;
       vertical-align: middle;
}

1.2 行内元素水平居中

text-align控制子行内元素水平对齐方式,这个非常简单直接设置text-align:center;就可以。

.center {
       text-align: center;
}

1.3 块级元素水平居中

margin的值为auto可以占据对应方向的所有剩余空间,如果设置水平方向上两个方向的margin值都为auto,两个方向就会平分剩余空间,从而实现居中。
那么为什么我们从来没有使用这个方法来实现垂直方向的居中呢?因为auto值起作用有一个前置条件,就是在对应的方向上如果不设置具体的长度,会自动铺满。很显然width是可以铺满父元素的,而height不可以。

.center {
    margin: 0 auto;
}

1.4 块级元素垂直居中

那可不可以利用margin:auto;实现垂直方向的居中呢?当然可以,可以通过修改writing-mode改变块的流动,使块横向流动,此时height方向就会默认平铺撑满,设置margin:auto;就可以实现垂直方向的居中。但是这个方法有副作用,因为writing-mode属性的可继承性,会导致该元素下得所有子元素全部流方向全部变为横向。而且此时水平方向不能再使用此方法实现居中了。

<div class="box">
    <div class="center"> 
        虽然你们是扮演路人甲乙丙丁,但是一样是有生命、有灵魂的。
    </div>
</div>
<style>
.box {
    background-color: orange;
    height: 200px;
    writing-mode: vertical-lr;;
}
.center {
    background-color: green;
    height: 50px;
    margin: auto 0;
}
</style>

1.5 水平垂直居中

1.position(居中元素宽高固定)

设置父元素绝对定位(absolute),居中元素相对定位(relative),top,left,right,bottom的值都为0。此时如果不设置具体的宽高,居中元素就会在水平和垂直两个方向都铺满父元素。此时再给他设置具体宽高再配合margin:auto;就可以实现绝对居中啦。
需要注意的是这个方法只能兼容IE8及以上浏览器,如果项目要兼容IE7可以使用下面这种方法:

.box {
    position: relative;
}
.center {
    position:absolute;
    width: 200px;
    height: 200px;
    top:0;
    bottom:0;
    left:0;
    right:0;
    margin: auto;
}

2.vertical-align

首先实现居中元素在水平方向的居中,设置居中元素的display:inline-block;,使其拥有行内元素的特性,给外层的盒元素设置text-align: center;使居中元素在水平方向上居中。
然后再实现垂直方向上的居中,这个方法需要添加一个辅助元素,设置辅助元素height:100%;使当前行框盒子的高度撑满父元素,然后设置vertical-align: middle;使其在垂直方向上居中对齐。

<div class="box">
    <div class="assist"></div>
    <div class="center"> 
        虽然你们是扮演路人甲乙丙丁,但是一样是有生命、有灵魂的。
    </div>
</div>
<style>
.box {
    background-color: orange;
    height: 200px;
    width: 500px;
    text-align: center;
}
.center {
    background-color: green;
    width: 150px;
    display: inline-block;
    vertical-align: middle;
}
.assist {
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}
</style>

3.position配合margin

这个方法适用与居中元素宽高已知的情况。设置父元素相对定位,居中元素绝对定位,left、top值都为50%,left、top的值分别相对于父元素的宽高计算,此时居中元素的左上顶点会位于父元素的正中央。然后再设置居中元素的margin-left、margin-top为宽高的负一半,让居中元素在水平方向相对于自身宽度的50%向左偏移,在垂直方向向上偏移相对于自身高度的50%,就可以实现居中效果了。

<div class="box">
    <div class="center"> 
        虽然你们是扮演路人甲乙丙丁,但是一样是有生命、有灵魂的。
    </div>
</div>
<style>
.box {
    background-color: orange;
    height: 200px;
    width: 500px;
    position: relative;
}
.center {
    background-color: green;
    width: 150px;
    height: 50px;
    position:absolute;
    top:50%;
    left:50%;
    margin-left: -75px;
    margin-top: -25px;
}
</style>

4.position配合transform

第四种方法是使用position配合transform。这种方法跟上一个方法原理上基本相似,但使用场景增加了宽高不固定的元素。一样的先设置父元素相对定位,居中元素绝对定位,left、top值都为50%。再设置居中元素transform: traslate(-50%, -50%);,translate的百分比值是相对于自身去计算的,让居中元素在水平方向相对于自身宽度的50%向左偏移,在垂直方向向上偏移相对于自身高度的50%,就可以实现居中效果了。

<div class="box">
    <div class="center"> 
        虽然你们是扮演路人甲乙丙丁,但是一样是有生命、有灵魂的。
    </div>
</div>
<style>
.box {
    background-color: orange;
    height: 200px;
    width: 500px;
    position: relative;
}
.center {
    background-color: green;
    width: 150px;
    position:absolute;
    top:50%;
    left:50%;
    transform: traslate(-50%, -50%);
}
</style>

5.flex

如果不需要考虑兼容IE9及以前的浏览器,flex布局是最推荐的方式。
设置父元素为flex容器,主轴、交叉轴对齐方向为居中对齐。

.box {
    display: flex;
    align-items: center;
    justify-content: center;
}

关于flex布局可参考http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
介绍的非常详细。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容