css之一维布局flex

153 阅读3分钟

flex是一种用于按行或者按列布局元素的一维布局方法。元素可以膨胀以填充额外的空间,收缩以适应更小的空间。

从概念上可以看出flex适合用于一维布局

容器盒子

主轴对齐

justify-content: flex-start flex-end center space-around space-between space-evenly

css12.jpg

交叉轴对齐

align-content:stretch(默认) flex-start flex-end center space-around space-between space-evenly 
align-items: stretch(默认) flex-start flex-end center baseline

stretch:拉伸的意思,当子项不设置高度的适合,就拉伸到跟父级一样的高度

align-content生效的前提是必须要折行:

flex-wrap: wrap 
align-content: flex-end

align-items是表示每一行的对齐方式,而不是整体,align-content是针对整体的。所以,在工作用align-items是比较常用的。我们看看两者的差异:

display: flex; 
flex-wrap: wrap; 
align-content: flex-start;

css12.jpg

display: flex; 
flex-wrap: wrap; 
align-items: flex-start;

align-content它会作为一个整体进行flex-start,align-items只是针对一行,这里设置了flex-wrap,所以把容器会分为上下两部分,那么每一行就在对应的小容器(上下两个容器)中flex-start

css13.jpg

水平垂直居中

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

利用margin:auto实现:

.father { display: flex; width: 500px; height: 500px; } 
.main div { width: 100px; height: 100px; margin: auto; }

利用margin:auto及position:absolute

.main { 
    width: 100px; 
    height: 100px; 
    position: absolute; top: 0; bottom: 0; left: 0; right: 0; 
    margin: auto;
}

利用margin-right:auto占据剩余空间

.main { 
    width: 800px; 
    height: 500px; 
    background-color: bisque; 
    display: flex; 
} 
.main div { 
    width: 50px; 
    height: 100px; 
    background-color: 
    aquamarine; 
    margin-right: 10px; 
} 
.main div:nth-of-type(1) { 
    // 第一div会把所有剩余空间撑满,这样右边的元素会被挤到最右边 
    margin-right: auto; 
}

css14.jpg

我们还可以分为多个组:

.main div:nth-of-type(1) { margin-right: auto; } 
.main div:nth-of-type(5) { margin-right: auto; }

css16.jpg

子项

flex-grow

默认是0,表示不占用剩余的空白间隙扩展自己的宽度。

  • 只有一个子元素的时候:flex-grow等于1,2,3是没有任何区别的,都表示沾满剩余空间,如果写0.5,那么就对剩余空间占一半。
  • 如果有多个元素:会把剩余空间等比例分配,然后按照各自flex-grow设置的数字进行分配

flex-shrink

默认是1,表示flex容器空间不足时,元素的收缩比例。

flex-basis

默认是auto(自身大小),作用是给item设置宽度的,优先级要大于width。如果同时设置了basis和width,那么basis会覆盖width。不过,如果设置了flex-direction: column,那么basis就覆盖height。

flex缩写: 它是flex-grow, flex-shrink,flex-basis的缩写

flex: 1 
等于
flex-grow: 1; flex-shrink: 1; flex-basis: auto;

等高布局

flex默认就是一个等高布局,因为子项的高度默认就是stretch拉伸。

sticky footer布局

css17.jpg

.main {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
.header,
.footer {
  height: 100px;
}
.content {
  flex-grow: 1;
}
<div class="main">
    <div class="header"></div>
      <div class="content">
        <div>等高布局</div>
      </div>
      <div class="footer">footer</div>
    </div>

溢出项布局

css18.jpg

做出这种效果主要是把flex-shrink:0,不让它收缩。这个用在轮播图,导航栏的场景中。

.main {
  height: 100px;
  display: flex;
  align-items: center;
}
.main div {
  width: 100px;
  height: 80px;
  margin-right: 10px;
  flex-shrink: 0;
}