布局
flex 布局
flex 属性
假设在 1 个 500px 的容器中,我们有 3 个 100px 宽的元素,那么这 3 个元素需要占 300px 的宽,剩下 200px 的可用空间。
flex-basis
定义元素的空间大小,默认值是auto
,例子中的元素空间大小就是 100px
flex-grow
元素会以flex-basis
为基础,沿主轴方向增长尺寸,可以按比例分配可用空间
假如所有元素都设置flex-basis: 1
,则可用空间被平分
示例中,假如第一个元素设置flex-basis: 2
,其余两个设置为flex-basis: 1
,则第一个元素分配到 100px,其余元素各分配到 50px
flex-shrink
元素收缩,只有在 flex 元素总和超出主轴才会生效
flex 简写
简写按这个顺序书写: flex-grow
、flex-shrink
、flex-basis
预定义的简写形式:
flex: initial
: 相当于flex: 0 1 auto
,不拉伸,可收缩flex: auto
: 相当于flex: 1 1 auto
,可拉伸,可收缩flex: none
: 相当于flex: 0 0 auto
,不可伸缩flex: 正整数
:flex: 1
或者flex: 2
等,相当于flex: 1 1 0
,元素可以在flex-basis: 0
的基础上伸缩
子元素的总宽度超过父容器的宽度时,会收缩子元素的宽度。如果不想收缩宽度,可以给相关子元素设置 flex-basis
.box {
display: flex;
width: 300px;
height: 500px;
}
.l {
/* width: 200px;
min-width: 200px; */
flex: 0 0 200px;
}
.r {
width: 300px;
}
gird 布局
是一个基于二维网格的布局系统
网格容器
使用display: grid
或display: inline-grid
创建一个网格容器,这个元素的所有直系子元素将成为网格元素
一个网格元素也可以成为一个网格容器
- 网格单元:单元格,行列线交叉形成
- 网格区域:网格元素向行或列的方向扩展一个或多个单元,形成网格区域,是矩形
网格轨道
一个网格轨道就是网格中任意两条线之间的空间
grid-template-rows
:定义行轨道,设置行高grid-template-columns
:定义列轨道,设置列宽
以下是关键字和函数:
1、 grid-template-rows: 100px 100px;
表示 2 行,每行高度是 100px
2、 repeat 函数,可以简化重复的值,第一个参数是重复的次数,第二个参数是要重复的值
grid-template-columns: repeat(2, 100px)
3、 fr
代表网格容器中可用空间的一等份
grid-template-columns: 200px 1fr 2fr
表示第一个列宽为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3
4、 auto-fill
表示自动填充,让一行或者一列中尽可能的容纳更多的单元格
grid-template-columns: repeat(auto-fill, 200px)
表示列宽是 200px,但列的数量是不固定的
5、 minmax
函数,设置长度范围
grid-template-columns: 1fr 1fr minmax(300px, 2fr)
表示第三个列宽最小是 300px,最大不能大于前两列宽的两倍
6、 auto
由浏览器决定长度,可轻易实现两列或三列布局
grid-template-columns: 100px auto 100px
表示第一、第三列为 100px,中间由浏览器决定长度
网格线
在定义网格时,定义的是网格轨道,而不是网格线。利用网格线可以灵活的生成复杂的布局
grid-row-start: 1;
表示行线开始位置,这里是 1grid-row-end: 3;
表示行线结束位置,这里是 3grid-column-start: 1;
表示列线开始位置,这里是 1grid-column-end: 4;
表示列线结束位置,这里是 4grid-row: 1 / 3;
表示行线的简写形式grid-column: 1 / 4;
表示列线的简写形式
示例:
- 从左至右,第一个元素从行线 1 延伸到行线 3,占据了两个行轨道。从列线 1 开始,延伸至列线 4,即独占一行
- 第二个元素从行线 3 到行线 5,跨越了两个行轨道
- 第三个元素从列线 2 到列线 4,跨越了两个列轨道
- 剩下的元素会自动放到网格剩余的空间中
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three</div>
<div class="box4">Four</div>
<div class="box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.wrapper div {
background-color: #f2f2f2;
border: 1px solid #333;
}
.box1 {
grid-row: 1 / 3;
grid-column: 1 / 4;
}
.box2 {
grid-row: 3 / 5;
}
.box3 {
grid-column: 2 / 4;
}