flex 布局
flex 布局
1. 图例
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>
- 当 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;
}
- 当 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>