flex布局

快速掌握flex布局

2019-11-01  本文已影响0人  seporga

前言

flex布局简化了前端布局问题,例如垂直居中,水平居中等,且目前为止主流浏览器都支持了这种布局,特别是移动端的浏览器,支持度更好。下面是在can i use上查询的结果。从查询的结果来看,支持IE10及以上浏览器,移动端几乎全线支持!

image.png

一、flex布局是什么?

flex布局意思是“弹性布局”,块级元素和行内元素都可以设置为flex布局。

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  ...
</div>

块级元素设置flex布局

.flex-container{
   display:flex;
   display: -webkit-flex; /* Safari */
   display: -ms-flex; /* IE10+ */
}

行内元素设置flex布局

.flex-container{
   display:-webkit-inline-box;
   display:-ms-inline-flexbox;  /* IE10+ */  
   display:inline-flex;  /* Safari */
}

二、flex布局基本概念

flex布局一般包含容器(flex-container)和若干个子元素(flex-item),布局上分为主轴和交叉轴。默认情况下,水平方向为主轴,垂直方向为交叉轴,可以通过设置flex-direction切换主轴和交叉轴(稍后会讲解如何切换)。flex布局的属性比较多,但可以归类为 容器属性子元素属性,教程会先讲解容器的属性,然后讲解子元素的属性,这样比较容易理解和记忆!

图片来源于网络,侵权请告知删除

三、flex容器的属性

flex有6个属性可以设置,它们分别是:

  1. flex-direction
  2. flex-wrap
  3. flex-flow
  4. justify-content
  5. align-items
  6. align-content

3.1 flex-direction属性

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container{
  display:flex;
  flex-direction: row | row-reverse | column | column-reverse | initial | inherit;
}
image.png image.png image.png image.png

3.2 flex-wrap属性

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
  <div class="flex-item">5</div>
  <div class="flex-item">6</div>
  <div class="flex-item">7</div>
  <div class="flex-item">8</div>
</div>

CSS样式

.flex-container{
  display:flex;
  flex-wrap : nowrap | wrap | wrap-reverse | initial | inherit;
}
image.png image.png image.png

3.3 flex-flow属性

flex-flow 属性是 flex-direction 和 flex-wrap 属性的复合属性,用于设置或检索弹性盒模型对象的子元素排列方式。flex-direction 属性规定方向, flex-wrap 属性规定是否拆行或拆列。

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
  <div class="flex-item">5</div>
  <div class="flex-item">6</div>
  <div class="flex-item">7</div>
  <div class="flex-item">8</div>
</div>

CSS样式

.flex-container{
  display:flex;
  flex-flow: flex-direction flex-wrap  | initial | inherit;
}
image.png image.png

3.4 justify-content属性

justify-content属性用于设置主轴上元素的排列方式。

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container{
  display:flex;
  justify-content: flex-start | flex-end | center | space-between | space-around | initial | inherit;
}
image.png image.png image.png image.png image.png

3.5 align-items属性

justify-content属性用于设置交叉轴上元素的排列方式。

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container{
  display:flex;
  height: 300px; /* 设置高度,才能看到效果 */
  align-items: stretch | center | flex-start | flex-end | baseline | initial | inherit;
}
image.png image.png image.png image.png image.png

3.6 align-content属性

align-content规定flex-container有剩余空间时,如何分配给子元素。这个属性设置的是所有子元素的对齐方式,需要设置flex-wrap(wrap或wrap-reverse),并且指定flex-container的高度(或宽度)才会生效。

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
  <div class="flex-item">5</div>
  <div class="flex-item">6</div>
  <div class="flex-item">7</div>
  <div class="flex-item">8</div>
</div>

CSS样式

.flex-container{
  display: flex;
  background: #eeeeee;
  align-content: center;
  height: 300px;
  flex-wrap: wrap | wrap-reverse;
  align-content:  stretch | center | flex-start | flex-end | space-between | space-around | initial | inherit;
}
image.png image.png image.png image.png image.png image.png

四、子元素(容器)的属性

flex子属性有6个属性可以设置,它们分别是:

  1. order
  2. flex-grow
  3. flex-shrink
  4. flex-basis
  5. flex
  6. align-self

4.1 order属性

order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

DOM结构

<div class="flex-container">
    <div class="flex-item">1</div>
    <div class="flex-item">-1</div>
    <div class="flex-item">0</div>
    <div class="flex-item">未设置order</div>
</div>

CSS样式

.flex-container{
  display:flex;
}
.flex-item{
  order: number | initial | inherit;
}
image.png

4.2 flex-grow属性

DOM结构

<div class="flex-container">
  <div class="flex-item">0</div>
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container {
  display: flex;
  background: #eeeeee;
}
.flex-item {
  flex-grow: flex-grow: number | initial | inherit;
}
image.png

4.3 flex-shrink属性

DOM结构

<div class="flex-container">
  <div class="flex-item">0</div>
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
  <div class="flex-item">4</div>
  <div class="flex-item">5</div>
  <div class="flex-item">6</div>
  <div class="flex-item">7</div>
</div>

CSS样式

.flex-container {
  display: flex;
  background: #eeeeee;
}
.flex-item {
  background: #b48882;
  flex-shrink: number | initial | inherit; 
}
image.png

4.4 flex-basis属性

flex-basis属性用于设置子元素的伸缩基准值,默认值为auto,即元素本身的大小。如果子元素同时设置宽高和flex-basis属性,flex-basis的优先级更高。

DOM结构

<div class="flex-container">
  <div class="flex-item">width:100px</div>
  <div class="flex-item">flex-basis: 200px;</div>
  <div class="flex-item">flex-basis: 300px;</div>
  <div class="flex-item">flex-basis: 400px;</div>
</div>

CSS样式

.flex-container {
  display: flex;
  background: #eeeeee;
}
.flex-item{
  flex-basis: auto | number | initial | inherit;
}
image.png

4.5 flex属性

flex属性是flex-grow、flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。flex支持缩写,例如经常用到的:flex: 1,等价于flex: 1 1 0%

DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container {
  display: flex;
  background: #eeeeee;
}
.flex-item{
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  margin: 5px;
  flex: flex-grow [flex-shrink] [flex-basis]  | auto | none | 1 | 0 | initial | inherit;
}
image.png image.png image.png image.png image.png image.png image.png

4.6 align-self属性

align-self 允许单个子元素设置与其他项目不一样的对齐方式,默认值:auto。
DOM结构

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
  <div class="flex-item">3</div>
</div>

CSS样式

.flex-container {
  display: flex;
  background: #eeeeee;
  height:300px;
}
.flex-item{
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  margin: 5px;
  align-self: auto | stretch | center | flex-start | flex-end | baseline | initial | inherit;
}
image.png image.png image.png image.png image.png image.png

最后,奉献一个九宫格布局的例子:https://codepen.io/linlif/pen/zYYRejb,效果图如下:

flex实现九宫格布局

本文完

参考资料:
30 分钟学会 Flex 布局
Flex 布局语法教程

上一篇 下一篇

猜你喜欢

热点阅读