用CSS实现元素居中的N种方法

网页布局中,元素水平居中比垂直居中简单不少,同时实现水平垂直居中也不难,难的是想出多种实现水平垂直居中的方法并从中挑选最合适最容易理解的那一个完成我们的项目。
现在是响应式设计的时代,大多数情况下我们并不知道用户浏览器尺寸,也没有办法计算元素准确的宽高等,所以将宽高等属性值固定为某个具体的px不可行。

以下是实现元素居中的几种实用方法:

1 . line-height大法好

  • 单行文本垂直居中
    如果一个标签没有定义height属性,那么其最终表现的告诉一定是由line-height起作用。网上大多说把line-height值设置为height一样的可实现单行文字的垂直居中。这句话确实是正确的,但这个height是多余的。
    示例代码:为了方便大家看,我给body加了一个边框。
<style>
        body{
            border: 10px solid black;
        }
        p {
            line-height: 50px;
            background: red;
        }
</style>
<body>
    <p>单行文本垂直居中</p>
</body>
效果图1-1
  • 多行文本垂直居中
    (1)对于高度不固定的文本,设置文本垂直居中直接使用padding就行。
效果图1-2-1

(2)对于高度固定的文本,里面的文字单行或多行显示,字体有大有小,要怎么实现垂直居中呢?

<style>
        p {
            line-height: 400px;
            border: 10px solid black;
        }

        span {
            background: red;
            display: inline-block;
            line-height: 1.4em;
            vertical-align: middle;
        }

         i{
            width: 0;
            display: inline-block;
            vertical-align: middle;
            font-size: 0;
        }    
</style>

<p>
      <span>多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,<br />
        多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,<br />多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,
        多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,多行文本垂直居中,</span><i>&nbsp</i> 
</p>
效果图1-2-2

去掉i元素,得到的效果也是相同的,所以这里有一点疑惑,先mark一下,待日后弄懂了回来补充。

  • 一张图片水平垂直居中
<style>
        p {
            border: 10px solid black;
            line-height: 400px;
            text-align: center;
        }

        img {
            vertical-align: middle;
        } 
</style>
<p>
      ![](http://upload-images.jianshu.io/upload_images/6851923-1d0bad137381a9be.jpg!qt290?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</p>
效果图1-3-1
    <style>
        a {
            border: 10px solid black;
            display: inline-block;
            text-align: center;
            vertical-align: middle;
        }

        img {
            vertical-align: middle;
            padding: 10px;
            margin: 10px;
        }
    </style>
    <a href="">![](http://upload-images.jianshu.io/upload_images/6851923-71abf5d916e8379c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    </a>
效果图3-1-2
  • 多图水平垂直居中(题外话,与line-height无关)
html代码:
<p>
    ![](http://upload-images.jianshu.io/upload_images/6851923-71abf5d916e8379c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</p>
<p>
    ![](http://upload-images.jianshu.io/upload_images/6851923-ffe49441b8fbdde9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</p>
<p>
    ![](http://upload-images.jianshu.io/upload_images/6851923-26782d6438e7bd4e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</p>
<p>
    ![](http://upload-images.jianshu.io/upload_images/6851923-1d0bad137381a9be.jpg!qt290?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</p>
<p>
    ![](http://upload-images.jianshu.io/upload_images/6851923-474e68348e2a0572.gif?imageMogr2/auto-orient/strip)
</p>
CSS代码:
p {
        background: yellow;
        width: 1em;
        height: 1em;
        padding: 0.1em;
        margin: 0.1em;
        font-size: 280px;
        float: left;
}

img {
        display: block;
        width: 100%;
        height: 100%;
        background-repeat: no-repeat;
        background-position: center;
}
效果图

2 . text-align: center; ——给行内元素的父元素设置此样式使得行内元素水平垂直居中

<style>
        p {
            border: 10px solid black;
            text-align: center;
        }
</style>
<p>
        <span>这是一段文本</span>
</p>
效果图2

3 . 块级元素水平居中margin: 0 auto;

    <style>
        p {
            border: 10px solid black;
        }
        img {
            display: block;
            width: 33%;
            margin: 0 auto;
        }
    </style>
    <p>
        ![](http://upload-images.jianshu.io/upload_images/6851923-1d0bad137381a9be.jpg!qt290?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    </p>
效果图3

4 . position & translate——绝对定位 & 偏移 实现水平垂直居中。

  • 绝对定位元素的水平垂直居中
    关键点:上下左右皆为0,margin为auto。
<style>
div{
            border: 10px solid black;
            width: 600px;
            height: 400px;
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            margin: auto;
        }
</style>
<div></div>
效果图4-1
  • 绝对定位元素的水平垂直居中-偏移法:
    关键点:left和top相对父元素,translate相对于自身。
<style>
p{
        position: absolute;          
        background: red;
        width: 200px;
        height: 200px;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
} 
</style>
<p></p>
效果图4-2

5 . display: table-cell;

关键点:需要添加额外元素作为外部容器,需要实现垂直居中的元素与其父元素都要设置vertical-align: middle;不然不能实现垂直居中。

    <style>
        * {
            padding: 0;
            margin: 0;
        }
        .center-aligned{
            display: table;
            background: #00a0ea;
            width: 100%;
            height: 300px;
        }
        .center-core{
            display: table-cell;
            text-align: center;
            vertical-align: middle;

        }
        .center-core img{
            width: 40%;
            vertical-align: middle;
            height: auto;
        }
    </style>
    <div class="center-aligned">
        <div class="center-core">
            ![](http://upload-images.jianshu.io/upload_images/6851923-1d0bad137381a9be.jpg!qt290?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        </div>
    </div>
效果图6

6 . display: flex;模型实现水平垂直居中

关键点:容器获得display:flex;属性,其他所有特性定义也都在容器元素內进行。

html代码如下:
<div id="item-container">
        <div class="circle"></div>
        <div class="square"></div>
        <div class="circle"></div>
</div>
设置基础样式:
        * {
            padding: 0;
            margin: 0;
        }

        #item-container {
            display: flex;
            background: yellow;
        }

        .circle {
            background: black;
            width: 100px;
            height: 100px;
            border-radius: 50%;
        }

        .square {
            background: #cdcdcd;
            width: 150px;
            height: 150px;
        }
效果图6-1

水平居中:

        #item-container {
            justify-content: center;
        }
效果图6-2

两端对齐:(玩一下)

        #item-container {
            justify-content: space-between;
        }
效果图6-3

垂直居中:

        #item-container {
            align-items: center;
            heigh: 200px;
        }
效果图6-4

7 . calc()——适合内容宽高为固定尺寸的场景

关键点:top: 50%;left: 50%只是将p的左上角移到了div的中心点,要实现两个中心点重合,需要得到p自身宽高的一半。

    <style>
        * {
            padding: 0;
            margin: 0;
        }
        div {
            background: green;
            position: relative;
            min-height: 400px;
        }
        p {
            background: red;
            position: absolute;
            width: 200px;
            height: 200px;
            top: calc(50% - 200px/2);
            left: calc(50% - 200px/2);
        }
    </style>
    <div>
        <p>
        </p>
    </div>
效果图7

参考资料

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,152评论 3 30
  • div水平居中的N种方法 一、单行垂直居中 如果一个容器中只有一行文字,对它实现居中相对比较简单,我们只需要设置它...
    fredah阅读 5,912评论 0 1
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 923评论 0 1
  • 参考资料 慕课网 CSS实现元素的水平居中 行内元素 1.为行内元素(文本、图片等)设置水平居中 原理 对行内元素...
    小人物的秘密花园阅读 1,968评论 0 2