CSS水平垂直居中

水平居中

水平居中这个问题首先要搞清楚存在两个条件才能够称之为水平居中,
即父元素必须是块级盒子容器,父元素宽度必须已经被设定好

以下讨论 参考这个结构

<div class="wrap">
   <div class="non-child">
      non-child
   </div>
</div>

Scene1 : 子元素是块级元素而且宽度没有设定

这种情况下不存在水平居中的说法,因为子元素是块级元素没有设定宽度,那么它会填充满整个父级元素的宽度。

.wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;

      }
        .non-child{
            border: 1px solid #000;
            background: green;

        }

Scene2 子元素是行内元素,子元素宽度是由其内容撑开的

.center{
    text-align:center;
}

Scene3 子元素是块级元素且宽度已经设定

第一种
.center{
    margin:0 auto;
}
第二种
 .padding{
            padding-left: 100px;
        }

结果同上,这里计算父元素padding-left或padding-right方法为:
(父元素宽度-子元素宽度)/2
其实跟第一种的原理是一样的。
设置margin-left也一样
不过这里注意的是,如果指定了box-sizing就要不同的考虑。

注意box-sizing

box-sizing:border-box
浏览器默认认为是content-box :指定宽度和高度分别应用于元素的内容框。
在宽度和高度之外绘制元素的padding和border

border-box:指定高度和宽度确定元素边框box,对元素的宽度和高度的指定包括了border和padding的指定。

第三种
绝对定位

 .relative{

            position: relative;
        }
        .absolute{
            position: absolute;
            left:50%;
            margin-left:-50px;
        }

这里还要设定子元素margin-top为-50是需要消除父元素50%造成的偏移

垂直居中

前提

父元素是盒子容器,而且高度已经设定好。

Scene1

子元素是行内元素,高度是其内容撑开
这种情况需要设定父元素的line-height为其高度来使得子元素垂直居中

line-height是文本行基线之间的距离~

Scene2

子元素是块级元素但是子元素高度没有设定,在这种情况下实际上是不知道子元素的高度的,无法通过计算得到paddin或margin来调整。

**解法1 :给父元素设定display:table-cell;
vertical-align:middle来解决**

 .child{
            display: table-cell;
            vertical-align: middle;
        }

.wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }

Scene3

子元素是块级元素且高度已经设定

解法一
计算子元素的margin-top或margin-bottom,计算方法为父(元素高度-子元素高度)/2
或者
计算子元素的padding-top或padding-bottom

 .wrap{
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
 .child{
            padding-top: 100px;
        }

解法二
利用绝对定位,


        .child{
            position: absolute;
            top:50%;
            margin-top: -50px;
        }
.wrap{
            position:relative;
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }

解法三
使用flexbox

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值