记录收集纯CSS层面实现的水平、垂直居中方法可用于块级、行内快、内联元素以及文字图片等。

  1. **水平或垂直居中 **

    1.1 text-align

    1.2 margin

    1.3 line-height

    1.4 padding
  2. 水平与垂直同时居中

    2.1 挡板方式实现的水平垂直居中

    2.2 vertical-align

    2.3 模拟单元格特性

    2.4 position + margin:负值

    2.5 position + margin:auto

    2.6 position + translate

    2.7 position + calc

    2.8 相对于viewport进行水平垂直居中

    2.9 css3 - flex
  3. 图片相关的水平垂直居中

    3.1 背景图方式

    3.2 CSS 表达式

    3.3 button 方式

    3.4 网易NEC - 适合图片的方式

1. 水平或垂直居中

1.1 text-align

对于要求不高,并且内容是文本元素或是行内块元素(inline-block),可以很容易的通过text-align:center进行水平居中。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
background:#eee;
text-align: center;
}
span{
display:inline-block;
background:#aaa;
width: 200px;
}
</style>
</head>
<body>
<div>
使用text-align:center进行水平居中<br/>
<span>inline-block</span>
</div>
</body>
</html>

1.2 margin

对于内容是块级元素,通过 margin:0px auto 可以很容易的进行水平居中。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
background:#eee;
text-align: center;
}
p{
background:#aaa;
width:500px;
line-height:100px;
margin:0px auto;
}
</style>
</head>
<body>
<div>
<p>MARGIN:0PX AUTO</p>
</div>
</body>
</html>
优点 缺点
简单直观 被水平居中的元素必须要有固定的宽度

1.3 line-height

对于内容是纯文本或者是行内快元素时,最简单的就是通过设置 line-height 实现垂直居中,不过这种方式有很大的不足之处,一是行高的值必须为当前父元素的高度,二是,只能一行,不能有多行。

优点 缺点
简单直观 只能作用于内联元素或行内块、只能一行不能多行、行高的值必须为父元素的高度

1.4 padding

如果父元素对于高度没有什么要求,可以通过设置 padding-toppadding-bottom 为相同值,来实现伪的垂直居中效果。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
padding:200px 0;
background:#eee;
text-align: center;
}
p{
background:#aaa;
}
</style>
</head>
<body>
<div>
<p>PADDING</p>
</div>
</body>
</html>
优点 缺点
非常简单 进行伪垂直居中的元素不能有高度

2. 水平与垂直同时居中

2.1 挡板方式实现的水平垂直居中

我称这种方式为挡板方式,是因为它在实现方式上很类似。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box{
width:600px;
height:600px;
background:#eee;
}
.top{
height:50%; }
.box1{
width:200px;
height:200px;
background:#aaa;
margin:0px auto;
margin-top:-100px; }
</style>
</head>
<body>
<div class="box">
<div class="top"></div>
<div class="box1"></div>
</div>
</body>
</html>
优点 缺点
不需要定位 依然需要计算与设置负边距值
要引入一个废标签

Note: 但在实际的使用上如果不考虑IE7-,那个无用的元素可以使用伪类替代。

2.2 vertical-align

vertial-align 是CSS的一个属性,该属性只对行内元素或行内快元素产生作用,主要用于设置当前元素与同级相邻元素的垂直对齐方式(基于基线)。常用于图片与文字的对齐。

这里则是利用 vertical-align 这种对齐 的特性来在父元素中插入一个高度与其相同的子元素,最后再为该子元素设置 vertical-align 属性来对齐我们真正的内容。

这种方式还是蛮巧妙的,但是我认为其局限性在于只能作用于行内或行内快,另外要插入一个无关的废标签,不过该标签可以通过伪类进行代替。

