CSS 居中的常见实现方式

居中是很常见的网页布局,包括水平居中和垂直居中,看起来似乎很简单,但每次到实际用的时候总会发现“咦,怎么不 work”,到底是哪里出了差错,明明这样是可以的啊?

不知道你有没有这种经历,反正我是经常有,所以这里整理一下我们平时常见的居中场景以及分别实现水平居中和垂直居中的方法。

常见的居中场景

  • 文本居中
  • div 中的 div 居中
  • button 居中
  • 图片居中

其中垂直居中还包括元素高度固定和不定两种。

水平居中

水平居中比较简单,主要实现方法如下。

  • 对于行内元素可以直接设置父元素为 text-align: center;即可,对于文本居中、button 居中、图片居中均适用。

  • 对于块级元素或者是 inline-block 的元素可以借助子元素的 margin 值来实现,设置子元素为 margin: 0 auto; 即可。

如果内层元素有多个的话想要整体居中怎么做呢,做法大致相同。

这种情况下内层元素一般有设置宽度,因为如果是块级元素的话默认占满整行,这样是谈不上居中的。

将内层的元素设置为 display: inline-block; 使其居于一行,然后外层元素设置 text-align: center;,如下图:

  • 若子元素包含float:left属性,为了让子元素水平居中,则可让父元素宽度设置为 fit-content,并且配合margin, 作如下设置:
.parent{
    width: -moz-fit-content;
    width: -webkit-fit-content;
    width: fit-content;
    margin: 0 auto;
}

fit-content 是 CSS3 中给 width 属性新加的一个属性值,它配合 margin 可以轻松实现水平居中, 目前只支持 Chrome 和 Firefox 浏览器

  • 使用绝对定位方式,以及负值的 margin-left, 子元素设置如下:
.son{
    position: absolute;
    width: 固定;
    left: 50%;
    margin-left: -0.5宽度;
}
  • 使用绝对定位方式, 以及 left:0;right:0;margin:0 auto; 子元素设置如下:
.son{
    position: absolute;
    width: 固定;
    left: 0;
    right: 0;
    margin: 0 auto;
}

这里解释一下为什么 leftright 要设置为 0

定位元素的宽度和水平放置满足一个等式。

left+ margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-righ + right = 包含块的宽度

默认情况下,这四个值都是 auto,会相对于其静态位置放置,所谓静态位置是指元素在浮动之前所占据的位置。在从左往右读的语言中,left 会被设置为 auto,则值为静态位置左边界距离包含块左边界的像素值,同理 right 会设置为静态位置右边界距离包含块右边界的像素值,此时刚好

left+ border-left-width + padding-left + width + padding-right + border-right-width + right = 包含块的宽度

因此左右 margin 自动变为 0,这时我们设置 margin: 0 auto; 不会有任何左右,所以需要将 leftright 设置为 0 使得 margin: 0 auto; 生效,从而实现居中。

  • 使用 CSS3 中新增的 transform 属性, 子元素设置如下:
    (这种类似于上面提到的利用绝对定位以及负值的 margin-left,同样是先根据绝对定位偏移 50%,然后往回移动自身宽度的一半达到居中)
.son{
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}
  • 使用 flex

在 Flex 出现之后,居中的实现变得简单了很多,它几乎可以解决所有的居中问题,目前主流浏览器均已支持 Flex,在某些低版本的 IE 尚不支持。

父元素设置如下:

.parent {
  display: flex;
  justify-content: center;
}
Flex 支持情况

垂直居中

垂直居中比较狡猾,经常会出现意想不到的问题。

1. 元素高度固定

  • 如果是单行文本,可以设置 line-heightheight 同高

  • 使用相对定位,父元素设置 position: relative;,子元素设置如下:

 .son{
    position:absolute;
    top:50%;
    height:固定;
    margin-top:-0.5高度;
}

or

.son{
    position:absolute;
    height:固定;
    top:0;
    bottom:0;
    margin:auto 0;
}

2. 元素高度不固定

  • 使用 vertical-align: middle;

使用 vertical-align: middle; 来达到居中也是很常见的一种做法,但是在某些情况下,我们会发现加了并没有起作用,这是因为 vertical-align: middle; 只有在某些情况下才会生效。

vertical-align: middle; 起作用的前提是元素为 inline 水平元素或者 display: table-cell; 元素,包括 spanimgspaninputbuttontd 以及通过 display 属性使之显示为 inline 或者 table-cell 的元素。这意味着,默认情况下,vertical-align: middle;divp 元素等无效。

此外,vertical-align: middle; 只有当父元素设置了 line-height 时才会起作用。(line-heightheight 同高)

vertical-align不可继承,必须对子元素单独设置

  • 使用 transform,利用父元素相对定位(position:relative),子元素设置如下:
.son {
    transform: translateY(-50%);
    position: absolute;
    top: 50%;
}
  • 使用 Flex 布局,父元素设置如下:
.parent {
  display: flex;
  align-items: center;
}

总结

水平居中的方法:

  • 文本居中使用 text-align: center;
  • 利用元素的 margin
  • 元素宽度设置为 fit-content(IE 不支持)
  • 使用绝对定位和元素的负 margin 或者 left, right, top, bottom
  • 使用绝对定位和 transform
  • 使用 Flex

垂直居中的方式:

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,754评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,450评论 5 15
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,186评论 3 30
  • 前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又有居中布局、多列布局以及全局布...
    一个敲代码的前端妹子阅读 783评论 0 12
  • 冬天的到来,意味着新年的来临。今年的冬天,雪花比以往更加的多了。大雪一夜过后,大地铺上厚厚的白衣,朋友们抑制不住自...
    1e01128ebff4阅读 349评论 0 0