css居中那点事儿
css居中那点事儿
在css中对元素进行水平居中是非常简单的,然而使元素垂直居中就不是一件简单的事情了,多年以来,垂直居中已经成为了CSS领域的圣杯,因为它是极其常见的需求,但是在实践中却不是一件简单的事情。下面我会简单介绍水平居中,并着重讨论垂直居中。
第一部分:水平居中
1.实现行内元素的居中。方法:在行内元素外面的块元素的样式中添加:text-align:center;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
div{text-align: center;}
img{width: 200px;height: 200px;border: thin solid red;}
</style>
</head>
<body>
<div>
<img src="pic.png">
</div>
</body>
</html>
注意:对于某个块元素的居中,不能在其父元素的样式中设置text-align:center,这是无效的。下面介绍块元素的居中方式。
2.实现块级元素的水平居中。
方法一:设置其左右两边的外补丁为auto。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
div{width: 200px;height: 100px;background: red;margin: auto;}
</style>
</head>
<body>
<div>this is a div</div>
</body>
</html>
注意:如果块级元素是body的直接子元素,不设置宽,则默认100%,看不出效果;不设置高,且div中没有内容,则高度默认为0。因此,一定要同时设置块级元素的宽和高,这样才能看出来效果。对于在一个div中的另一个div希望居中,也可以使用这个方式,因为这时的margin是相对于其父元素而言的。
方法二:使用绝对定位和负边距。
代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc;margin: auto;position:relative; }
#son{
width: 100px;height: 100px;background: #aaa;text-align: center;
position: absolute; left: %; margin-left: -50px;
/*注意:因为绝对定位是left的值是相对于son的最左边为50%,所以需要使用margin-left再向左偏移宽度的一半 */ }
</style>
</head>
<body>
<div id="parent">
<div id="son">faas</div>
</div>
</body>
</html>
效果图如下:
第二部分:垂直居中
1.行内元素的垂直居中
A 我们在写导航菜单时,往往采用将<a>标签写入float的<li>中,且为了美观,我们常常需要将a标签中的内容水平居中和垂直居中。水平居中我们在上面已经介绍了,通过在字体的父元素内设置text-align:center;即可实现。那么垂直居中呢?对于文字而言,我们只需要将行高设置为字体所在块元素的高度即可。
html代码如下:
<body>
<ul>
<li><a href="">我</a></li>
<li><a href="">是</a></li>
<li><a href="">导</a></li>
<li><a href="">航</a></li>
<li><a href="">的</a></li>
</ul>
</body>
css代码如下:
<style>
*{padding: ;margin: ;list-style: none;text-decoration: none;}
ul li{float: left;/*width: 40px;height: 40px;*/}
a{display: block;width: 70px;height: 40px;background: #daa541;border:1px solid red;text-align: center;line-height: 40px;}
</style>
我把a标签的display属性值修改为了block,所以我们就可以修改a标签的宽度和高度了,因为li是包含a的,li会由其中的内容(即a标签)撑开,所以在li中的width和height是不需要设置的。
因为a成为了块级元素,所以水平居中只需要在a中添加text-decoration:none;即可。将line-height的高度和height的高度设置为相同的,就可以实现垂直居中了。
B 如果要对a标签中的字体居中,实际上还有一种更为简单的方法。
即将a的display属性设置位block之后,不设置其宽度和高度(li的宽度和高度也不设置),为了看清楚,我们可以给a加border,这时得到的效果图如下:
即a的大小完全是由字体撑开的,这时我们可以通过设置上下左右的padding值达到与A方法相同的效果。html代码与A中相同,css代码如下:
*{padding: ;margin: ;list-style: none;text-decoration: none;}
ul li{float: left;}
a{display: block;background: #daa541;border:1px solid red; padding:10px 30px;}
大家可以看到,这里我只设置了上下padding值为10px,左右padding值为30px;在A中的width height text-align(实现水平居中) line-height(实现竖直居中)这些属性全都没有设置,只使用了padding:10px 30px;来代替,所以这种方法是值得推荐的。
效果图如下:
C 另外一种方法也可以实现行内元素的垂直居中。
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc; display:table-cell; vertical-align: middle;}
</style>
</head>
<body>
<div id="parent">
<span>faas</span>
</div>
</body>
</html>
即我们将id为parent的div元素的display属性值设置位table-cell,这时,即让标签元素以表格单元格的形式呈现,类似于td标签。这时就可以通过设置vertical-align来实现垂直居中了。但值得注意的是:table-cell会被其他一些css属性破坏,比如float和position:absolute等等。且一旦设置位table-cell,这时margin就不能用了。这种方法也可以用于块级元素的垂直居中。
也可以使用display:flex; 以及 align-items:center; 但是这样就不能用text-align:center;
2.块级元素的垂直居中。
方法一:使用绝对定位和负边距。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc;margin: auto;position:relative; }
#son{
width: 100px;height: 100px;background: #aaa;text-align: center;
position: absolute;top: %;margin-top: -50px;
}
</style>
</head>
<body>
<div id="parent">
<div id="son">faas</div>
</div>
</body>
</html>
方法二:使用display:table-cell;方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc; display:table-cell; vertical-align: middle;}
</style>
</head>
<body>
<div id="parent">
<div>faas</div>
</div>
</body>
</html>
大家可以看出,这个方法与行内元素的垂直居中并没有什么区别。
方法三:使用display:flex;代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc; margin: auto;
display: flex; align-items:center; }
#parent>div{background: red;width: 100px;height: 100px;}
</style>
</head>
<body>
<div id="parent">
<div>faas</div>
</div>
</body>
</html>
在父元素中添加display:flex;align-items:center;即可实现竖直居中。
第三部分:水平竖直同时居中(重点)
方法一:使用绝对定位和负边距
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc;margin: auto;position:relative; }
#son{
width: 100px;height: 100px;background: #aaa;text-align: center;
position: absolute;top: %;margin-top: -50px; left: %;margin-left: -50px;
}
</style>
</head>
<body>
<div id="parent">
<div id="son">faas</div>
</div>
</body>
</html>
效果如下:
方法二:使用display:flex
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc; margin: auto;
display: flex; align-items:center; justify-content:center;}
#parent>div{background: red;width: 100px;height: 100px;}
</style>
</head>
<body>
<div id="parent">
<div>faas</div>
</div>
</body>
</html>
即只需要在父元素的样式中添加display:flex;align-items:center实现竖直居中,justify-content:center;实现水平居中。
方法三:同样使用display:flex.
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:;padding: ;}
#parent{width: 500px;height: 300px;background: #ccc; margin: auto;
display: flex; }
#parent>div{background: red;width: 100px;height: 100px; margin: auto;}
</style>
</head>
<body>
<div id="parent">
<div>faas</div>
</div>
</body>
</html>
我们发现只需要在父元素中设置display:flex;在子元素中设置margin:auto。
方法四:使用css3属性
在方法一中,我们必须知道子元素的width和height才能使用负边距使其居中,但是如果其width和height不是确定的值,这个方法就不可用了。下面这种使用css变形属性的方法可以很好的解决这一问题,因为translate()变形函数中使用的百分比值时,是以这个元素自身的宽度和高度为基准进行换算和移动的。举例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>居中方法</title>
<style>
#father{
position: relative;
width: 500px;
height: 500px;
background: #ccc;
}
#son{
position: absolute;
top:%;
left:%;
width: 100px;
background: #ddd;
transform:translate(-%,-%);
}
</style>
</head>
<body>
<div id="father">
<div id="son">子元素,没有设置高度。子元素,没有设置高度。子元素,没有设置高度。子元素,没有子元素,没有设置高度。</div>
</div>
</body>
</html>
代码中我只设置了宽度,而没有设置高度,即高度自适应,最终效果如下所示:
即使我们添加或减少内容,也可以达到垂直居中的目的!
方法五:
在父元素中使用position:relative;在子元素中使用position:absolute;将其margin值设置为auto;并且四个方向都设置为0即可。
代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>居中方法</title>
<style>
.parent{
position: relative;
width: 200px;
height: 200px;
background-color: blue;
}
.son{
position: absolute;
width: 50px;
height: 50px; margin:auto;
left:;right: ;top: ;bottom: ;
/*使用margin:auto和四个方向都是0,有一种五马分尸的感觉*/
background-color: red;
}
</style>
</head>
<body>
<div class="parent">
<div class="son">
居中元素
</div>
</div>
</body>
</html>
最终效果如下所示:
这样做的好处就是我们我们不需要知道父元素和子元素的宽度和高度,而只要使其尺寸固定即可。
注:原创文章,如需转载,请注明出处。博客地址:http://www.cnblogs.com/zhuzhenwei918/p/6158433.html
尽吾志也而不能至者,可以无悔矣,其孰能讥之乎?
css居中那点事儿的更多相关文章
- CSS居中demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- css居中学习笔记
css居中学习笔记 一.水平居中 以下面的代码为例: <body> <div class="parent"> <div class="chi ...
- CSS居中完全解决方案
上次面试面试官问到了,问了个定宽局中和不定宽局中,下来我把所有有关CSS居中都总结了一下 原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 水平居中 行内元素 把行内元素 ...
- 理解CSS居中
我想很多在前端学习或者开发过程中,肯定会遇到如何让你的元素居中的问题,网上google肯定会有很多的解决方法.今天我就个人的项目与学习经验谈谈个人理解css如何让元素居中. 要理解css的居中,首先必 ...
- CSS 居中大全【转】
我看最近微博流行 CSS 居中技术,老外码农争相写相关的文章,一篇赛一篇的长啊,我把几篇归纳总结了一下,算是笔记. 孔乙己曾说:“茴香豆的回字有四种写法”,万一哪天有个面试官问你:“居中一共有几种写法 ...
- CSS居中的实现用法实例
转载的一篇文章,讲解css内容居中的. 网上有关css 居中的文章不胜枚举,不过大多没有做系统的总结.这里分享的这篇有关css居中的文章,个人感觉不错,值得收藏. 一.水平居中1,将元素水平居中(us ...
- 各种div+css居中方式调整(转载)
盘点8种CSS实现垂直居中水平居中的绝对定位居中技术 分类: 前端开发2013-09-11 21:06 24959人阅读 评论(3) 收藏 举报 绝对居中垂直居中水平居中CSS居中代码 目录(?) ...
- CSS居中方法
css居中方法非常多,根据工作的实际情况采用恰当方法,可取到事半功倍的效果. 就常见的一些居中方法整理如下: 代码如下: <div class="con"> <d ...
- css居中问题
学习过程中遇到css居中问题 , 也查阅了资料,每个人的方法都不尽相同,而且当时看懂了,过后就记混淆了;so作为一个前端小白,也来写一下俗话说好脑子不如烂笔头,毕竟自己知道的也不多,其实是抱着学习和交 ...
随机推荐
- GWT-Dev-Plugin(即google web toolkit developer plugin)for Chrome的安装方法
如果你想要在Chrome中进行GWT调试,需要安装“gwt developer plugin for chrome”,但是普通安装模式下,会提示: This application is not su ...
- 20160220 - JavaScript for OS X Automation 调试技巧
在JXA代码中加入如下代码后,可使用 Safari Web Inspector 调试: //debugger; 使用 Safari Web Inspector 查看 Array 或 Object 并不 ...
- Web软件安全攻击
- SQL语言概述
功能概述 DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等 DML,数据库操纵语言,对数据库中的数据进行增,删,改,查 DCL,数据库定义语言,对数据库总数据的访问设置权限 ...
- Spring学习进阶(四) Spring JDBC
Spring JDBC是Spring所提供的持久层技术.主要目的是降低使用JDBC API的门槛,以一种更直接,更简洁的方式使用JDBC API.在Spring JDBC里用户仅需要做哪些比不可少的事 ...
- linux基础学习2
http://www.chengzhier.com <a href="http://www.chengzhier.com">橙汁儿网</a> 1. date ...
- Mysql-windows下修改密码
忘记密码修改(以下各种方法视情况而使用,本人测试,有些都是案情况才可行,但都是有设置成功过) 注:修改密码成功后一定要记得刷新下权限(否则将导致不能使用当前用户连接) mysql>FLUSH P ...
- RegExp正则校验之Java及R测试
前言: 正则表达式(英语:Regular Expression)原属于计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里边,正则表达式通常被用 ...
- iOS音频
随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...
- 【BZOJ-1014】火星人prefix Splay + 二分 + Hash
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5852 Solved: 1871[Submit] ...