最将 text-align:centervertical-align:middle,结合使用,我们便可以将行内快元素水平垂直居中

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
width:300px;
height:200px;
text-align:center;
background:#eee;
text-align:center;
}
div:after{
content:'';
display:inline-block;
width: 1px;
height:100%;
vertical-align:middle;
} </style>
</head>
<body>
<div>
<button>button1</button>
<button>button2</button>
</div>
</body>
</html>

2.3 模拟单元格特性

我们知道表格有很多特性,比如宽度的关联伸缩,再比如我们现在需要用到的垂直居中,而正好的是CSS也可以通过display属性为HTML元素赋予表格元素的特性。

常见的有:

display:table 声明一个表格

display:table-row 声明一个行

display:table-cell 声明一个单元格。

简单的使用示例(快速入门):

    <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style> .table{
display:table;
border:1px solid #ccc; }
.row{
display:table-row;
}
.cell{
display:table-cell;
border:1px solid #ccc;
}
</style>
</head>
<body>
<div class="table">
<div class="row">
<div class="cell">ROW1-CELL1</div>
<div class="cell">ROW1-CELL2</div>
</div>
<div class="row">
<div class="cell">ROW2-CELL1</div>
<div class="cell">ROW2-CELL2</div>
</div>
</div>
</body>
</html>

因此利用这种手段,我们也可以实现需要的水平垂直居中效果。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.box{
display:table-cell;
width:500px;
height:500px;
background:#eee;
vertical-align:middle;
text-align: center;
}
p{
display:inline-block;
background:#aaa;
}
</style>
</head>
<body>
<div class="box">
<p>
TABLE-CELL-TEST<br/>
TABLE-CELL-TEST<br/>
TABLE-CELL-TEST<br/>
</p>
</div>
</body>
</html>
优点 缺点
垂直居中多行内容特别是文字内容 只有IE8+ 才支持
只能垂直居中内联元素、行内块

通过模拟表格的方其优点在于可以垂直居中多行内容,但是缺点就是目前只有IE8+的版本才被支持。

2.4 position + margin:负值

通过定位可以实现水平垂直居中,不过对使用的条件要求较高,首先内容要进行绝对定位(absolute),父元素要进行相对定位(relative),其次内容要有固定的尺寸,最后调整margin负值与偏移属性的值。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
position:relative;
height:600px;
width:600px;
background:#eee;
} p{
position:absolute;
width:200px;
height:200px;
top:50%;
left:50%;
margin-left:-100px;
margin-top:-100px;
background:#aaa;
}
</style>
</head>
<body>
<div>
<p>MARGIN:0PX AUTO</p>
</div>
</body>
</html>
优点 缺点
应用范围光
兼容性好
进行居中的元素要有固定的尺寸
要计算margin负边距值

2.5 position + margin:auto

对于绝对定位的元素来说,其默认效果是:

  • 尺寸会自动收缩适应内容。
  • 位置默认的是auto,
  • 边距则默认值为0。

此时如果在默认尺寸的情况下,我们将其四个方向的偏移值都设置为0的话,元素会自动向四个方向拉伸100%贴合其参照元素。如果再设置固定宽度,并设置 margin:auto,那么便可以惊奇的发现,绝对定位的元素会水平垂直居中在父元素(参照元素)中。

关于 margin:auto为什么能水平居中块级而不能垂直居中的问题

auto是自动分配的意思,margin:auto,便是自动分配边距的意思。但是根据CSS2.1的规范,块级元素的宽度是参照其父元素的宽度(也就是为什么块级元素独占一行的原因),只有宽度是100%,auto才能够进行分配,然后让元素水平居中,但是问题来了,CSS规范同时也定义了块级元素的高度是根据内容适应,也就是说块级元素的高度是不可知的,所以为上下边距设置auto当然不能进行垂直居中。然而当我们给一个元素进行定位,使其成为块级元素并脱离文档流时,又同时为其设置top:0;right:0;bottom:0;left:0,便会将该元素的尺寸完全贴合其父元素或参照元素,即width:100%,height:100%,那么此时再设置margin:auto,便可以进行水平/垂直居中。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style> .box{
position:relative;
width:600px;
height:600px;
background:#aaa;
}
p{
position:absolute;
width:200px;
height:200px;
left:0;
right:0;
bottom:0;
top:0;
margin:auto;
background:#eee;
}
</style>
</head>
<body>
<div class="box">
<p>This is Position Advace</p>
</div>
</body>
</html>
优点 缺点
使用条件简单
无需计算负边距值
进行居中的元素要有固定的尺寸
只有IE8+支持

