CSS居中对齐
垂直居中
方法一:
这种方法用来实现单行垂直居中是相当的简单的,你只要保证元素内容是单行,并且其高度是固定不变的,你只要将其“line-height”设置成和“height”值一样就Ok了。不过这种方法局限性太大,只有单行文本的元素才适用,所以在多行元素中是不能使用这种方法的。
<!DOCTYPE html>
<!--
作者:630280136@qq.com
时间:2018-11-14
描述:heiht与line-height的值一样
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
div{
height: 100px;
width: 100px;
border: 1px solid red;
}
span{
line-height: 100px;
};
</style>
<body>
<div>
<span>wqeqw</span>
</div>
</body>
</html>
优点:
适合在所有浏览器,没有足够空间时,内容不会被切掉
缺点:
仅适合应用在文本上,并且这种方法,当你文本不是单行时,效果极差,差到让你感到恶心。
这种方法对运用在小元素上是非常有用的,比如说让一个button、图片或者单行文本字段。
方法二 表格盒类型
在表格的单元格(td)中,用vertical-align属性就能让内容垂直居中,现在用这种方法把普通元素调整为表格元素,模拟出表格的效果
缺点
虽然模拟表格能带来很多便捷,但同时也受到了限制。列如调整过的元素不能用定位和浮动;
使用盒类型table-cell的时候,必须同时有个祖先元素的盒类型是table;变成表格的元素,他的默认宽度将不再占一行,因为表格的本质上时行内元素
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.box1{
display: table-cell;
vertical-align: middle;
text-align: center;
width: 100px;
height: 100px;
background: #FF0000;
}
</style>
</head>
<body>
<div class="box box1">
<span>垂直居中</span>
</div>
</body>
</html>
方法三 容器的上下内边距padding相同
position 元素已知宽度
父元素设置为:position: relative;
子元素设置为:position: absolute;
距上50%,据左50%,然后减去元素自身宽度的距离就可以实现
<div class="box">
<div class="center">我要居中</div>
</div>
<style>
* {
margin: 0;
padding: 0
}
.center {
line-height: 100px;
background: red;
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin: -50px 0 0 -50px;
}
.box {
width: 200px;
height: 200px;
margin: 0 auto;
background: gray;
position: relative;
}
</style>
方案四:position transform 元素未知宽度
优点
父元素的高度和宽度可以任意改变,不影响子元素垂直居中
<!DOCTYPE html>
<!--
作者:630280136@qq.com
时间:2018-11-16
描述:绝对定位+父元素position非static+子元素transform
这个和第三种方法很相似。
-->
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<style>
.outside {
width:300px;
height: 300px;
margin:100px auto;
background-color: red;
position: relative; // 父元素非static
}
.inner {
width:500px;
height: 30px;
background-color: yellow;
position: absolute;
top:50%;
transform: translateY(-50%); // 相对于自身高度,向上移动50%
}
</style>
</head>
<body >
<div class="outside">
<div class="inner">
inner
</div>
</div>
</body>
</html>
方案五:flex布局
在伸缩容器中,子元素垂直居中,相当于侧轴的居中对齐
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
.box{
width: 200px;
height: 200px;
border: 1px solid red;
display: flex;
align-items: center;
}
.box1{
width: 50px;
height: 50px;
background: #0000FF;
}
</style>
<body>
<div class="box">
<div class="box1"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
display: flex;
flex-direction: row;
}
.in{
background: blue;
width: 100px;
height: 100px;
align-self: center;
text-align: center;
}
</style>
</head>
<body>
<div class="out">
<div class="in"></div>
</div>
</body>
</html>
方案六:定位(高度已知)
原理和方案四是一样的,都是父元素开启相对定位,子元素开启绝对定位。移动50%,然后在向上移动自身高度的50%。这里的50%是确切的值 -25px就是确切的 ,不能使用百分数表示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
.box{
width: 200px;
height: 200px;
border: 1px solid red;
position: relative;
}
.box1{
width: 50px;
height: 50px;
background: #0000FF;
position: absolute;
top: 50%;
margin-top: -25px;
}
</style>
<body>
<div class="box">
<div class="box1"></div>
</div>
</body>
</html>
方案七:父元素设置行高line-hight 子元素为内联或者内联块级元素
作用环境:父元素设置line-height。
作用对象:子元素中的inline-block和inline元素。
<!DOCTYPE html>
<!--
作用环境:父元素设置line-height。
作用对象:子元素中的inline-block和inline元素。
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<style type="text/css">
.box1{
width: 1000px;
line-height: 100px;
border: 1px solid red;
}
.box2{
height: 100px;
display: inline-block;
}
</style>
<body>
<div class="box1">
<div class="box2">
我是带着JS走南闯北
</div>
</div>
</body>
</html>
方案八:通过verticle-align:middle实现CSS垂直居中。
通过vertical-align:middle实现CSS垂直居中是最常使用的方法,但是有一点需要格外注意,vertical生效的前提是元素的display:inline-block。
我可以在class="wrapper"的div里面加一个div空标签,把它的高度设为100%,宽度设置为0,再给它一个vertical-align:middle样式,同样的给class="box"的div一个vertical-align:middle样式,那么box就可以在div里面垂直居中了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.wrapper{
width: 500px;
height: 500px;
background-color: red;
}
.box{
width: 100px;
height: 100px;
background-color: deepskyblue;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
}
.help{
width: 0;
height: 100%;
display: inline-block;
vertical-align: middle;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="box"></div>
<div class="help"></div>
</div>
</body>
</html>
水平居中
方法一 margin:0 auto;text-align:center 实现CSS水平居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
}
.in{
background: blue;
width: 100px;
height: 100px;
margin: 0 auto;
text-align: center;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法二 flex布局
使用flex实现水平居中的方法越来越多。
实现原理:父元素display:flex;flex-direction:column,而子元素align-self:center
这个和实现CSS垂直居中一样,只不过一个是row一个是column
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
display: flex;
flex-direction: column;
}
.in{
background: blue;
width: 100px;
height: 100px;
align-self: center;
text-align: center;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法三margin-left
对于父元素和子元素的宽度都确定的情况,通过适合这个方法来实现水平居中,使用时,子元素给剩余宽度一半margin-left(父的宽度减去子的宽度/2)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
}
.in{
background: blue;
width: 100px;
height: 100px;
margin-left: 150px;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法四 position:absolute
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
position: relative;
}
.in{
background: blue;
width: 100px;
height: 100px;
position: absolute;
left: 150px;
text-align:center;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法五 position transform
如果元素未知宽度,利用transform在X中移动自身的50%距离
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
position: relative;
}
.in{
background: blue;
width: 100px;
height: 100px;
text-align: center;
position: absolute;
left: 50%;
transform: translateX(-50%);
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
水平垂直居中
方法一 position:absolute
这个最适合已知父子元素的宽高
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
position: relative;
}
.in{
background: blue;
width: 100px;
height: 100px;
text-align: center;
position: absolute;
left: 150px;
top: 150px;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法三 postion transform
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
position: relative;
}
.in{
background: blue;
width: 100px;
height: 100px;
text-align: center;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法三 flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
-webkit-align-items:center ;
justify-content: center;
align-items:center ;
}
.in{
background: blue;
width: 100px;
height: 100px;
text-align: center;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法四 margin:auto
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
position: relative;
}
.in{
background: blue;
width: 100px;
height: 100px;
text-align: center;
position: absolute;
margin:auto;
left: 0;
top: 0;
bottom: 0;
right: 0;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>
方法五 table-cell 子元素不能是块级元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS垂直居中</title>
<style>
.out{
width: 400px;
height: 400px;
background: gray;
display: table-cell;
vertical-align: middle;
text-align: center;
}
.in{
background: blue;
width: 100px;
height: 100px;
display: inline-block;
}
</style>
</head>
<body>
<div class="out">
<div class="in">温清夜</div>
</div>
</body>
</html>