flex布局中margin的妙用:解决space-between最后一个元素靠右对齐的问题

4,997 阅读2分钟

一、flex布局中水平垂直居中

image.png

这还不简单?

      display: flex;
      justify-content: center;
      align-items: center;

但还可以结合margin来实现,可以不用设置justify-contentalign-items

  <style>
    .box {
      width: 500px;
      height: 200px;
      background-color: gainsboro;
      display: flex;
    }

    .box .item1 {
      width: 50px;
      height: 50px;
      background-color: orange;
      margin: auto;
    }
  </style>

<body>
  <div class="box">
    <div class="item1"></div>
  </div>
</body>

二、最后一个元素靠右对齐

image.png

这还不简单?

    .box {
      display: flex;
      justify-content: space-between;
    }

    .left {
      display: flex;
    }
    

  <div class="box">
    <div class="left">
      <div class="item item1"></div>
      <div class="item item2"></div>
    </div>
    <div class="item item3"></div>
  </div>

简单点:

    .box {
      display: flex;
    }
    .item3 {
      margin-left: auto;
    }
    
  <div class="box">
    <div class="item item1"></div>
    <div class="item item2"></div>
    <div class="item item3"></div>
  </div>

是不是少了一层容器,我经常看同事(前同事)的代码,多裹了好几层div,也就设置一个样式,为啥不减少div嵌套

三、实现这个效果

image.png

我就知道你这个大聪明想到了justify-content: space-between;

当你设置上后你会得到这个 image.png

可以使用margin来做到:

    .box {
      background-color: gainsboro;
      display: flex;
      flex-wrap: wrap;
      /* justify-content: space-between; */
    }


    .item {
      width: 50px;
      height: 50px;
      border: 2px solid darkslategrey;
      box-sizing: border-box;
      --n: 5; /* 一行几个 */
      --space: calc(100% - var(--n) * 50px); /* 一行减去item的宽度后剩下的间距 */
      --leftRight: calc(var(--space) / var(--n) / 2); /* 每个item左右的间距 */
      margin: 10px var(--leftRight);
    }

效果:

动画.gif

当然,你也可以设置成一行6个:--n: 6;

用网格布局也可以实现:

    .box {
      background-color: gainsboro;
      display: grid;
      grid-template-columns: repeat(5, 1fr);
    }

    .item {
      width: 50px;
      height: 50px;
      border: 2px solid darkslategrey;
      box-sizing: border-box;
      margin: 10px auto;
    }

如果你觉得这篇文章对你有用,可以看看作者封装的库xtt-utils,里面封装了非常实用的js方法。如果你也是vue开发者,那更好了,除了常用的api,还有大量的基于element-ui组件库二次封装的使用方法和自定义指令等,帮你提升开发效率。不定期更新,欢迎交流~