2.6 position + translate

通过CSS3的 translate 实现的水平垂直居中,其原理与position+margin负值的方式很类似。

但是相比于margin负值方式,其优点体现于:

  • 不需要为内容设置固定的宽度。
  • 不需要手动计算负边距值。

transform:translate(-50%,-50%) 可以自动向左与向上移动当前元素宽度的50%。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
div{
position:relative;
height:600px;
width:600px;
background:#eee;
}
p{
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);
background:#aaa;
} </style>
</head>
<body>
<div>
<p>transForm</p>
</div>
</body>
</html>
优点 缺点
可以不需要为居中的盒子设置固定的尺寸
手机端
只有IE9+支持

2.7 position + calc

calc() 是CSS3的函数属性,其功能是进行四则运算,参与运算的值可以是相对单位,也可以是绝对单位。

利用calc进行居中的原理其实就是通过为left:50%,top:50%,然后让50%再减去当前元素宽度或者高度的一半,其机制仍然属于负边距方式,但相比于position的负边距以及于translate等方式,它主要减少了样式的声明数量。

示例:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style> .box{
position:relative;
width:600px;
height:600px;
background:#aaa;
}
p{
position:absolute;
width:200px;
height:200px;
left:calc(50% - 100px);
top:calc(50% - 100px);
background:#eee;
}
</style>
</head>
<body>
<div class="box">
<p>CSS3 - CALC</p>
</div>
</body>
</html>
优点 缺点
减少样式声明
手机端
需要为居中的元素设置固定尺寸
只有IE9+、Chrome19+

2.8 相对于viewport进行水平垂直居中

CSS3中引入了新的度量单位,vh 与 vw,它们都是基于viewport的相对单位,即viewport的宽度与高度分别被分为100等份的vh 与 vw。

也就是说:

1vh = 1%(viewport的高度)

1vw = 1%(viewport的宽度)

那么为当前元素的尺寸设置为 50vh与50vw 即当前窗口的高度与宽度的一半,再结合 translate(50%,50%) 便可以将当前元素水平垂直居中在当前窗口中。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
p{
position:absolute;
width:50vw;
height:50vh;
transform:translate(50%,50%);
background:#eee;
}
</style>
</head>
<body>
<div class="box">
<p>CSS3 - CALC</p>
</div>
</body>
</html>
优点 缺点
在基于窗口的环境下使用 只有IE9+ 、Chrome26+、Firefox19+、safair6.0+ 支持
固定尺寸

2.9 css3 - flex

flex可谓是CSS3加入的强大布局特性,利用flex我们可以实现灵活方便且可塑的布局方案。

利用flex布局只需要简单的设置两行样式声明即可实现元素的水平与垂直居中。

justify-content:center 水平居中排列

align-items:center 垂直居中排列

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style> div{
display:flex;
justify-content:center;
align-items:center;
text-align: center;
background:#eee;
} p{
background:#aaa;
} </style>
</head>
<body>
<div>
<p>FLEX</p>
</div>
</body>
</html>
优点 缺点
移动端
无需设置固定尺寸
兼容性低版本IE不支持

3 图片相关的水平垂直居中

专门用于图片水平垂直居中的CSS方法,并且以下方法都可以在所有浏览器中得到兼容。

3.1 背景图方式

这种方式最简单,就是将图片作为背景图,然后设置 background-position:center center 让其水平垂直居中在元素中。

3.2 CSS 表达式

这种方式要借助IE的私有扩展,并且这种方式的好处是可以兼容到IE5。

缺点也很明显,就是只能用于图片,因为这涉及到CSS表达式中的 this.height

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.box{
display:table-cell; /* 在高版本浏览器中通过表格特性进行垂直居中图片 */
width:500px;
height:500px;
vertical-align: middle;
background:#eee;
}
.box img{
display: block;
margin:0px auto;
margin-top:expression((500 - this.height)/2); /* IE 浏览器的专有CSS 表达式属性 */
}
</style>
</head>
<body>
<div class="box">
<img src="http://nec.netease.com/img/s/1.jpg" alt="" />
</div>
</body>
</html>

3.3 button 方式

这种方式有些过滤奇技淫巧,但是好处就是可以兼容所有浏览器,但是在IE浏览器中会有稍微的瑕疵,也就是当单击的时候,图片会有轻微的晃动。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
button{
height:500px;
width:500px;
background:#eee;
border:none;
outline:none;
}
</style>
</head>
<body>
<button>
<img src="http://nec.netease.com/img/s/1.jpg" alt="" />
</button>
</body>
</html>

3.4 网易NEC - 很适合图片的方法

这种网易NEC发明的方式,其优点在于只要图片的尺寸不超过父元素,图片都会在父元素中居中。

原理:

首先为外层盒子进行相对定位,然后为内部盒子进行绝对定位,并且尺寸是由其内容(图片)撑开,再为内部盒子设置偏移值 left:50%;top:50%;最后再将其内部放入两个img标签,但引用的都是一张图片,其中一张图片进行占位隐藏用于让内部盒子识别尺寸,另一张图片则是用来显示,并且这张图片再进行绝对定位,然后left:-50%;top:-50%,这样便可以将图片水平、垂直居中在父元素中。

