如何玩转css的居中问题--上
随着知识点的增多,学习的深度加深;我发现自己对css的居中问题一种处于一种模糊的认知。可以说出几种方法,但不全也对这些方法没有清晰的认识;这也导致自己有一段时间,总发现写了居中,却总出现居中不了的情况。于是就有了这一个css居中系列,为大家玩转css的居中提供我个人的建议。
css居中分为三个模块
那么我们如何对css居中有个清晰的认识呢,我大致分为三个大模块;分别为;块级元素,行内元素,行内块。以这三个角度为大家阐述如何准确而有效的实现居中,当然这篇只是个前篇;接下来,也会更flex弹性布局,grid布局的文章。
行内元素
水平居中
面对这一要求,我们可以使用text-align实现水平居中;当然这一属性只对文本有效,对元素无效,不然就会出现写了居中却无效的效果。
如果对元素使用,则会出现这种情况
<style>
div{
text-align: center;
}
.box{
width: 100px;
height: 100px;
border: 1px solid red;
}
</style>
<body>
<div>
<div class="box">
</div>
</div>
</body>
垂直居中
有水平居中当然有垂直居中了,不过垂直居中就要分情况了。
父元素高度不确定
在父元素高度不确定时,我们将如何为行内元素设置垂直居中呢,在没学后面的知识的情况下,我们只能使用padding内边距来实现了,不过使用这种方法较少。因为他只能实现一个大概的垂直居中。
父元素高度确定
在这个时候,我们就可以用line-height来实现准确的垂直居中了,不过,line-height的值一定要等于父元素的高度。
高度确定多行文本居中
在css中还有一个垂直居中属性--vertical-align,这个也可以实现垂直居中,不过限制较多,在不改变父元素的情况下;只有当父元素是td和th的时候才有用。
.box{
width: 100px;
height: 100px;
border: 1px solid red;
vertical-align: middle;
}
</style>
<body>
<table>
<tr> <td class="box">
<span>vertical-align: middle;</span>
</td></tr>
</table>
</body>
块级元素
这个东西我们用的可就多了,这个的方法比行内元素还多。
水平居中
在水平居中中,我们就要分为两种情况。
宽度确定
在宽度确定的情况下,我们可以使用 margin: 0 auto;则可以实现水平居中,在这里0表示上下外边距为0,auto表示左右外边距为自动。
<style>
.box{
width: 100px;
height: 100px;
border: 1px solid red;
margin: 0 auto;
}
</style>
<body>
<div class="box">
margin: 0 auto;
</div>
</body>
宽度不确定
在这种情形下,我们有三种方法去解决它,让它居中。
方法一 table
我们可以在我们想要居中的块级元素外套一个table,使块级元素居中;其实table是一个行内块元素,他没有宽度,但他可以被填入的内容撑大;从而也可使用margin: 0 auto;使块级元素居中,方法同上。缺点:就是要加一个无意义的标签,同时也加深了嵌套。
方法二 display: inline;
我们可以通过将块级元素变成行内块元素,在使用text-align:center;让它居中;是不是比较方便,但是他将为使原来的元素失去一些块级元素的作用,功能(宽,高......)。
<style>
.contain{
text-align: center;
}
.box{
display: inline;
border: 1px solid red;
}
</style>
<body>
<div class="contain">
<div class="box">
margin: 0 auto;
</div>
</div>
</body>
注意了,text-align:center;一定要给父元素,不然就无效果了。
方法三 通过相对布局和绝对布局
这个可以和垂直居中写在一起,就和小伙伴们一起说了吧,首先我们在父元素中写一个 position: relative;表示是相对布局,在子元素中填写一个position: absolute;表示是一个绝对布局,这就表示子元素可以布局在父元素的任意地方。
.contain{
position: relative;
width: 300px;
height: 300px;
border: 1px solid red;
}
.box{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid red;
}
</style>
<body>
<div class="contain">
<div class="box">
position: absolute;
</div></div>
</body>
注意了上下的50%的含义是不同的,上面的是:子元素左上角的点移动到父元素宽为50%,高为50%的地方,这就产生了一个问题,这也是居中哇,所以就有了下面的50%;他表示向上移动自身高度的50%,向左移动宽度的50%。
当然这个方法在确定宽度的块级元素中也可以用。
垂直居中
块级元素的垂直居中,可以用上一个的方法三,同时也还用一个有兼容性问题的方法,他只支持ie8以上。它就是display: table-cell;使用他来激活块级元素的vertical-align: middle;从而实现垂直居中。
.contain{
position: relative;
display: table-cell;
width: 300px;
height: 300px;
border: 1px solid red;
vertical-align: middle;
}
.box{
border: 1px solid red;
}
</style>
<body>
<div class="contain">
<div class="box">
position: absolute;
</div></div>
行内块
这个就是对行内元素和块级元素相互转换,从而使我们可以更加灵活的使用居中。
- 转换为块元素:display:block;
- 转换为行内元素:display:inline;
- 转换为行内块:display: inline-block;
结束语
今天的总结就到这了,希望小伙伴们要动起来,操练起来。下面会为大家总结一番我对flex布局和grid布局的理解。
转载自:https://juejin.cn/post/7149437865426944037