CSS居中算是一个比较基础的问题,在实际运用中,需要考虑到的一般是两种情况,一种是主要是表现为文字,图片等行内元素的居中,一种是指 div 等块级标签元素的居中。

水平居中

1、行内元素
行内元素(主要是表现为文字,图片等行内元素),通过在父级元素设置 text-align:center 使子级行内元素居中。
 
2、定宽块级元素
为定宽块级元素设置:
 margin-left:auto;
margin-right:auto;
 
3、不定宽块级元素
 不定宽块级元素居中有三种方法:
  1. 加入 table 标签
  2. 设置 display:inline 方法
  3. 设置 position:relative 和 left:50%
方法一:
将元素用 table 标签包裹起来,包括 tbody、tr、td,但这种方法为了居中增加了无语义的标签。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div>
<table>
<tbody>
<tr>
<td>
<ul>
<li><a href="#">我是要</a></li>
<li><a href="#">居中的</a></li>
<li><a href="#">ul标签</a></li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
CSS:
 table{
margin:0 auto;
}
ul{list-style:none;margin:;padding:;}
li{float:left;margin-right:8px;}
现代浏览器表现正常:
IE7有时候会出现问题:
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
方法二:
设置为 inline 行内元素后沿用行内元素居中的方法,这种方法改变了元素的 display 样式。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div>
<ul>
<li><a href="#">我是要</a></li>
<li><a href="#">居中的</a></li>
<li><a href="#">ul标签</a></li>
</ul>
</div>
CSS:
 div{
text-align:center;
}
ul{list-style:none;margin:;padding:;display:inline;}
li{margin-right:8px;display:inline;}
各浏览器表现正常居中,IE7也没有出现什么问题。
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
方法三:
通过给父元素设置 float/display:inline-block(IE7对块级元素设置 inline-block 支持性不好,需要 hack,即 *display:inline;*zoom:1;),然后给父元素设置 position:relative 和 left:50%,子元素设置 position:relative 和 left:-50% 来实现水平居中。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div>
<ul>
<li><a href="#">我是要</a></li>
<li><a href="#">居中的</a></li>
<li><a href="#">ul标签</a></li>
</ul>
</div>
CSS:
 div{
display: inline-block;
/*兼容IE6,IE7*/
*display: inline;
*zoom:;
position:relative;
left:50%
}
ul{
/*兼容IE6*/
_display: inline;
_zoom:;
list-style:none;
margin:;
padding:;
position:relative;
left:-50%;
}
li{
float:left;
margin-right:8px;
}
chrome,Firefox,opera,IE6+都可以表现正常。
注:
1、_display:inline 其实是触发IE6中块级元素表现出 inline-block 的效果,_zoom:1 触发IE6中 hasLayout 效果,这里其他浏览器不需要触发 inline-block 效果,原因不是很清楚;
2、其中display:inline-block 也可以替换为 float ,float的主要作用就是产生 inline-block 的效果,这样代码会更加简洁一些,不用考虑太多的兼容问题:
CSS:
 div{
float: left;
position:relative;
left:50%
}
ul{
/*兼容IE6*/
_float:left;
list-style:none;
margin:;
padding:;
position:relative;
left:-50%;
}
li{
float:left;
margin-right:8px;
}
---------------------------------------------------------吃完栗子---------------------------------------------------------
垂直居中
垂直居中主要是行内元素的居中比较麻烦,特别是多行文本的居中。
1、父元素高度确定的行内元素(单行文本),
通过设置父元素的 height 和 line-height 高度一致来实现的。
 
2、高度固定的块级元素垂直居中
高度固定的块级元素垂直居中有三种方法:
  1. 垂直居中元素设置 absolute,利用 absolute 元素居中的方法来居中;
  2. 垂直居中元素设置 absolute,通过 top 和 margin-top 属性来调整;
  3. 创建浮动元素;
方法一:
其实这个方法是 absolute 元素居中的方法,父元素设置 position:relative,垂直居中元素设置 position:absolute,当要垂直居中时,设置 top:0;bottom:0,然后为上下 margin 设置 auto,水平居中也是同理。IE6,IE7不支持此种居中方法。
这种方法适用于原本就设置了 position 为 absolute 的元素。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div class="wrap">
<div class="container">
<p>我是想要垂直居中的块级元素。</p>
</div>
</div>
CSS:
 .wrap{
width:200px;
height: 200px;
background:#ccc;
position: relative;
}
.container{
width: 100px;
height:100px;
background: #00ff00;
position:absolute;
right:;
left:;
top:;
bottom:;
margin:auto;
}
chrome,Firefox,opera,IE8+表现如下,水平垂直居中:
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
方法二:
父元素设置 position:relative,需要垂直居中的元素设置:
 position:absolute;
