总结:
- flex
- 绝对定位 同时适用于水平居中和垂直居中。
一、水平居中 ( 八种方法 )
1.1 行内元素 - 方法一
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.parent {
text-align: center;
}
</style>
</head>
<body>
<div class='parent'>
<span>123</span>
</div>
</body>
</html>
1.2 块级元素
1.2.1 一般情况 - 方法二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
background: skyblue;
width:200px;
height:200px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class='box'>123</div>
</body>
</html>
1.2.2 子元素含 float - 方法三(使用fit-content)
- fit-content是CSS3中给width属性新加的一个属性值,它配合margin可以轻松实现水平居中, 目前只支持Chrome 和 Firefox浏览器.\
- 无fit-content情况
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
margin: 0 auto;
/*width: -moz-fit-content;*/
/*width: -webkit-fit-content;*/
/*width:fit-content;*/
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
- 有fit-content情况
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
margin: 0 auto;
width: -moz-fit-content;
width: -webkit-fit-content;
width:fit-content;
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
1.2.3 Flex 弹性盒子
- 2012版 - 方法四
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
display: flex;
justify-content: center;
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
- 2009版 - 方法五
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
display: box;
box-orient: horizontal;
box-pack: center;
/*webkit*/
display: -webkit-box;
-webkit-box-orient:horizontal;
-webkit-box-pack:center;
/*moz*/
display: -moz-box;
-moz-box-orient: horizontal;
-moz-box-pack: center;
/*o*/
display: -o-box;
-o-box-orient: horizontal;
-o-box-pack: center;
/*ms*/
display: -ms-box;
-ms-box-orient: horizontal;
-ms-box-pack: center;
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
1.2.4 绝对定位
- CSS3 新增的 transform - 方法六
- transform: translate(x,y) | 根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
position: absolute;
left: 50%;
transform: translate(-50%, 0);
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
- left: 50% - 方法七
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
position: absolute;
left: 50%;
/*负的一半width*/
margin-left: -25px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
- left: 0; right: 0 - 方法八
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
float: left;
background: pink;
width:50px;
height:50px;
position: absolute;
left:0;
right:0;
margin:0 auto;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">
</div>
</div>
</body>
</html>
二、垂直居中 ( 八种方法 )
2.1 行内元素 - 方法一
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
background: #ccc;
height: 200px;
}
.son{
width: 50px;
height: 50px;
line-height: 200px;
}
</style>
</head>
<body>
<div class='parent'>
<span class="son">123</span>
</div>
</body>
</html>
2.2 块级元素
2.2.1 行内块级元素 - 方法二
- 拥有内在尺寸,可设置高宽,不会自动换行,有:(button,input,textarea,select), img等
- 基本思想是使用display: inline-block, vertical-align: middle和一个伪元素让内容块处于容器中央.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
background: #ccc;
height: 200px;
}
.son{
width: 50px;
height: 50px;
background: pink;
}
.parent::after, .son{
display:inline-block;
vertical-align:middle;
}
.parent::after{
content:'';
height:100%;
}
</style>
</head>
<body>
<div class='parent'>
<button class="son">123</button>
</div>
</body>
</html>
2.2.2 table - 方法三
- 元素高度可以动态改变, 不需再CSS中定义, 如果父元素没有足够空间时, 该元素内容也不会被截断。
- 但是在 IE6~7, 甚至IE8 beta中无效。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
background: #ccc;
display: table;
}
.son{
background: pink;
display: table-cell;
vertical-align: middle;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>
2.2.3 Flex 弹性盒子
-
2012版 - 方法四
优点- 内容块的宽高任意, 优雅的溢出。
- 可用于更复杂高级的布局技术中。
缺点
- IE8/IE9不支持。
- 需要浏览器厂商前缀。
- 渲染上可能会有一些问题。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
background: #ccc;
height: 200px;
width: 200px;
display: flex;
align-items: center;
}
.son{
width: 50px;
height: 50px;
background: pink;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>
- 2009版 - 方法五
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
background: #ccc;
height: 200px;
width: 200px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-box-pack: center;
}
.son{
width: 50px;
height: 50px;
background: pink;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>
2.2.4 绝对定位
- CSS3 新增的 transform - 方法六
- parent无宽高
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
width: 50px;
height: 50px;
background: pink;
position: absolute;
top: 50%;
transform: translate( 0, -50%);
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>
- top: 50% - 方法七
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
width: 50px;
height: 50px;
background: pink;
position: absolute;
top: 50%;
/*-0.5 height*/
margin-top: -25px;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>
- top/bottom: 0; - 方法八
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
}
.son{
width: 50px;
height: 50px;
background: pink;
position: absolute;
top: 0;
bottom: 0;
margin: auto 0;
}
</style>
</head>
<body>
<div class='parent'>
<div class="son">123</div>
</div>
</body>
</html>