CSS梳理之水平和垂直居中

1,864 阅读2分钟
<div class="wreap">
      <div class="box size"></div>
</div>
.wreap{
    position: relative;
    top: 200px;
    left: 500px;
    width: 300px;
    height: 300px;
    border: 1px solid #000000;
}
.box{
}
.size{
    width: 100px;
    height: 100px;
    background-color: #ff00ff;
}

上面是统一的html和css设置。

size样式用来子元素的宽高变化

一、子元素定宽高

1. absolute + margin

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

绝对定位absolute会以自身的左上角

相对其父元素的左上角进行定位,所以需要引入负值得margin来修正偏移

2.absolute + calc

.box{
  position: absolute;
  top: calc(50% - 50px);
  left: calc(50% - 50px);
}

css3 带来的计算属性也可以用来进行修正偏移

3.absolute + auto

.box{
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
}

margin: auto会根据元素的宽高自动计算其margin值,但是如果不加position,auto在计算时margin-top和margin-bottom的值是0,也就是等于margin:0 auto,只能实现水平居中,无法垂直居中。

如下图所示:

当设置position并把四周距离都设为0后,margin-top和margin-bottom的值就出现了,如下图所示

这个事情看上去比较神奇,其实也是有内在逻辑的。

一个元素既要贴着上边挨着下边,还不能拉伸自身高度,那怎么办,自然是让margin动一动啦,一动margin设置的auto就会自动计算上下间距的值,进而实现垂直居中。

通过这里也可以看出position:abslote 绝对定位其实是以盒模型外侧左上角作为基准点实现的。

当然既然讨论到了这里,喜欢搞事的小伙伴自然会想到,那如果我即设置了距离top,right,bottom,left为0,有设置maigin为一个定值且小于到达父元素内边的值会如何呢?

可以说这种矛盾的定义日常工作中尽量不要做,当然在这里搞一下事是没问题的。

结论如下: 会优先执行margin,可见margin的优先级比position要高一些。

二、子元素不定宽高

效果如上图所示

1. absolute +tansform

.box{
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
  background-color: #ff00ff;
}

这个方法是利用了translate计算时是以自身的宽高以标准的特点,来修正top:50%和left:50%所带来的偏差。

我们使用了position:absolute是子元素形成了BFC,使其宽高完全由自身内容撑开,保证了translate计算的准确性。

2. flex

.wreap{
  display: flex;
  justify-content: center;
  align-items: center;
}

十分优雅,几行代码就行了,而且目前移动端、pc端的兼容性都很不错,可以尝试使用了。

不过个人在小程序(微信)上使用的时候,有时候会有问题.......看业务需求取舍吧~~~

ps:flex是设置在父元素的哈

完结,撒花~~~~~~~~~~~~~~~