web前端如何实现CSS竖向居中

目录

一、使用Flexbox实现CSS竖向居中

一、理解vertical-align或“如何竖向居中”

 1、Table单元格中的vertical-align

 2、 vertical-align在inline元素上效果

 3、 vertical-align在其它元素上的效果

三、竖向居中最简单的方法(三行CSS3代码)

四、 常见简单垂直剧中方法比较


一、使用Flexbox实现CSS竖向居中


竖向居中需要一个父元素和一个子元素合作完成

<div class="flexbox-container">

  <div class="flexbox-vert-item">Blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah </div>

  <div class="flexbox-vert-item">Blah blah blah blah blah blah blah blah blah </div>

  <div class="flexbox-vert-item">Blah blah</div>

</div>

 但为了让子元素竖向居中,你只需要对父元素施加CSS样式:

.flexbox-container {

  padding: 20px;

  background: #eee;

  display: -ms-flexbox;

  display: -webkit-flex;

  display: flex;

  -ms-flex-align: center;

  -webkit-align-items: center;

  -webkit-box-align: center;

  align-items: center;

}

.flexbox-vert-item {

  width: 300px;

  background: #fefefe;

  margin-right: 20px;

  padding: 10px;

}

因为上面使用了浏览器引擎前缀,所以看起来有些复杂,但实际上本质是非常简单的,也就3句代码。

display: flex;

flex-align: center;

align-items: center;

二、理解vertical-align或如何竖向居中

  vertical-align 不同使用场合的理解

1、Table单元格中的vertical-align

   当出现在Table单元格中时,vertical-align的效果会如大多数人的预期一样,它会跟(老的,不鼓励使用)的valign属性的作用一样。在现代浏览器里,下面的这三种写法的效果是一样的:

  ```

  <td valign="middle"> <!-- 这是一种会逐渐被淘汰的用法 --> </td>

  <td style="vertical-align:middle"> ... </td>

  <div style="display:table-cell; vertical-align:middle"> ... </div>

  ```

 在浏览器中,它们的现实效果是下面这样


2、vertical-align在inline元素上效果

  当vertical-align被应用的到inline元素上时,它的作用却是类似(老的,不鼓励使用)的valign属性对<img>的作用一样。在现代浏览器里,下面的这三种写法的效果是一样的:

  ```

    <div style="border: 1px solid #e0e0e0">

      <img valign="middle" src="tab_home.png">

      <img style="vertical-align:middle"  src="tab_home_pre.png">

      <span style="display:inline-block; vertical-align:middle"> 示例 </span>

    </div>

  ```


  ```

    <div style="border: 1px solid #e0e0e0;margin-top: 10px;">

      <img valign="middle" src="tab_home.png">

      <img style="vertical-align:middle"  src="tab_home_pre.png">

      <span style="display:inline-block; vertical-align:bottom"> 示例 </span>

    </div>

  ```

  用<span style="display:inline-block; vertical-align:middle"> 示例 </span>和<span style="display:inline-block; vertical-align:bottom"> 示例 </span>作为例子,在浏览器中,它们的现实效果是下面这样:



  由此可见,valign="middle"和vertical-align:bottom用在inline元素上的效果是一样。

3、vertical-align在其它元素上的效果

    将vertical-align属性应用到一个block元素(例如标准的<div>)上时,大多数浏览器会依照继承的原则,将所有它的inline子元素也应用这个属性。那么,如何将一个元素竖向居中?

 方法一

  前提:

  * 你需要把想要竖向居中的内容放到一个block元素中,并给这个想要居中的元素指定固定的高度。

  * 绝对定位(absolutely-position)这个元素。(通常这样做是没问题的,因为你这个想要居中的元素的父元素仍然可以使用相对位置)。

方法:

  * 指定父元素为position:relative 或 position:absolute。

  * 给子元素指定固定的高度。

  * 给子元素设定position:absolute 以及 top:50%,让子元素移动到父元素内部上下居中的位置。

  * 给子元素设定 margin-top:-yy,这里的 yy 的值是你的子元素的高度的一半,弥补居中时的偏差。

  ```CSS代码

  <style type="text/css">

    #myoutercontainer {

      position: relative;

      height: 13em;

      border: 1px solid black;

    }

    #myinnercontainer {

      position: absolute;

      top: 50%;

      height: 6em;

      margin-top: -3em;

    }

  </style>

  ```


   ```HTML代码

  <div id="myoutercontainer">

    <div id="myinnercontainer">

      <p>Hi,我竖向居中了!</p>

      <p>感觉很犀利的哦!</p>

    </div>

  </div>

  ```


方法二

前提:

* 需要竖向居中的内容只有一行文字。

* 需要对父元素设定固定的高度。

方法:

