flex 布局

flex 布局

1. 图例

flex 的位置表

2. 容器的属性

1) flex-direction 属性

属性决定主轴的方向(即项目的排列方向)

flex-direction: row | row-reverse | column | column-reverse;

  • row(默认值):主轴为水平方向,起点在左端
  • row-reverse:主轴为水平方向,起点在右端
  • column:主轴为垂直方向,起点在上沿
  • column-reverse:主轴为垂直方向,起点在下沿

2) flex-wrap 属性

决定项目的换行规则

flex-wrap: nowrap | wrap | wrap-reverse;

  • nowrap(默认):不换行
  • wrap:换行,第一行在上方
  • wrap-reverse:换行,第一行在下方

3) flex-flow 属性

flex-direction 和 flex-wrap 规则的缩写

flex-flow: <flex-direction> || <flex-wrap>;

  • flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

4) justify-content 属性

项目在主轴上的对齐方式

justify-content: flex-start | flex-end | center | space-between | space-around;

  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

5) align-items 属性

项目在交叉轴上的对齐方式

align-items: flex-start | flex-end | center | baseline | stretch;

  • flex-start:交叉轴的起点对齐
  • flex-end:交叉轴的终点对齐
  • center:交叉轴的中点对齐
  • baseline: 项目的第一行文字的基线对齐
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度

6) align-content 属性

定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

align-content: flex-start | flex-end | center | space-between | space-around | stretch;

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

3. 项目的属性

1) order: (integer)

规定项目的顺序;

2) flex-grow: (number)

default 0 表示不会自动填充未满的空间

3) flex-shrink: (number)

default 1 表示可以压缩已设定的宽度
故 flex-grow, flex-shrink两个同时设为0代表项目的大小固定,不通过改变大小来适应容器

4) flex-basis: length | auto /* default auto */

定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

5) flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]

是 flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

6) align-self: auto | flex-start | flex-end | center | baseline | stretch;

属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

4. 理解

<div class="wrop">
    <span class="item">...</span>
    <span class="item">...</span>
    <span class="item">...</span>
    <span class="item">...</span>
    <span class="item">...</span>
    <span class="item">...</span>
</div>
  1. 当 wrop 设置为 wrop 时,可能造成里面的 item 不能充满整个容器,这时可以设置 wrop 或 item的 flex-grow: 1; ,可以使所有的 itme 或对应的 item 补充剩余的空间
.wrop {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
}
.item {
    height: 25%;
    width: 30%;
}
.item:nth-child(1){
    flex-grow: 1;
}


  1. 当 wrop 设置为 nowrop 时,可能造成里面的 item 充满整个容器而导致宽度比设定时小,这时可以设置 wrop 或 item的 flex-shrink: 0; ,可以使所有的 itme 或对应的 item 的大小保持原来的大小
.wrop {
  display: flex;
  flex-wrap: nowrap;
  align-content: flex-start;
}
.item {
    height: 25%;
    flex-basis: 40%;
}
.item:nth-child(1){
    flex-shrink: 0;
}


<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no">
<link rel="shortcut icon" type="image/x-icon" href="../images/day.png" media="screen">
<style>
*{
  margin: 0;
}
html{
  height: 100%;
}
body{
  height: 100%;
}
.HolyGrail {
  min-height: 100vh;
  background-color: #eae6e6;
}
header,
footer {
  color: white;
  text-align: center;
  background-color: #484848;
  box-sizing: border-box;
  border: 1px solid white;
}
.HolyGrail {
  display: flex;
  flex-direction: column;
}
header,
footer {
  flex: 1;
}
.HolyGrail-body {
  display: flex;
  /*flex: 1;*/
  height: 60%;
}
.HolyGrail-nav, .HolyGrail-ads {
  /* 两个边栏的宽度设为12em */
  flex: auto;
  box-sizing: border-box;
  border: 1px solid;
}
.HolyGrail-content {
  flex-grow: 1;
  box-sizing: border-box;
  border: 1px solid;
}
.HolyGrail-nav{
  order: -1;
}
@media (max-width: 768px) {
  .HolyGrail-body {
    flex-direction: column;
    /*flex: 1;*/
  }
  .HolyGrail-nav,
  .HolyGrail-ads,
  .HolyGrail-content {
    flex: auto;
  }
}
</style>
<body class="HolyGrail">
  <header>...</header>
  <div class="HolyGrail-body">
    <main class="HolyGrail-content">content</main>
    <nav class="HolyGrail-nav">nav</nav>
    <aside class="HolyGrail-ads">ads</aside>
  </div>
  <footer>...</footer>
</body>
</html>

5. 参考链接

Flex 布局教程:语法篇
Flex 布局教程:实例篇

posted @ 2018-03-13 00:05  另一个小菜头  阅读(284)  评论(0编辑  收藏  举报