示例:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style type="text/css">
.box {
position:relative;
width: 600px;
height: 600px;
background:#eee; }
.inner{
position:absolute;
left:50%;
top:50%;
}
.inner .img1{
visibility: hidden;
}
.inner .img2{
position:absolute;
left:-50%;
top:-50%;
}
</style>
</head>
<body>
<div class="box">
<div class="inner">
<img class="img1" src="http://nec.netease.com/img/s/1.jpg" />
<img class="img2" src="http://nec.netease.com/img/s/1.jpg" />
</div>
</div>
</body>
</html>

呼~~ 终于把博客园的markdown改好了,以后就决定用这个样式了,感觉园子的markdown真心不好用啊,功能也不全。。


如果觉得本文对您有帮助或者您心情好~可以支付宝(左)或微信(右)支持一下,就当给作者赞助包烟钱了 ~~:

CSS 居中方法集锦的更多相关文章

  1. CSS 居中方法集锦(*******************************)

      记录收集纯CSS层面实现的水平.垂直居中方法可用于块级.行内快.内联元素以及文字图片等. 水平或垂直居中 1.1 text-align1.2 margin1.3 line-height1.4 pa ...

  2. CSS居中方法

    css居中方法非常多,根据工作的实际情况采用恰当方法,可取到事半功倍的效果. 就常见的一些居中方法整理如下: 代码如下: <div class="con"> <d ...

  3. CSS居中方法搜集

    转自这里:http://jinlong.github.io/blog/2013/08/13/centering-all-the-directions/ 兼容低版本IE的方法 html使用表格结构 背景 ...

  4. css居中方法与双飞翼布局

    居中 类型 方法 对应属性 水平 垂直 水平&垂直 1.父元素使用外边距自动 2.子元素显示行内块级元素,写入内容,父元素设置文本居中 3.给父元素开启非绝对和固定定位作为子元素开启绝对定位的 ...

  5. css居中方法小结

    水平居中 行内元素 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的. 块状元素 当被设置元素为 块状元素 时用 text-align: ...

  6. css居中方法详解

    水平居中: 通过设置父元素,让子元素内容居中:text-align:center; 通过设置子元素本身,让子元素居中:margin:0 auto; 以上方法生效的前提条件是子元素没有被float元素影 ...

  7. css 居中方法

    垂直居中 利用“精灵元素”(ghost element)技术实现垂直居中,即在父容器内放一个100%高度的伪元素,让文本和伪元素垂直对齐,从而达到垂直居中的目的. .ghost-center { po ...

  8. CSS中各种各样居中方法的总结

    在开发前端页面的时候,元素的居中是一个永远都绕不开的问题.看似简单的居中二字,其实蕴含着许许多多的情况,对应着很多的处理方法,本文就试图对页面布局中的居中问题进行总结~~ 居中问题分为水平居中和竖直居 ...

  9. CSS居中的方法整合--水平居中

    原文 CSS的居中问题,是一个老生常谈的问题,各种居中方法层出不穷.是水平居中还是垂直居中?是block还是inline? 居中对象是一个还是多个?长度宽度是否确定?等等各种因素确定. 这里就从这些方 ...

随机推荐

  1. 【腾许Bugly干货分享】“HTTPS”安全在哪里?

    背景 最近基于兴趣学学习了下 HTTPS 相关的知识,在此记录下学习心得. 在上网获取信息的过程中,我们接触最多的信息加密传输方式也莫过于 HTTPS 了.每当访问一个站点,浏览器的地址栏中出现绿色图 ...

  2. 人人都是 DBA(VIII)SQL Server 页存储结构

    当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...

  3. Kali Linux渗透测试实战 1.2 环境安装及初始化

    1.2 环境安装及初始化 目录(?)[-] 环境安装及初始化 下载映像 安装虚拟机 安装Kali Linux 安装中文输入法 安装VirtualBox增强工具 配置共享目录和剪贴板 运行 Metasp ...

  4. DeviceOne接受了DevStore的专访

    DevStore隶属深圳尺子科技有限公司,DevStore所有内容(资讯.数据.工具|服务.资源文章.问答……)都贯穿整个项目的生命周期,无论你是设计人员.开发人员.推广人员还是运营人员都可在此找到你 ...

  5. 用WPF实现查找结果高亮显示

    概述 我们经常会遇到这样的需求:到数据库里查找一些关键字,把带这些关键字的记录返回显示在客户端上.但如果仅仅是单纯地把文本显示出来,那很不直观,用户不能很轻易地看到他们想找的内容,所以通常我们还要做到 ...

  6. AWS系列之三 使用EBS

    Amazon Elastic Block Store(EBS)可作为EC2实例的持久性数据块级存储.其具有高可用性和持久性的特点,可用性高达99.999%.给现有的EC2实例扩展新的存储块只需要几分钟 ...

  7. 据说每个大牛、小牛都应该有自己的库——Ajax

    蹉跎到今天终于要写Ajax部分了,平时工作中除了选择器我用jQuery的最多的就是ajax,所以这部分在自己的框架中必不可少. XMLHttpRequest 我以为对每个使用过Ajax的人来说XMLH ...

  8. [_CN] Eclipse精要与高级开发技术 note

    一 eclipse是基于java的 ide ,但根据其体系结构,开发插件,也可拓展到其他语言———————— 尽管如此,但还是很少听说用eclipse来写php或者c的 跨os 三个项目:eclips ...

  9. Visual Studio 2010 实用功能:使用web.config发布文件替换功能

    当建立ASP.NET Web应用程序项目后,默认除了生成web.config外,还生成了web.debug.config与Web.Release.config.顾名思义,根据它们的命名我可以推测到他们 ...

  10. 手打的笔记,java语法中的输入输出,语句,及注释。

    手打的笔记: () 内的则为注意事项或者提示 public static void main (String[] args) ******(用一个方法)****{ int i = 10; int j ...