* 将父元素的line-height设置为你想要的高度。

  ```CSS代码

  <style type="text/css">

    #myoutercontainer2 {

      line-height: 4em;

      border: 1px solid black;

    }

  </style>

  ```


   ```HTML代码

  <div id="myoutercontainer2">嗨,我竖向居中了,耶!</div>

  ```

三、竖向居中最简单的方法(三行CSS3代码)

 只用三行CSS3代码,就会完美的让任何元素竖向居中

 ```CSS代码

.parent-element {

    display: flex;

    justify-content: center;

    align-items: center;

    background: #a3c8fc;

  }

 ```


  ```HTML代码

<div class="parent-element">

  <p class="element ">hello world!

  </p>

</div>

 ```

 如果想兼容老式的浏览器,你需要在transform属性前添加浏览器引擎前缀。

```CSS代码

.parent-element {

    display: flex;

    justify-content: center;

    -webkit-justify-content: center;

    -ms-justify-content: center;

    -moz-justify-content: center;

    align-items: center;

    background: #a3c8fc;

  }

 ```

常见简单垂直剧中方法比较

方法一

这个方法把一些 div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align property 属性。

```HTML代码

<div id="wrapper">

  <p id="cell">Content goes here</p>

</div>

```

```CSS代码

#wrapper {display:table;height: 50px;background: #e0e0e0;}

#cell {display:table-cell; vertical-align:middle;}

```

优点:

content 可以动态改变高度(不需在 CSS 中定义)。当 wrapper 里没有足够空间时, content 不会被截断

缺点:

Internet Explorer(甚至 IE8 beta)中无效,许多嵌套标签(其实没那么糟糕,另一个专题)

方法二

  使用绝对定位的 div,把它的 top 设置为 50%,top margin 设置为负的 content 高度。这意味着对象必须在 CSS 中指定固定的高度。

  因为有固定高度,或许你想给 content 指定 overflow:auto,这样如果 content 太多的话,就会出现滚动条,以免content 溢出。

```HTML代码

<div id="content">Content goes here</div>

```

```CSS代码

#content {

   position:absolute;

   top:50%;

   height:240px;

   margin-top:-120px; /* negative half of the height */

   background: #e0e0e0;

 }

```

优点:

适用于所有浏览器

不需要嵌套标签

缺点:

没有足够空间时,content 会消失(类似div 在 body 内,当用户缩小浏览器窗口,滚动条不出现的情况)

方法三

  这种方法,在 content 元素外插入一个 div。设置此 div height:50%; margin-bottom:-contentheight;。

  ontent 清除浮动,并显示在中间。

```HTML代码

<div id="wrapper">

  <div id="floater"></div>

  <div id="content">Content goes here</div>

</div>

```

```CSS代码

#wrapper {height: 400px;background: #a3c8fc}

#floater{float:left; height:50%; margin-bottom:-120px;}

#content{clear:both; height:240px; position:relative;background: #e0e0e0;}

```

优点:

适用于所有浏览器

没有足够空间时(例如:窗口缩小) content 不会被截断,滚动条出现

缺点:

唯一我能想到的就是需要额外的空元素了


方法四

  使用了一个 position:absolute,有固定宽度和高度的 div。这个 div 被设置为 top:0; bottom:0;。但是因为它有固定高度,其实并不能和上下都间距为 0,因此 margin:auto; 会使它居中。使用 margin:auto;使块级元素垂直居中是很简单的。

```HTML代码

<div id="wrapper">

  <div id="floater"></div>

  <div id="content">Content goes here</div>

</div>

```

```CSS代码

#wrapper {height: 400px;background: #a3c8fc}

#floater{float:left; height:50%; margin-bottom:-120px;}

#content{clear:both; height:240px; position:relative;background: #e0e0e0;}

```

优点:

简单

缺点

IE(IE8 beta)中无效

无足够空间时,content 被截断,但是不会有滚动条出现


方法五

  只能用于单行文本置中。只需要简单地把 line-height 设置为那个对象的 height 值就可以使文本居中了。

```HTML代码

<div id="content">

  单行文本置中

</div>

```

```CSS代码

#content {height:100px; line-height:100px;  border: 1px solid #000000;}

```

优点:

适用于所有浏览器

无足够空间时不会被截断

缺点:

只对文本有效(块级元素无效)

多行时,断词比较糟糕


示例详情请参考https://github.com/sevenhao/front-end-note/blob/master/base/css/vertical/vertical-align.md

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,154评论 3 30
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,395评论 0 26
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,453评论 0 6
  • 01 澳洲的秋天比起横跨了四个月漫长炙热的夏日,只是一种点到为止的存在。对于这个季节的感受,就像在阅读川端康成的小...
    懒人志阅读 703评论 0 2