在学习之前,我们需要明白几个基本的概念
我们先准备这样介个盒子
<body>
<style>
* {
list-style: none;
margin: 0;
padding: 0;
}
ul {
width: 600px;
height: 600px;
border: 3px solid rebeccapurple;
font-weight: bold;
color: white;
text-align: center;
line-height: 100px;
font-size: 40px
}
li:nth-child(even) {
width: 100px;
height: 100px;
background-color: red;
}
li:nth-child(odd) {
width: 100px;
height: 100px;
background-color: #000000;
}
style>
<ul>
<li>1li>
<li>2li>
<li>3li>
<li>4li>
<li>5li>
<li>6li>
<li>7li>
<li>8li>
<li>9li>
ul>
body>
目前,他看起来是这样的
我们通过grid-template-columns
来指定列数,我们写上如下代码
ul{
display: grid;
/* 相当于grid-template-columns:200px 200px 200px */
grid-template-columns: repeat(3,200px);
}
使用grid-template-rows
来设置每一行的高度,他的是可以是具体的值,也可以是百分比
ul{
display: grid;
/* 相当于grid-template-rows:200px 200px 200px */
grid-template-rows: repeat(3,200px);
}
行列属性,也就是grid-template-rows
和grid-template-columns
,我们可以直接缩写成grid-template
<body>
<style>
* {
list-style: none;
margin: 0;
padding: 0;
}
ul {
width: 600px;
height: 600px;
border: 3px solid rebeccapurple;
font-weight: bold;
color: white;
text-align: center;
line-height: 100px;
font-size: 40px
}
li:nth-child(even) {
background-color: red;
}
li:nth-child(odd) {
background-color: #000000;
}
ul{
display: grid;
/* 第一个表示行 、 第二个表示列 */
grid-template: repeat(3,200px) / repeat(2,300px);
}
style>
<ul>
<li>1li>
<li>2li>
<li>3li>
<li>4li>
<li>5li>
<li>6li>
ul>
body>
辅助函数适用于列,也适用于行,这里以列为代表进行说明
ul{
/* 相当于grid-template-rows:200px 200px 200px */
grid-template-rows: repeat(3,200px);
}
repeat()的第一个参数
ul{
/* 此时父元素没有宽高 */
display: grid;
grid-template-columns: repeat(auto-fill,100px);
}
接收两个参数产生一个范围,第一个参数为最小值,第二个参数为最大值,表示长度就在这个范围内
ul{
display: grid;
/* 分成三列,第一列和第二列的宽度都是200px,第三列的最小值为100px,最大值为200px */
grid-template-columns: 200px 200px minmax(100px,200px);
}
repeat()的第二个参数,也可以单独使用,是fraction的缩写,是分离的意思
ul{
display: grid;
/* 表示将容器平均分成4列 */
grid-template-columns: repeat(4,1fr);
}
ul{
display: grid;
/* 按照1:2:1的比例分成三列 */
grid-template-columns: 1fr 2fr 1fr;
}
他表示列的宽度由浏览器自己决定
ul{
display: grid;
grid-template-columns: 200px 100px auto;
}
注意当前所展示的结果是因为,把子元素全部都去掉了宽高
auto
属性,所以他它自动增长沾满了剩余的空间新版本中
grid
前缀已经去掉
ul{
display: grid;
grid-template-rows: repeat(3,1fr);
grid-template-columns: repeat(3,1fr);
gap: 20px 10px;
}
gap
决定;如果子元素设置了宽高,又设置了gap
,那么可能会导致子元素溢出父元素gap
缩写的第一个值表示行之间的距离,第二个表示列之间的距离这里会使用到
grid-template-areas
grid-template-areas
的前提是,我们需要使用grid-area
给子元素定义名称grid-template-areas
来在容器中摆放子元素的位置<body>
<style>
...
li:nth-child(1){
grid-area: header;
background-color: red;
}
li:nth-child(2){
grid-area: left-sidebar;
background-color: green;
}
li:nth-child(3){
grid-area: right-sidebar;
background-color: green;
}
li:nth-child(4){
grid-area: bottom;
background-color: black;
}
ul{
display: grid;
grid-template-rows: repeat(3,1fr);
grid-template-columns: repeat(3,1fr);
grid-template-areas:
"header header header"
"left-sidebar . right-sidebar"
"bottom bottom bottom"
;
}
style>
<ul>
<li>1li>
<li>2li>
<li>3li>
<li>4li>
ul>
body>
grid-area
对容器的子元素进行命名后,那么就是在容器中摆放盒子了grid-template-rows
和grid-template-columns
分成了三行三列,所以在grid-template-areas
,写成了一个3*3的矩阵.
表示grid-auto-flow
来控制盒子摆放的顺序grid-auto-flow: [ row | column ] || dense
1. 其中row 就是默认值,表示先行后列的排序
2. 其中column 表示先列后行的排序
3. dense表示多的格子空白填充
<body>
<style>
* {
list-style: none;
margin: 0;
padding: 0;
}
ul {
width: 600px;
height: 600px;
border: 3px solid rebeccapurple;
font-weight: bold;
color: white;
text-align: center;
line-height: 100px;
font-size: 40px
}
li:nth-child(even) {
background-color: red;
}
li:nth-child(odd) {
background-color: #000000;
}
ul{
display: grid;
grid-template-columns: repeat(3,200px);
grid-template-rows: repeat(2,300px);
}
style>
<ul>
<li>1li>
<li>2li>
<li>3li>
<li>4li>
<li>5li>
<li>6li>
ul>
body>
默认布局
当我们添加属性
ul{
display: grid;
grid-template-columns: repeat(3,200px);
grid-template-rows: repeat(2,300px);
/* 按列排,如果没有列,那么他默认是一列 */
grid-auto-flow: column;
}
效果
<body>
<style>
* {
list-style: none;
margin: 0;
padding: 0;
}
ul {
width: 600px;
height: 600px;
border: 3px solid rebeccapurple;
font-weight: bold;
color: white;
text-align: center;
line-height: 100px;
font-size: 40px
}
li:nth-child(even) {
background-color: red;
}
li:nth-child(odd) {
background-color: #000000;
}
ul{
display: grid;
grid-template-columns: repeat(3,200px);
grid-template-rows: repeat(2,300px);
/* 按列排,如果没有列,那么他默认是一列 */
grid-auto-flow: row;
}
li:first-child{
grid-column-start: 2;
}
style>
<ul>
<li>1li>
<li>2li>
<li>3li>
<li>4li>
<li>5li>
ul>
body>
效果
ul
加上如下属性ul{
display: grid;
grid-template-columns: repeat(3,200px);
grid-template-rows: repeat(2,300px);
grid-auto-flow: row dense;
}
就会呈现出一下属性
dense
属性,他会先检测前面是否还有空,如果还有空的话就会在有空的地方摆放