居中问题探索

在页面布局中,居中在各种各样的场景中广泛被用到,也经常被新人提及。以前做过一些自己探索居中问题的demo,今天翻出来了,正好做一下笔记,记录一下。以后遇到问题也能快速方便快速找到。

居中包括水平居中垂直居中两种,其中水平居中相对来说容易解决,但是垂直居中有时就令人头疼了,其实也不是很难。各自都有很多方式来实现,本文主要是总结一下自己以前的demo,并不代表主流方式。另外先打个预防针,下面的例子很丑,以前做的,勿喷。

水平居中

说到水平居中,你可能立马想到的是text-align:center;或者margin:0 auto;这是最简单的水平居中方式,也是使用很广泛的水平居中方法。我们来探索一下,他俩居中能力到底有多强?

text-align:center水平居中

  1. 对直接文本子元素进行居中
<div style="width:200px;height:100px;background:#555;text-align:center">
      利用text-align对本元素文字水平对齐
</div>
利用text-align对本元素文字水平对齐
利用text-align对本元素文字水平对齐
  1. 对子div元素水平对齐
<div style="width:300px;height:300px;background:#555;text-align:center">
    <div style="width:200px;height:100px;border:1px dotted blue;background:#f00;">
        利用text-align对子div元素水平对齐
    </div>
</div>
利用text-align对子div元素水平对齐
  1. 对子span元素水平对齐
<div style="width:300px;height:300px;background:#555;text-align:center">
    <span style="background:#f00;">
      利用text-align对子span元素水平对齐
    </span>
</div>
利用text-align对子span元素水平对齐
  1. 对设置了inline的div元素水平对齐
<div style="width:300px;height:300px;background:#555;text-align:center">
    <div style="display:inline;width:200px;height:100px;border:1px dotted blue;background:#f00;">
      设置了inline的div元素水平对齐
    </div>
</div>
设置了inline的div元素水平对齐
  1. 对设置了inline-block的div元素水平对齐
<div style="width:300px;height:300px;background:#555;text-align:center">
    <div style="display:inline;width:200px;height:100px;border:1px dotted blue;background:#f00;">
      设置了inline-block的div元素水平对齐
    </div>
</div>
设置了inline-block的div元素水平对齐

小结
text-align:center具有继承性,可以使文本元素以及子元素的文本水平居中,也可以使行内元素(或者设置了display:inline/inline-block属性的块状元素)水平居中,但不能使块状元素居中。

margin:0 auto水平居中

  1. 对直接子元素进行水平居中
<div style="width:200px;height:100px;background:#555;margin: 0 auto;">
      利用margin:0 auto对文字水平对齐
