44年前我们把人送上月球,但在CSS中我们仍然不能很好实现水平垂直居中。

作者:Icarus

原文链接:http://xdlrt.github.io/2016/12/15/2016-12-15

水平垂直居中有相同点也有不同点,接下来讨论常见的方式。

如无特殊说明,以下示例html均为:

基础样式为:

.md-warp{

width: 400px;

height: 300px;

max-width: 100%;

border: 1px solid #000;

}

.md-main{

display: block;

width: 100px;

height: 100px;

background: #f00;

}

水平居中

margin法

需要满足三个条件:

元素定宽

元素为块级元素或行内元素设置display:block

元素的margin-left和margin-right都必须设置为auto

三个条件缺一不可。

demo:

.md-main{

margin: 0 auto;

}

定位法

需要满足三个条件:

元素定宽

元素绝对定位,并设置left:50%

元素负左边距margin-left为宽度的一半

demo1:

.md-warp{

position: relative;

}

.md-main{

position: absolute;

left: 50%;

margin-left: -50px;

}

有些时候我们的元素宽度可能不是固定的,不用担心,我们依然可以使用定位法实现水平居中,此时需要用到css3中的transform属性中的translate,可以使元素移动时相对于自身的宽度和高度。

需要注意,这种方法需要IE9+才可以实现。

demo2

.md-warp{

position: relative;

}

// 注意此时md-main不设置width为100px

.md-main{

position: absolute;

left: 50%;

-webkit-transform: translate(-50%,0);

-ms-transform: translate(-50%,0);

-o-transform: translate(-50%,0);

transform: translate(-50%,0);

}

不定宽

文字水平居中

对于单行文字来说,直接使用text-align: center即可。

多行文字可以看作一个块级元素参考margin法和定位法。

垂直居中

定位法

和水平居中类似,只是把left:50%换成了top:50%,负边距和transform属性进行对应更改即可。

优点:能在各浏览器下工作,结构简单明了,不需增加额外的标签。

demo1:

.md-warp{

position: relative;

}

.md-main{

position: absolute;

/* 核心 */

top: 50%;

margin-top: -50px;

}

运用css3中的clac()属性能简化部分代码:

.md-warp{

position: relative;

}

.md-main{

position: absolute;

/* 核心 */

top: calc(50% - 50px);

}

demo2

.md-warp{

position: relative;

}

.md-main{

position: absolute;

top: 50%;

// 注意此时md-main不设置height为100px

-webkit-transform: translate(0,-50%);

-ms-transform: translate(0,-50%);

-o-transform: translate(0,-50%);

transform: translate(0,-50%);

}

不定高

单行文本垂直居中

需要满足两个条件:

元素内容是单行,并且其高度是固定不变的。

将其line-height设置成和height的值一样

这是一段文字

div{

width: 400px;

height: 300px;

border: 1px solid #000;

}

span{

line-height: 300px;

}

这是一段文字

以上是一些常规办法,接下来是利用CSS3新特性实现的示例。

视窗单位的解决办法(垂直居中)

如果想避免使用绝对定位,我们仍然可以利用translate()方法,其值刚好是元宽度和高度的一半。但是,我们如何不使用top和left将元素从top和left移动50%的偏移量呢?

首先想到的是给margin属性一个百分数,像这样:

.md-main{

margin: 50% auto 0;

transform: translateY(-50%);

}

我们发现并没有出现预想的结果,这是因为margin的百分比计算是相对于父容器的width来计算的,甚至包括margin-top和margin-bottom。

我们如果仍然想让元素在视窗中居中,还是有救的。CSS3定义了一种新的单位,称为相对视窗长度单位。

以下摘自w3cplus

vw是相对于视窗的宽度。与你预期刚好相反,1vw相当于视窗宽度的1%,而不是100%

与vw相似的是,1vh相当于视窗高度的1%

如果视窗的宽度小于高度,1vmin等于1vw,反之,如果视窗宽度大于高度,1vmin等于1vh

如果视窗的宽度大于高度,1vmax等于1vw,反之,如果视窗宽度小于高度,1vmax等于1vh

在上个示例的基础上,我们需要给margin设置vh单位:

.md-warp{

position: relative;

}

.md-main{

position: absolute;

margin: 50vh auto 0;

transform: translateY(-50%);

}

注意:这种方法最大的局限是只能适用于元素在视窗中垂直居中,如果是在局部的某个地方就无能为力了。

Flexbox的解决方案

如果不考虑浏览器的兼容性,Flexbox无疑是最好的解决方案,因为它的出现就是为了解决这样的问题。

完成这项工作只需要两个样式,在需要水平垂直居中的父元素上设置display:flex和在水平垂直居中的元素上设置margin:auto。

.md-warp{

display:flex;

}

.md-main{

margin: auto;

}

Flexbox的实现文本的水平垂直居中同样很简单。

.md-warp{

display:flex;

}

