方法解读:
div#wrap{
width:300px;
height: 300px;
background-color: pink;
}
div#test{
width:100px;
height: 100px;
background-color: deeppink;
margin: 0 auto;
}
直接用text-align属性的center值即可搞定,text-align属性的含义就是块级元素中的行内内容的对齐方式。
三种方法,都是基于绝对定位的
(1)方法1:已知宽度和高度 + left:50% + top:50% + margin-left:自身border-box宽度一半的负值 + margin-top:自身border-box高度一半的负值
(2)方法2:left:50% + top:50% + transform(-50%,-50%,0)
(3)【推荐】方法3: 已知宽度和高度 + left:0 + right:0 +top:0 + bottom:0 + margin:auto
#wrap{
position: relative;
width:400px;
height: 300px;
background-color: pink;
}
#test{
position: absolute;
left:50%;/*包含块宽度的百分比*/
top:50%;/*包含块高度的百分比*/
margin-left:-50px;/*元素自身宽度的一半*/
margin-top:-50px;/*元素自身高度的一半*/
width:100px;
height: 100px;
background-color: deeppink;
}
这是一段文本啊啊啊
这是一段文本啊啊啊
这是一段文本啊啊啊
这是一段文本啊啊啊
这是一段文本啊啊啊
这是一段文本啊啊啊
#wrap{
position: relative;
width:400px;
height: 300px;
background-color: pink;
}
#test{
position: absolute;
left:50%;/*包含块宽度的百分比*/
top:50%;/*包含块高度的百分比*/
transform: translate3d(-50%,-50%,0);/*宽度和高度不固定*/
background-color: deeppink;
}
原理是如下公式:
left+margin+border+padding+width+right = 占据包含块(元素padding box)的宽度
top+margin+border+padding+height+bottom = 占据包含块(元素padding box)的高度
#wrap{
position: relative;
width:400px;
height: 300px;
background-color: pink;
}
#test{
position: absolute;
left:0;
right: 0;
top:0;
bottom: 0;
margin:auto;
width:100px;
height: 100px;
background-color: deeppink;
}
方法解读:由于图片是inline-block元素,所以水平居中使用text-align:center;即可,关键是垂直居中,但是肯定会涉及到vertical-align:middle。方法是利用vertical-align:middle。
代码
#wrap{
width:300px;
height: 300px;
border:1px solid;
margin:0 auto;
text-align: center;
}
#wrap img{
vertical-align: middle;
}
#wrap:after{
content:"";
height: 100%;/*相对于#wrap*/
width:0;
background-color:pink;
display: inline-block;/*与图片成为兄弟行内元素*/
vertical-align: middle;
}
一般指的是一个块级元素比如
等元素的内容为一个单行文本,方法为让块级元素的line-height与height相等,更优雅的方式是只给块级元素设置line-height而不设置height,这样也能实现效果,因为height此时会被其中的内容默认撑开。
下面的效果是单行文本垂直居中+水平居中
这是一段单行文本
div#wrap{
line-height: 60px;/*也可以加上height:60px;*/
background-color: pink;
width: 200px;
text-align: center;/*块级元素中的行内内容的水平对齐方式*/
}
其实这个问题需要看承装多行文本的元素的display:
(1)如果是block元素
这是一段文本
这是一段文本
这是一段文本
这是一段文本
这是一段文本
div#wrap{
position: relative;
width:300px;
height: 300px;
background-color: pink;
}
p#test{
position: absolute;
left:50%;
top:50%;
transform: translate3d(-50%,-50%,0);
background-color: deeppink;
}
(3)如果是inline元素
这是一段文本
这是一段文本
这是一段文本
这是一段文本
这是一段文本
div#wrap{
width:300px;
height: 300px;
background-color: pink;
}
span#test{
display: inline-block;
background-color: deeppink;
vertical-align: middle;
}
div#wrap:after{
content: "";
display: inline-block;
height: 100%;
width:0;
vertical-align: middle;
}
div#wrap{
text-align: center;/*让整个span在#wrap中水平居中*/
}
(4)把block元素转化为inline-block
这是一段文本
这是一段文本
这是一段文本
这是一段文本
这是一段文本
div#wrap{
width:300px;
height: 300px;
background-color: pink;
}
p#test{
display: inline-block;
background-color: deeppink;
vertical-align: middle;
}
div#wrap:after{
content: "";
display: inline-block;
height: 100%;
width:0;
vertical-align: middle;
}
div#wrap{
text-align: center;
}
上述不同场景的垂直水平居中其实会有重合的地方,但是每个场景总会有最适合自己的方案,一般来说,能不提升层级就不提升层级,也就是尽量少使用float和position:absolute。如果是在面试中,那么不同的场景的考察点是不同的,比如图片垂直水平居中的考察点是vertical-align的应用,单行文本垂直居中的考察点是line-height的应用,多行文本垂直居中最好的方案也是转化为inline-block从而利用和图片一样的方案,而块级元素垂直水平居中就是绝对定位和margin的应用。水平居中就比较简单了,块级元素的水平居中使用margin:0 auto;而行内元素(inline、inline-block)的水平居中就是其父级块元素的text-align:center;。此外还要掌握不同的盒模型的特点:浮动盒模型、绝对定位盒模型和普通盒模型,它们的包含块分别是什么,以及它们的层级,是否具有包裹性等等特点。