</div>
```
![利用margin:0 auto对文字水平对齐](http://upload-images.jianshu.io/upload_images/3333422-e024b77af14c68d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. 对自身div元素水平对齐
````js
<div style="width:300px;height:300px;background:#555;">
      <div style="width:200px;height:100px;border:1px dotted blue;background:#f00;margin: 0 auto;">
        利用margin:0 auto对自身div元素水平对齐
    </div>
</div>
```
![利用margin:0 auto对自身div元素水平对齐](http://upload-images.jianshu.io/upload_images/3333422-0aeeb6285400439e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3. 对自身div元素水平对齐,自身元素文本宽度未知
````js
<div style="width:300px;height:300px;background:#555;">
      <div style="height:100px;border:1px dotted blue;background:#f00;margin: 0 auto;">
        利用margin:0 auto对自身div元素水平对齐,自身元素文本宽度未知
    </div>
</div>
```
![对自身div元素水平对齐,自身元素文本宽度未知](http://upload-images.jianshu.io/upload_images/3333422-4262e5e2bc813d7d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4. 对自身span元素水平对齐
````js
<div style="width:300px;height:300px;background:#555;">
    <span style="background:#f00;margin: 0 auto;">
      对自身span元素水平对齐
    </span>
</div>
```
![利用margin:0 auto对自身span元素水平对齐](http://upload-images.jianshu.io/upload_images/3333422-c659aa53b5d784d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

5. 对设置了block的span元素水平对齐
````js
<div style="width:300px;height:300px;background:#555;">
    <span style="width:200px;height:100px;display:block;background:#f00;margin: 0 auto;">
      设置了block的span元素水平对齐
    </span>
</div>
```
![利用margin:0 auto对设置了block的span元素水平对齐](http://upload-images.jianshu.io/upload_images/3333422-3344f9996116c7f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

6. 对设置inline的div元素水平对齐
````js
<div style="width:300px;height:300px;background:#555;">
    <div style="display:inline;height:100px;border:1px dotted blue;background:#f00;margin: 0 auto;">
      设置inline的div元素水平对齐
    </div>
</div>
```
![利用margin:0 auto对设置inline的div元素水平对齐](http://upload-images.jianshu.io/upload_images/3333422-8ada6d29b7c082d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

7. 对设置inline-block的div元素水平对齐
````js
<div style="width:500px;height:300px;background:#555;">
    <div style="display:inline;height:100px;border:1px dotted blue;background:#f00;margin: 0 auto;">
        设置inline-block的div元素水平对齐
    </div>
</div>
```
![利用margin:0 auto对设置inline-block的div元素水平对齐](http://upload-images.jianshu.io/upload_images/3333422-19ce1f22a18f7168.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**小结**

**margin:0 auto;**没有继承性,只能使已知宽度的块状元素水平居中,且该块状元素为其本身。

除了以上``margin:0 auto;``水平居中方式之外还有可以使用postion配合margin或者transform来实现块状盒子水平居中的目的。

## position配合margin或者transform水平居中

1. 对已知宽度的div元素盒子水平对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
      <div style="width:100px;height:100px;background:#f00;position:absolute;left:300px;margin-left:-50px">
        对已知宽度的div元素盒子水平对齐
      </div>
</div>
```
![对已知宽度的div元素盒子水平对齐](http://upload-images.jianshu.io/upload_images/3333422-a9cdc8eb0aeeb018.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. 对未知宽度的div元素盒子水平对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <div style="background:#f00;position:absolute;left:300px;transform: translate(-50%,0);">
      对未知宽度的div元素盒子水平对齐
     </div>
</div>
```
![对未知宽度的div元素盒子水平对齐](http://upload-images.jianshu.io/upload_images/3333422-87a309a9999e9c42.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**小节**
这种方式的水平居中,既可以是父元素**已知宽度**,也可以是父元素**未知宽度**,分别对应margin和transform。

# 垂直居中
## line-height 垂直居中
垂直居中时间很麻烦的事情,我们知道可以使用``line-height=height``可以使单行文本在父元素内垂直居中,这个很容易实现。
```js
<div style="width:500px;height:100px;background:#555;line-height:100px">
    利用line-height=height对单行文本在父元素内垂直居中
</div>
```
![利用line-height=height对单行文本在父元素内垂直居中](http://upload-images.jianshu.io/upload_images/3333422-afb7b420d8fffbca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

那么``line-height=height;``能不能使其他元素水平居中呢?我们来试一试:

1. 对子div元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;line-height:300px">
    <div style="width:500px;height:100px;background:#f00;">
      利用line-height=height对div元素盒子垂直对齐
    </div>
</div>
```
![ 利用line-height=height对div元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-60dcf2f73e8253eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. 对子span元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;line-height:300px">
    <span style="background:#f00;">
      利用line-height=height对子span元素盒子垂直对齐
    </span>
</div>
```
![ 利用line-height=height对子span元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-488e64e14f3706bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3. 设置了inline的div元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;line-height:300px">
    <div style="background:#f00;display:inline">
        设置了inline的div元素盒子垂直对齐
    </div>
</div>
```
![ 利用line-height=height对设置了inline的div元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-58e51cc06ec408a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4. 设置了inline-block的div元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;line-height:300px">
    <div style="background:#f00;display:inline-block">
      设置了inline-block的div元素盒子垂直对齐
    </div>
</div>
```
![ 利用line-height=height对设置了inline-block的div元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-5a662f326a0178dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**小结**
**line-weight:height**具有继承性,可以使文本元素以及子元素的文本垂直居中,也可以使行内元素(或者设置了display:inline属性的块状元素)垂直居中,但不能使块状元素(或设置了display:inline-block属性的块状元素)居中。

## position配合margin或者transform

1. 对已知高度div元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <div style="width:100px;height:100px;background:#f00;position:absolute;top:50%;margin-top:-50px">
        利用position对已知高度div元素盒子垂直对齐
    </div>
</div>
```
![ 利用position对已知高度div元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-b7b3fa3ec1d6e5ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. 对未知高度span元素盒子垂直对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <span style="background:#f00;position:absolute;top:50%;transform: translate(0,-50%);">
        利用position对未知高度span元素盒子垂直对齐
    </span>
</div>
```
![ 利用position对未知高度span元素盒子垂直对齐](http://upload-images.jianshu.io/upload_images/3333422-ed91b2dc1cc6b49a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**小结**
同样,利用很牛X的position配合margin或者transform来使已知高度或者未知高度的元素进行垂直居中。

# 垂直水平居中
垂直水平居中就是对上面两种居中方式的综合利用,不在解释,直接上例子:


1. 对已知宽高的div元素盒子垂直水平对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <div style="width:100px;height:100px;background:#f00;position:absolute;left:50%;top:50%;margin-left:-50px;margin-top:-50px">
        利用position和margin对已知宽高的div元素盒子垂直水平对齐
    </div>
</div>
```
![ 对已知宽高的div元素盒子垂直水平对齐](http://upload-images.jianshu.io/upload_images/3333422-a5f923b5a4de7e65.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. 对未知宽高div元素盒子垂直水平对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <div style="background:#f00;position:absolute;left:50%;top:50%;transform: translate(-50%,-50%);">
        利用position和margin对未知宽高div元素盒子垂直水平对齐
    </div>
</div>
```
![ 对未知宽高div元素盒子垂直水平对齐](http://upload-images.jianshu.io/upload_images/3333422-cc1769665725f99f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3. 利用left:0;top:0;bottom:0;right:0;margin:auto对盒子垂直水平对齐
````js
<div style="width:600px;height:300px;background:#555;position:relative">
    <div style="width: 200px;height:100px;background:#f00;position:absolute;left:0;top:0;bottom:0;right:0;margin:auto">
        利用left:0;top:0;bottom:0;right:0;margin:auto对盒子垂直水平对齐
    </div>
</div>
```
![ 利用left:0;top:0;bottom:0;right:0;margin:auto对盒子垂直水平对齐](http://upload-images.jianshu.io/upload_images/3333422-6fe71129eaec73c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4. 利用display:table-cell;vertical-align:middle;text-align:center;对inline-block盒子垂直水平对齐
````js
<div style="width:600px;height:300px;background:#555;display:table-cell;vertical-align:middle;text-align:center">
    <div style="width: 200px;height:100px;background:#f00;vertical-align:middle;display:inline-block">
        利用display:table-cell;vertical-align:middle;text-align:center;对inline-block盒子垂直水平对齐
    </div>
</div>
```
![ 利用display:table-cell;vertical-align:middle;text-align:center;对inline-block盒子垂直水平对齐](http://upload-images.jianshu.io/upload_images/3333422-e4d59f57ec32bb03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,099评论 3 30
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 888评论 0 1
  • •前端面试题汇总 一、HTML和CSS 21 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? ...
    Simon_s阅读 2,199评论 0 8
  • 今实在无法入睡,就翻来覆去的。看到有一个叫间书的app,闲来无事就看看,发现看了这篇蛮有意思的文章。房间里很静,静...
    万跳得阅读 120评论 0 0