css实现水平垂直居中的方法

本文主要针对子元素已知宽高和未知宽高的情况下,对其进行水平垂直居中

  本文假设对如下元素进行水平垂直居中方式(父元素和子元素):

<div class="parent">
    <div class="children size"></div>
</div>

首先给他们加一个公共使用的样式(本文介绍的方法有定宽和不定宽的,所以size用来表示children的宽高)

.parent {
   border: 1px solid red;
   width: 600px;
   height: 600px;
}
.children {
    background: green;    
}
.children .zise {
    width: 200px;
    height: 200px;
}

子元素相对父元素进行绝对定位,左和上边距为50%,此时子元素左上顶点在元素的正中间,只需要让子元素的中心点在父元素正中间即可:

1. absolute + 负margin

.parent {
    position: relative;
}
.children {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -100px;
    margin-left: -100px;
}
  • 次方法兼容性较好,只是只适用于必须知道子元素的宽高

2. absolute + margin auto

通过设置各个方向距离都是0,然后再将margin设为auto

.parent {
    position: relative;
}
.children {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin: auto;
}
  • 兼容性好,可是需要知道子元素的宽高

absolute + calc

calc()属于CSS3,用于动态计算长度值。

.parent {
    position: relative;
}
.children {
    position: absolute;
    top: calc(50% - 100px);
    left: calc(50% - 100px);
}
  • 此方法属于css3,属于依赖于需要支持该语法才可以,且需要知道子元素宽高

以下方法都是子元素未知的情况:

4. absolute + transform 移动

使用css3新属性transform的translate, 其属性的百分比是相对于自身的宽和高进行移动。

.parent {
    position: relative;
}
.children {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
}

在一些浏览器中可能会出现模糊,是因为元素有可能被放置在办个像素的位置上,可通过以下方法解决此问题:
transform-style: preserve-3d;

  • 此方法需要依赖translate2d的兼容性,且不需要知道子元素宽高

5. line-height 属性

利用行内元素的属性实现居中:

.parent {
    line-height: 600px;
    text-align: center;
}
.children {
    display: inline-block;
    vertical-align: middle;
    line-height: initial;
}
  • 此时子元素文字居中显示text-align: left; /* 修正文字 */

6. writing-mode

writing-mode可以改变文字的显示方向,比如可以通过writing-mode让文字的显示变为垂直方向:

<div class="div1">水平方向</div>
<div class="div2">垂直方向</div>
.div2 {
    writing-mode: vertical-lr;
}

这样可以改变文字的显示方向
具体实现方式如下:

<div class="wp">
    <div class="wp-inner">
        <div class="box"></div>
    </div>
</div>

.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;
}

7. table

tabel单元格中的内容天然就是垂直居中的,只要添加一个水平居中属性就好了,table会增加代码的冗余性:

<table>
    <tbody>
        <tr>
            <td class="parent">
                <div class="children">子元素-表格</div>
            </td>
        </tr>
    </tbody>
</table>

.parent {
        text-align: center;
    }
.children {
    display: inline-block;
}
  • 这种方法就是代码太冗余,而且也不是table的正确用法

8. css-table

css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中:

.parent {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
}
.box {
    display: inline-block;
}

9. flex

.parent {
    display: flex;
    justify-content: center;
    align-items: center;
}
  • 移动端已完全支持flex,PC端需要看浏览器的兼容性

10. grid

css新出的网格布局,但是兼容性不好

.wp {
    display: grid;
}
.box {
    align-self: center;
    justify-self: center;
}
  • 该方法兼容性不如flex

总结:

  • PC端有兼容性要求,宽高固定,推荐absolute + margin auto
  • PC端有兼容要求,宽高不固定,推荐css-table
  • PC端无兼容性要求,推荐flex
  • 移动端推荐使用flex

注:本文主要参考此篇文章CSS实现水平垂直居中的1010种方式(史上最全)

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

推荐阅读更多精彩内容