CSS布局之水平居中和垂直居中

一、前言

开发中给标签(元素)设置居中的使用场景非常频繁,不同的标签类型设置方式也不同,本文旨在总结一套常用和标准的设置方式,同时也深入解析这样实现的原理。首先,我们大概来过一下一些必要的HTML知识点,有经验的童鞋可以略过。

二、HTML标签类型

1,HTML有N多标签,根据显示的类型,主要可以分为3大类。

  • 块级标签:独占一行的标签。能随时设置宽度和高度(比如div、p、h1、h2、ul、li)。
  • 行内标签(内联标签):多个行内标签能同时显示在一行。宽度和高度取决于内容的尺寸(比如span、a、label)。
  • 行内-块级标签(内联-块级标签):多个行内-块级标签可以显示在同一行。能随时设置宽度和高度(比如input、button)。

2,修改标签的显示类型。不同类型的标签在进行布局时都有它们的局限性,要么不能多行显示,要么不能设置标签的尺寸,比如说块级标签div在页面中随处可见,但是独占一行,如果我们需要它能够在多行显示,就需要修改标签的显示类型为行内-块级标签,因为行内-块级标签既可以多行显示又可以设置标签的宽高。当然我们可以根据不同的布局需求来修改标签的显示类型。在CSS中,我们可以通过display属性来达到目的,下面是它的可选取值:

  • none:隐藏标签
  • block:让标签变为块级标签
  • inline:让标签变为行内标签
  • inline-block:让标签变为行内-块级标签

三、水平居中

1. 行内标签、行内-块级标签

父标签的样式中设置:

text-align: center

在这里text-align有两个作用:

  • text-align会让所有的子标签水平居中对齐。
  • text-align是继承属性,子标签因为继承了text-align的居中属性,里面的内容也会居中对齐。
    PS:给子标签自己设置text-align,只会作用于标签中的内容的对齐方式。

2. 块级标签

1> 先上案例,在body中添加了一对div标签main,里面又嵌套了一对div标签test,我们知道块级标签独占一行,可以修改宽高尺寸,所以为了演示,我们修改main的宽度为300px,高度为200px。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML标签的居中</title>
    <style>
        #main{
            background-color: red;
            width: 300px;
            height: 200px;
        }
        .test{
            background-color: yellow;
        }
    </style>
</head>
<body>
   <div id="main">
       <div class="test">我是块级标签</div>
   </div>
</body>
</html>

显示效果如下:

块级标签水平居中演示--01

2> 我们在父标签main中添加text-align属性为center,显示效果如下:

块级标签水平居中演示--02

看起来貌似跟行内标签一样,只需要在父标签中添加text-align属性为center即可,但是块级标签可以设置宽高尺寸,所以我们来改变一下子标签test的尺寸,设置宽度为200px,再来看看样式和效果:

.test{
    background-color: yellow;
    width: 200px;
}
块级标签水平居中演示--03

我们可以发现,子标签test的内容是水平居中了,因为继承了父标签的text-align属性,但是标签自身没有水平居中。那怎么才能居中呢,我们想可不可以从标签的外边距margin入手呢,比如先设置子标签test的左外边距为auto,样式和效果如下:

.test{
    background-color: yellow;
    width: 200px;
    margin-left: auto;
}
块级标签水平居中演示--04

我们可以看到子标签test向右靠齐了,那我们想可不可以再添加一个右外边距为auto呢,样式和效果如下:

.test{
    background-color: yellow;
    width: 200px;
    margin-left: auto;
    margin-right: auto;
}
块级标签水平居中演示--05

我们可以看到子标签test终于水平居中了,达到了我们想要的效果😀。下面总结一下块级标签设置水平居中的方式,分两步:

  • 在父标签的样式中设置:
text-align: center
  • 同时在自身的样式中设置:
margin:0 auto

PS:margin-leftmargin-right 可以用margin这一个多值属性来代替,两个值时,第一个代表上下两个外边距的值,第二个代表左右两个外边距的值。

四、垂直居中

1. 行内标签、行内-块级标签

父标签的样式中添加:

line-height: height

1> line-height:内容的高度,这里的内容比如有文字或图片。
2> height:标签内容的真实高度,标准的盒子模型中真实的内容尺寸等同于padding包含的内容的尺寸(包括padding的值),IE的盒子模型中真实的内容尺寸等同于border包含的内容的尺寸(包括border的值),具体可以参考CSS盒子模型。如下样式代码:

#main{
   background-color: red;
   width: 300px;
   height: 200px;
   text-align: center;
   line-height: 200px;
}

2. 块级标签

1> 先上案例,在body中添加了一对div标签main,里面又嵌套了一对div标签test,我们知道块级标签独占一行,可以修改宽高尺寸,所以为了演示,我们修改main的宽度为300px,高度为200px。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HTML标签的居中</title>
    <style>
        #main{
            background-color: red;
            width: 300px;
            height: 200px;
            text-align: center;
            line-height: 200px;
        }
        .test{
            background-color: yellow;
            width: 200px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
   <div id="main">
       <div class="test">我是块级标签</div>
   </div>
</body>
</html>

显示效果如下:

块级标签垂直居中演示--01

看起来貌似又没问题,现在我改变一下块级标签的高度,把height改为100px,效果如下:

块级标签垂直居中演示--02

可以看到文字内容还是在中间,但是子标签test的高度已经改变了,为什么文字内容还在中间呢,这是因为父标签main设置了line-height等于height的原因,子标签test继承了父标签line-height的值,所以我们可以在子标签里面设置自身的line-height的值,样式代码和效果如下:

.test{
    background-color: yellow;
    width: 200px;
    height: 100px;
    line-height: 100px;
    margin: 0 auto;
}
块级标签垂直居中演示--03

好了,接下来需要做的是让子标签test在父标签垂直居中显示。有两种方式,第一种,用弹性布局的思想,只需在子标签test中添加下列属性:

display: flex;
flex-direction: column;
justify-content: center;

第二种,用定位的技巧来实现:

<style>
    #main{
        background-color: red;
        width: 300px;
        height: 200px;
        text-align: center;
        line-height: 200px;
        position: relative;
    }
    .test{
        background-color: yellow;
        width: 200px;
        height: 100px;
        line-height: 100px;
        margin: 0 auto;
        position: absolute;
        top:50%;
        left:50%;
        transform: translate( -50%, -50%);
    }
</style>

最终效果:


块级标签垂直居中演示--04

五、总结

最后以一张图来总结:

标签的居中

最后,如果有什么问题欢迎向我指出,谢谢。

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

推荐阅读更多精彩内容