top:50%;
height:2Hpx;
margin-top:-Hpx;
这里 top改为 bottom,margin-top 改为 margin-bottom 效果一样,这种方法适用于原本设置了 position 为 absolute 的元素。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div class="wrap">
<div class="container">
<p>我是想要垂直居中的块级元素。</p>
</div>
</div>
CSS:
 .wrap{
width:100px;
height: 200px;
background:#ccc;
position: relative;
}
.container{
position:absolute;
top:50%;
height:100px;
margin-top:-50px; /* 高度的一半 */
background: #00ff00;
}
chrome,Firefox,opera,IE6+都能够居中:
IE6 由于 3px bug表现稍微不同,不过由于这里主要讨论垂直居中,所以就不对其作过多留意。
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
 
方法三:
在需要垂直居中的元素前创建浮动元素,浮动元素设置 margin-bottom 为垂直居中元素高度的一半,高度为父元素高度的一半,为了兼容IE6、IE7,还需要象征性地设置一下 width。垂直居中元素 清除浮动。但是这个方法创建了无语义的标签,还要做一些兼容性的处理。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div class="wrap">
<div class="floatdiv"></div>
<div class="container">
<p>我是想要垂直居中的块级元素。</p>
</div>
</div>
CSS:
 .wrap{
width: 100px;
height: 200px;
background: #ccc;
}
.floatdiv {
*width: 1px;/*兼容IE6、IE7*/
float:left;
height:50%;
margin-bottom:-50px;
}
.container {
clear:both;
height:100px;
position:relative;
background: #00ff00;
}
chrome,Firefox,opera,IE6+都能够居中:
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
3、父元素高度确定的行内元素多行文本、图片)、块状元素
父元素高度确定的行内元素多行文本、图片)、块状元素垂直居中有两种方法
  1. 加入table标签;
  2. 设置 display 为 table-cell,激活 vertical-align 属性。
 
方法一:
使用插入 table (包括tbody、tr、td)标签,同时设置 vertical-align:middle。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:

 <table>
<tbody>
<tr>
<td class="wrap">
<div>
<p>我是想要垂直居中的一段文字。</p>
</div>
</td>
</tr>
</tbody>
</table>
CSS:
 .wrap{
width:100px;
height:200px;
background:#ccc
}
chrome,Firefox,opera,IE6+表现如下:
注:
1、因为 td 标签默认情况下就默认设置了 vertical-align 为 middle,所以我们不需要显式地设置了;
2、将 div 换为 img 效果一致。
---------------------------------------------------------吃完栗子---------------------------------------------------------
 
方法二:
在 chrome、Firefox 、opera、IE8 及以上的浏览器下可以设置块级元素的 display 为 table-cell,激活 vertical-align 属性,但注意 IE6、7 并不支持这个样式。
 
---------------------------------------------------------举个栗子---------------------------------------------------------
HTML:
 <div>
<p>我是想要垂直居中的一段文字。</p>
</div>
CSS:
 div{
width:100px;
height:200px;
background:#ccc;
display:table-cell;
vertical-align:middle;
}
chrome、Firefox 、opera、IE8 及以上的浏览器表现正常,IE6 和 IE7 则无法居中。
---------------------------------------------------------吃完栗子---------------------------------------------------------
垂直居中的方法比较多,至于用哪种方法还是要具体看情况,而且我相信还有更多的方法,欢迎大家补充。
 

本文来源:JuFoFu

本文地址:http://www.cnblogs.com/JuFoFu/p/5140302.html

 水平有限,错误欢迎指正。原创博文,转载请注明出处。

