CSS进行水平居中、垂直居中的常用方法
一、水平居中
适用场景说明
块级元素
非float的元素
宽度确定与否都行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>07-应用场景-垂直水平居布局</title>
<style>
body{
background-color: #a1a1a1;
}
#wrap{
margin:0 auto;
background-color: #fda428;
}
</style>
</head>
<body>
<div id="wrap">我是div</div>
</body>
</html>
关键点在于:
margin:0 auto;
,即上下边距为0,左右自动。
从以上效果图观察,很多人可能疑问:“我是div”几个字没有居中啊?注意,我们此处说的居中是指div元素居中,而非内部文字居中。怎么实现div居中且内部文字居中呢?只需要text-align: center;
#wrap{
margin:0 auto;
text-align: center;
background-color: #fda428;
}
二、垂直居中
1、单行、高度确定
行内元素或者行内块级元素
单行
高度确定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
div{
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
background: red;
}
</style>
</head>
<body>
<div>我是单行居中</div>
</body>
</html>
注意是高度确定且单行的情况下,使用
line-height
才生效line-height=height才能垂直居中
2、多行、高度不确定(无关)
适用场景
块级元素与否都行
多行文本
高度确定与否都行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>多行文字居中</title>
<style>
body{
background-color: #a1a1a1;
}
#wrap{
width: 400px;
height: 400px;
text-align: center;
background: red;
display: table;
}
#wrap p{
display: table-cell;
vertical-align: middle;
}
</style>
</head>
<body>
<div id="wrap">
<p>小伙找大师算命,大师说:“你从小辍学,十几岁外出打工,后认识了老板女儿,结婚后老板去世,所有家产已经过户到你名下,经过自己努力,现在资产过亿。”小伙说:“大师,你算的不对,我一直是好学生,大学毕业出国留学,有一大堆文凭,现在回来还没找到工作,至今单身,还没谈过恋爱。”大师沉默片刻:“唉,知识改变命运啊,你早辍学的话,早就混好了!”</p>
</div>
</body>
</html>
具体操作就是在父元素中
display:table
,自身进行:display: table-cell;vertical-align: middle;
3、div的垂直居中(高度确定)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>多行文字居中</title>
<style>
body{
background-color: #a1a1a1;
}
#wrap{
position: relative;
width: 450px;
height: 450px;
background: #ffa500;
}
#div1{
position: absolute;
width: 200px;
height: 200px;
top: 50%;
margin-top: -100px;
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div id="div1"></div>
</div>
</body>
</html>
以上要将div1进行垂直居中显示。
div1的高度是确定的,即200px。我们需要将其父元素的position置为relative,同时自身进行绝对定位,进而设置top以及margin-top值。top:50%是固定的,但是margin-top的值是不固定的,需要根据实际情况计算得出。即
margin-top=-(height/2)
4、div的垂直居中(高度不确定)
与“二-2”章节原理一样。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>未知高度居中</title>
<style>
#wrap {
text-align: center;
width: 200px;
height: 200px;
background: #ffa500;
display: table;
padding: 50px;
}
#wrap div {
display: table-cell;
vertical-align: middle;
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div>以前听一个笑话让用ABCDEFG怎么造句:A呀,这B孩,C家的,光脚站在D上,EF也不穿,GG还露在外边。其实ABCDEFG是什么意思:A boy can do everything for girl.</div>
</div>
</body>
</html>
三、水平垂直居中
1、宽度、高度确定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>多行文字居中</title>
<style>
#wrap{
position: relative;
width: 450px;
height: 450px;
background: #ffa500;
}
#div1{
position: absolute;
width: 200px;
height: 200px;
top: 50%;
left:50%;
margin-top: -100px;
margin-left:-100px;
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div id="div1"></div>
</div>
</body>
</html>
以上要将div1进行垂直居中显示。
div1的高度是确定的,即200px,宽度也是确定的,即200px。我们需要将其父元素的position置为relative,同时自身进行绝对定位,进而设置top以及margin-top值。top:50%;left:50%是固定的,但是margin-top的值是不固定的,需要根据实际情况计算得出。即
margin-top=-(height/2)
、margin-left=-(left/2)
2、未知宽度、高度元素的水平垂直居中
方式一:display:table
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>未知高度和宽度元素的水平垂直居中 </title>
<style>
#wrap {
text-align: center;
width: 200px;
height: 200px;
background: #ffa500;
display: table;
padding: 50px;
}
#wrap div {
display: table-cell;
vertical-align: middle;
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div>以前听一个笑话让用ABCDEFG怎么造句:A呀,这B孩,C家的,光脚站在D上,EF也不穿,GG还露在外边。其实ABCDEFG是什么意思:A boy can do everything for girl.</div>
</div>
</body>
</html>
方式二:position定位+transform
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>未知高度和宽度元素的水平垂直居中 </title>
<style>
#wrap {
position: relative;
background: #ffa500;
padding: 50px;
}
#wrap div {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div>以前听一个笑话让用ABCDEFG怎么造句:A呀,这B孩,C家的,光脚站在D上,EF也不穿,GG还露在外边。其实ABCDEFG是什么意思:A boy can do everything for girl.</div>
</div>
</body>
</html>
方式三:flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>未知高度和宽度元素的水平垂直居中-flex实现 </title>
<style>
#wrap {
display: flex;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
background: #ffa500;
}
#wrap div {
background: #55d4eb;
margin: 10px;
}
</style>
</head>
<body>
<div id="wrap">
<div>我是div</div>
<div>这么巧,我也是div</div>
<div>我的天啊!居然有两个div在啊,这么巧,我也是div,哈哈</div>
</div>
</body>
</html>
方式四:gird布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>未知高度和宽度元素的水平垂直居中-grid实现 </title>
<style>
*{
margin: 0;
}
body,
html {
height: 100%;
display: grid;
text-align: center;
background: #ffa500;
}
div {
margin: auto;
background: #55d4eb;
}
</style>
</head>
<body>
<div id="wrap">
<div>我是div</div>
<div>这么巧,我也是div</div>
<div>我的天啊!居然有两个div在啊,这么巧,我也是div,哈哈</div>
</div>
</body>
</html>
第四、五方法属于比较前沿的用法,目前兼容性不是很好,可以在自己的项目中测试后使用。但是这两种方法最终将成为今后的主流方法。