元素居中的简单方法

212 阅读4分钟

元素的居中操作

1.块元素的水平居中

方案1:利用margin:0 auto

原理:margin会平分剩余空间,可以理解为父元素的宽度-自身的宽度,这个就是剩余空间。

注意: 使用margin居中只能水平 不可以垂直 (自己的理解:因为块元素独占一行 所以浏览器认为在这一行内没有剩余空间了 不知道对不对)

只对块元素生效,元素是内联(inline)或者有浮动(float)和定位效果(absolute/fixed)则会失效

居中是在父元素内居中

父元素要有足够的空间

{
    margin0 auto;
    width200px;
    height200px;
    background:pink;
}

2.块元素的水平垂直居中

方案一:绝对定位实现水平居中

{
    width200px;
    height200px;
    background:pink;
    position:absolute;
    top:50%;//挪动到当前参考物宽度中心点的右侧
    left50%;//挪动到当前参考物高度中心点的下侧
    /*transform: translate(-50%,-50%); transfrom属性中的 translate可以使元素平移 -50%也就是自身大小的一半 负值是往相反的方向走*/
    transform:translateX(-50%) translateY(-50%);
}

方案二:原理同上 只不过用的是margin减去自身一半的大小

#wrap{
    width400px;
    height400px;
    background:yellow;
    position:relative;
}
{
    width200px;
    height200px;
    background:pink;
    position:absolute;
    top:50%;
    left50%;
    margin-left:-100px/*自身宽高度的一半*/
    margin-top:-100px
}

方案三:加定位后,使其四个方向为0,最后margin:auto

原理:1.块元素如果不设置大小,加absolute定位后,设置 top:0;left:0;bottom:0;right:0;块元素会被拉长铺满整个屏幕,相当于width自适应和父元素一样高,height也被拉长和视口高度一样。(后面这句话是自己理解)

2.本文开头我写了margin;auto实现原理实际就是自动计算剩余空间。当块元素有大小,加定位属性后设置四个方向为0,相当于四个方向都去拽着块元素(如果四个方向都有 只会以left和top为主)。

3.但是元素自身有大小,所以不会被拽的铺满整个屏幕。而margin:auto水平方向居中已经验证了,至于为什么垂直也行?可以理解为:此时height被top 和 bottom拉着,有剩余空间所以自动居中。

#wrap{
    width400px;
    height400px;
    background:yellow;
    position:relative;
}
#box{
    width200px;
    height200px;
    background:pink;
    position:absolute;
    top0;
    left0;
    bottom0;
    right0;
    margin:auto;
}

方案四:flex方法

原理:给父元素加flex属性 使其变为弹性盒 justify-content:center; 主轴居中 align-items:center;交叉轴居中。

#wrap{
    width400px;
    height400px;
    background:yellow;
    displayflex;
    justify-content:center;
    align-items:center;
}
#box{
    width200px;
    height200px;
    background:pink;
}

方案五:flex+margin

原理:如果盒子变为弹性盒 相当于margin垂直方向上有剩余空间

#wrap{
    width:400px;
    height:400px;
    background:yellow;
    display:flex;
}
#box{
    width:200px;
    height:200px;
    background:pink;
    margin:auto;
}

3.行内元素的水平垂直居中

原理:text-align:使文本水平居中

line-height:元素自身高度 使文本垂直居中

#wrap{
    width:400px;
    height:400px;
    background:yellow;
    text-align:center;
    line-height:400px;
}
<div id="wrap">内容</div>

image.png

4.行内块元素水平垂直居中

原理:让块元素变为行内块元素。也就是相当于把box变为“内容”,此时我们进行行内元素水平垂直居中会发现没有居中

image.png 这是因为line-height:自身大小, 让自己的基线居中了。(还记得基线不了 英文书写是 四线三格 想不起来搜下基线)而孩子的 vertical-align:默认值是元素放在父元素的基线上

image.png 所以添加 vertical-align:middle;让基线到孩子自身的中间 image.png 但此时还有问题孩子到父亲上下边距都有一点距离(下边距看的不明显) 原因是:字与字直接有缝隙 那么如何避免这种缝隙呢? font-size:0 你把字的大小设置为0,字都没了 别说缝隙了。有小伙伴可能此时有点迷 那盒子不会消失么?盒子又不是字 盒子相当于"内容" 只是一种比喻。

image.png

#wrap{
    width400px;
    height400px;
    background:yellow;
    text-align:center;
    line-height400px;
    font-size0;
}
#box{
    width200px;
    height200px;
    background:pink;
    display:inline-block;
    vertical-align:middle;
}

\