CSS:水平居中与垂直居中的更多相关文章

  1. CSS 水平居中与垂直居中

    前言 在CSS布局中,水平居中与垂直居中一直是用到比较多的,在本篇中将介绍水平居中.垂直居中的几种方式. 示例 HTML: <div class="parent"> & ...

  2. CSS水平居中和垂直居中解决方案

    一.CSS 居中 — 水平居中 DIV等标签本身没有定义自己居中的属性,网上很多的方法都是介绍用上级的text-align: center,然后嵌套一层DIV来解决问题. 可是这个方法有时候完全不起作 ...

  3. CSS 水平居中/布局 垂直居中 (月经问题)

    水平居中 如果它是一个行内元素 对其父元素使用 text-align:center 即可实现. <p style = " text-align:center; width:300px; ...

  4. css水平居中和垂直居中

    水平居中:内联元素:text-align:center;相对于父级居中显示块级元素:margin:0 auto;但是需要同时width,否则无法看到效果多个块级元素居中:在此想要探讨一下display ...

  5. CSS 水平居中和垂直居中

    1.水平居中——行内元素 text-align: center; 2.水平居中——定宽块状元素 margin: auto,满足定宽和块状两个条件的元素是可以通过设置“左右margin”值为“auto” ...

  6. CSS水平居中与垂直居中的方法

    一.水平居中 1.行内元素水平居中 在父元素里添加text-align:center即可.代码如下: <style> .container-1 { height: 50px; border ...

  7. CSS的水平居中和垂直居中解决方案

    在写CSS样式的时候,有时为了美观,会添加水平居中和垂直居中,这时候你有可能会遇到很棘手的问题,有些水平居中和垂直居中的属性添加上去完全没反应,下面给大家列举一些CSS水平居中和垂直居中的终极解决方案 ...

  8. css确定元素水平居中和垂直居中

    ---恢复内容开始--- 首先,我们在了解如何通过css了解元素水平和垂直居中之前,先要了解下html都有哪些元素,这些元素与偶有哪些分类,因为不同类别的元素的水平垂直居中方法是完全不同的,究其根本当 ...

  9. CSS设置行内元素和块级元素的水平居中、垂直居中

    CSS设置行内元素的水平居中 div{text-align:center} /*DIV内的行内元素均会水平居中*/ CSS设置行内元素的垂直居中 div{height:30px; line-heigh ...

  10. CSS中元素水平居中和垂直居中的方法

    #CSS中水平居中和垂直居中的方法 一. 水平居中 1.行内元素(文本,图片等) 如果被设置元素为文本.图片等行内元素时,可以通过给父元素设置` text-align:center;` 来实现 2.定 ...

随机推荐

  1. C# 引用访问权限

    同样代码表现的不同行为 创建基类(Super)和派生类(Sub)每个类有一个字段field和一个公共方法getField,并且使用内联的方式初始化为1,方法getField返回字段field.C#和J ...

  2. IOS开发学习笔记025-xib和storyboard

    stotyboard : 描述软件界面,大范围,比较适合整个软件的所有界面 xib文件的使用:描述软件界面,小范围,比较适合描述小界面 在xcode新建文件窗口可以看到两个文件,storyboard和 ...

  3. Python+Selenium基础篇之2-打开和关闭火狐浏览器

    本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckodriver. ...

  4. c++ primer plus 第6版 部分一 1-4章

    c++ primer plus 第6版 源代码 ---编译器---目标代码---连接程序(启动代码--库代码)---可执行代码 源代码扩展名:c   cc   cxx     C    cpp     ...

  5. Python之实现不同版本线程池

    1.利用queue和threading模块可以实现多个版本的线程池,这里先贴上一个简单的 import queue import time import threading class ThreadP ...

  6. 爬虫:Scrapy1

    Python 2.7 npm install scrapy 步骤: 创建一个 Scrapy 项目 定义提取的 Item 编写爬取网站的 Spider 并提取 Item 编写 Item Pipeline ...

  7. vmware安装centos7 安装redis windows7访问redis

    1.在windows7中安装vmware 2.在vmware中安装centos7 3.禁用centos7自带的firewalld.service 4.安装iptables防火墙 5.安装Redis 3 ...

  8. Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

    写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...

  9. 【02】 Vue 之 数据绑定

    2.1. 什么是双向绑定? Vue框架很核心的功能就是双向的数据绑定. 双向是指:HTML标签数据 绑定到 Vue对象,另外反方向数据也是绑定的.通俗点说就是,Vue对象的改变会直接影响到HTML的标 ...

  10. ios工程中一天只让显示一次的广告,或是弹出窗,如何实现

    需求: 产品 代码实现: 在首页.m中 //一天之内只能批量邀请一次 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefault ...