神奇的flex+margin:auto

flex布局相信是大家现在开发中比较常使用的一种布局了,使用flex布局进行垂直水平居中相信大家都已经很熟悉了。相信下边的代码大家已经屡见不鲜了。

div {
      width: 100px;
      height: 100px;
      background-color: black;
      display: flex;
      align-items: center;
      justify-content: center;
    }

今天就由这个来引出我们的猪脚,margin。margin用的很多,多用于处理外边距等。今天我们要说的是最简单的垂直水平居中,先来上一段代码:

//html代码
<div class="outer">
  <div class="inner"></div>
</div>
//style代码
  .outer {
    display: flex;
  }
  .inner {
    width: 100px;
    height: 100px;
    margin: auto;
  }

这样能完成水平垂直居中?你可以试试,这样真的可以。
可是这是为什么呢???
相信你之前也使用过或者想过使用margin:auto;对块级元素进行水平垂直居中,但是并没有达到想要的效果。block元素只是在水平方向上居中了,垂直方向上并没有居中。
bfc下margin无法垂直居中的原因

在块级格式化上下文中,margin-left和margin-right都为auto的时候,则表示他们的值相等,值得计算为剩余空间的一半,所以会达到水平居中。
而当margin-top和margin-bottom为auto的时候,则表示他们的值是0,所以无法完成垂直方向的居中。
ffc下margin垂直水平居中的原因

ffc就是flex布局的格式化上下文,在ffc中设置子元素margin:auto;在通过 justify-content 和 align-self 进行对齐之前,任何正处于空闲的空间都会分配到该方向的自动 margin 中去,这里特别说明下,设置了margin:auto后再设置父元素的justify-content或者子元素align-self则不生效,这里存在优先级的问题,margin的优先级更高一些,
margin实现等分等高

margin可以实现space-around或者space-between效果,代码也是特别简单:

//html代码
<ul class="container">
    <li>liA</li>
    <li>liB</li>
    <li>liC</li>
    <li>liD</li>
    <li>liE</li>
</ul>
 /* style代码 
    原先实现space-around
    .container{
      display: flex;
      justify-content: space-around;
    }
  */
  /* margin实现 */
  .container {
    display: flex;
  }
  li {
    margin: auto;
  }

是不是特别简单,嘻嘻。对于space-between只是将上边的变化下,对于第一个li元素和最后一个li元素特殊处理下即可,增加如下代码即可。

li:first-child {
    margin-left: 0;
}

li:last-child {
    margin-right: 0;
}

水平方向上的等分我们已经了解了,接下来可以试下垂直方向上的等分环绕。还是原先的html,我们实现下垂直方向flex-end效果

li {
    width: 100px;
    text-align: center;
    color: #fff;
    margin: auto;
    margin-bottom: 0; 
    margin-top: auto; 
}

margin实现两端对齐

导航我们经常用到两端对齐,功能菜单左侧对齐,当前用户、退出登陆右侧对齐。接下来我们就用神奇的margin实现下。现在我们把liD和liE居右。

//html代码
<ul class="container">
    <li>liA</li>
    <li>liB</li>
    <li>liC</li>
    <li>liD</li>
    <li>liE</li>
</ul>
.container{
  display:flex;
}
li:nth-of-type(4){
   margin-left:auto;
}

这样就很简单的实现了。
总结

bfc中margin-top 和 margin-bottom 的值如果是 auto,则他们的值都为 0。
ffc中margin-top 和 margin-bottom 的值如果是 auto,则他们平均分配垂直方向上的剩余空间。
单个方向上使用自动 margin ,它的计算值为该方向上的剩余空间。
使用了自动 margin 的 flex 子项目,它们父元素设置的 justify-content 以及它们本身的 align-self 将不再生效。
这里还需要分清那些flex父容器的属性,那些是子元素的属性,常用属性在这里提一下
父容器:display:flex, justify-content、align-self、flex-wrap(换行)、flex-direction,flex-flow(flex-firection+flex-wrap)、align-content。
子元素:flex 、align-self、flex-basis、flex-grow、flex-shink、order

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值