.md-main{

display: flex;

align-items: center;

justify-content: center;

margin: auto;

}

结语

绝对定位通常不是一个很好的选择,因为它对整体的布局影响相当的大。

在一些浏览器中,可能会导致元素出现略微的模糊,那是因为元素有可能被放置在半个像素位置上。我们可以通过transform-style:preserve-3d来解决,但这是一个Hack手段,不能保证它不会过时。

以上各种方法稍加组合即可同时实现水平和垂直居中,这些就是平时用到较多的一些居中的方法,希望大家看完之后有收获:)

把简单做好也不简单-css水平垂直居中的更多相关文章

  1. CSS水平垂直居中总结

    行内元素水平居中 把行内元素包裹在块级父元素中,且父元素中的css设置text-align:center; <!DOCTYPE html> <html> <head> ...

  2. [CSS]水平垂直居中方案

    简单总结一下常用的水平垂直居中方案 直接在父级元素设置 text-align 和 line-height ,针对未浮动的行内元素 <div class="box"> & ...

  3. css 水平垂直居中总结

    空闲总结了下水平垂直居中方案,欢迎补充: 水平居中 水平居中有两种情况: 子元素是内联元素 这种那个情况下只需要在父元素定义: text-align:center; 例子: html: //省略了bo ...

  4. 常见的几种 CSS 水平垂直居中解决办法

    用CSS实现元素的水平居中,比较简单,可以设置text-align center,或者设置 margin-left:auto; margin-right:auto 之类的即可. 主要麻烦的地方还是在垂 ...

  5. HTML+CSS水平垂直居中

    啦啦啦,好了,今天来分享自己的第一个知识点,难得自己还能想起来过来博客园,写写博客的. 好了,言归正传,今天分享关于html和css的一个简单的知识点,对于大部分从事前端开发的人员来说可能都是很简单的 ...

  6. css水平垂直居中对齐方式

    1.文字或者内联元素的垂直水平居中对齐 css属性 -- 水平居中:text-aligin:center; 垂直居中: line-height:height; 例子:. html: <div c ...

  7. CSS水平垂直居中的方法

    原文链接:http://caibaojian.com/370.html 水平垂直居中,特别是使用在列表的时候经常会用到的,以前有需求的时候我也做过类似的代码,是使用display:table-cell ...

  8. CSS水平垂直居中的几种方法2

    直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: div{ width: 400px; height: 400px; position: relative; b ...

  9. CSS水平垂直居中的几种方法

    直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: div{ width: 400px; height: 400px; position: relative; b ...

随机推荐

  1. Plant Design Review Based on AnyCAD

    Plant Design Review Based on AnyCAD eryar@163.com Abstract. AVEVA Review is used to 3D model visuali ...

  2. Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用

    转载博客:http://blog.csdn.net/xiaanming/article/details/26810303 大家好!差不多两个来月没有写文章了,前段时间也是在忙换工作的事,准备笔试面试什 ...

  3. Boot from Volume - 每天5分钟玩转 OpenStack(61)

    Volume 除了可以用作 instance 的数据盘,也可以作为启动盘(Bootable Volume),那么如何使 volume 成为 bootable 呢? 现在我们打开 instance 的 ...

  4. JSON入门指南--服务端处理JSON

    平时公司使用的ASP.NET MVC3来开发Web项目,其实在ASP.NET中已经原生的支持JSON.所以基本不需要引进Newtonsoft.Json.dll.下面看在MVC4中,后台生成JSON数据 ...

  5. First Blog

    俗话说“笨鸟先飞”,遗憾的是我这只笨鸟直到今天才意识到个人博客的重要性. 原来记录下学习生活中的每一丝领悟与思考,可以让个人内在,对知识的理解得到更好的升华. 有梦的人很美,追梦的人更美.像我的座右铭 ...

  6. windows server 注意windows的temp目录

    windows解压缩包.安装软件时,会生成一些临时文件存放在temp目录中,windows不会自动删除这些文件. 临时文件目录可以在环境变量中查看和配置 在工作机or个人PC机中中这个目录一般不会有什 ...

  7. 让你的Mac支持NTFS

    前段时间换成Mac电脑之后,发现有一点不爽,不能在Mac下写入NTFS格式的磁盘,所以就去研究了一下. 解决方法有如下三种. 第一种,直接使用第三方软件,如Paragon NTFS for MAC,T ...

  8. EasyUI管理后台模板(附源码)

    下载地址:http://files.cnblogs.com/wyguo/easyui_demo.zip

  9. 大数据实践-数据同步篇tungsten-relicator(mysql->mongo)

    // mongo)";digg_bgcolor = "#FFFFFF";digg_skin = "normal"; // ]]> // [导读] ...

  10. 不要给<a>设置outline:none

    outline属性有什么作用 原文链接 a{outline:none} do not do it 当用户使用tab键进行链接切换时,该属性会在当前选中的链接(获得焦点)使用该属性,一般来说是虚线框 的 ...