类似于flex
布局
grid含义
grid
布局,也称之为网格布局,是将页面中的父元素划分为一个个小的格子,然后通过这些小的格子进行合并来制作出各种不同的网站效果怎么触发网格
display
属性,并且将取值设置为:grid
/inline-grid
grid
:代表的是块状网格,默认独占一行,类似于块级元素inline-grid
:代表的是行内块网格,与行内块元素类似与flex布局异同
相同点
不同点
flex
被称之为一维布局,也叫轴线布局grid
被称之为二维布局,有行列之分display
取值为grid
或者inline-grid
<head>
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
}
.box div {
display: inline-grid;
width: 300px;
height: 300px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<div>2</div>
<span>3</span>
</div>
</body>
行属性:grid-template-rows
列属性:grid-template-columns
取值一共7种
取值可以是px
,百分比%,或者自动填充(应用在重复函数中,代表的是根据需要重复的数值,进行自动填充数量)
还可以是auto
(代表自动,占剩余宽度和剩余高度的所有)
还可以是片段划分:为了方便表示比例关系,网格布局提供了fr
关键字(fraction
的缩写,意为“片段”)。如果两列的宽度分别为1fr
和2fr
,就表示后者是前者的2倍 grid-template-rows: 1fr 2fr 2fr;
类似于felx: n;
最后一种取值是minmax(num1,num2)
函数,可以理解成最小最大值函数,函数中两个参数,参数1代表的是最小值,参数2代表的是最大值
grid-template-columns: 50px 100px minmax(50px, 100px);
<head>
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
}
.box div {
display: inline-grid;
/* 行 */
grid-template-rows: 100px 100px 100px;
/* 列,auto会占剩余宽度和剩余高度的所有 */
grid-template-columns: 50px auto 50px;
width: 300px;
height: 300px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<span>1</span>
<div>2</div>
<span>3</span>
</div>
</body>
repeat(num1,num2)
函数,适用于划分行列很多的情况
display: inline-grid;
/* 行 */
grid-template-rows: 20% 60% 20%;
/* 列 */
grid-template-columns: repeat(3, 100px);
自动填充auto-fill
display: inline-grid;
/* 行 */
grid-template-rows: 20% 60% 20%;
/* 列,自动填充,会按列数宽度按照30%的宽度进行划分,盛放不下的话不在划分列数 */
grid-template-columns: repeat(auto-fill, 30%);
grid-row-gap
grid-column-gap
/* 行间距 */
grid-row-gap: 20px;
/* 列间距 */
grid-column-gap: 30px;
grid-gap: 行间距 列间距
grid-gap: 20px 30px;
如果想要给网格中添加项目,我们需要在容器中添加对应的div
,这些div
被称为项目,项目会默认自动撑开显示在单元格内部
顺序是从上到下,从左至右,一次排列
修改顺序
grid-auto-flow
属性来完成grid-auto-flow
属性有两个取值,分别是
row
:横向显示(默认就是横向显示)column
:纵向显示<head>
<title>Document</title>
<style>
.box {
display: grid;
grid-template-rows: repeat(3, 100px);
grid-template-columns: repeat(3, 100px);
/* 改变单元格顺序 */
grid-auto-flow: column;
width: 600px;
height: 600px;
margin: 100px auto;
border: 10px solid #ccc;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
</body>
设置项目的宽度高度&调整项目中位于单元格中的对齐方式
单一属性
stretch
拉伸效果水平对齐方式
justify-items
,取值有start
,center
,end
垂直对齐方式
align-items
,取值有start
,center
,end
<head>
<title>Document</title>
<style>
.box {
display: grid;
grid-template-rows: repeat(3, 100px);
grid-template-columns: repeat(3, 100px);
/* 改变单元格顺序 */
grid-auto-flow: column;
/* 单元格(项目)水平对齐方式 */
justify-items: center;
/* 单元格(项目)垂直对齐方式 */
align-items: center;
width: 600px;
height: 600px;
margin: 100px auto;
border: 10px solid #ccc;
}
.box div {
width: 50px;
height: 50px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
</body>
复合属性
place-items: 垂直方向对齐方式 水平方向对齐方式
place-items: center center;
水平对齐
justiify-content
取值有start
,center
,end
,stretch(拉伸,默认值)
,space-between(行列两端对齐)
,space-around(行列间距环绕)
,space-evenly(行列间距平分)
垂直对齐
align-content
取值有start
,center
,end
,stretch(拉伸,默认值)
,space-between(行列两端对齐)
,space-around(行列间距环绕)
,space-evenly(行列间距平分)
/* 在盒子中的水平对齐方式 */
justify-content: center;
/* 在盒子中的垂直对齐方式 */
align-content: center;
当然,也有简化形式 place-content: 垂直对齐方式 水平对齐方式
place-content: center center;
要给需要合并的单元格加属性
grid-row-start
横向网格线开始占位grid-row-end
横向网格线结束占位grid-column-start
纵向网格线开始占位grid-column-end
纵向网格线开始占位有图,看图吧
<head>
<title>Document</title>
<style>
.box {
display: grid;
grid-template-rows: repeat(3, 100px);
grid-template-columns: repeat(3, 100px);
/* 改变单元格顺序 */
grid-auto-flow: column;
/* 单元格(项目)水平对齐方式 */
/* justify-items: center; */
/* 单元格(项目)垂直对齐方式 */
/* align-items: center; */
/* 单元格(项目)复合对齐方式 */
place-items: center center;
/* 在盒子中的水平对齐方式 */
/* justify-content: center; */
/* 在盒子中的垂直对齐方式 */
/* align-content: center; */
/* 在盒子中的对齐方式复合写法 */
place-content: center center;
width: 600px;
height: 600px;
margin: 100px auto;
border: 10px solid #ccc;
}
.box div {
width: 50px;
height: 50px;
background-color: pink;
}
.two {
/* 合并单元格(例如合并4和7) */
grid-row-start: 1;
grid-row-end: 2;
grid-column-start: 2;
grid-column-end: 4;
}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div class="two">2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<!-- <div>9</div> -->
</div>
</body>
但是也有复合写法
grid-row: 开始/结束
设定行的grid-column: 开始/结束
设定列的.two { /* 要给需要合并的单元格加属性 */
/* 合并单元格(例如合并4和7) */
/* grid-row-start: 1;
grid-row-end: 2;
grid-column-start: 2;
grid-column-end: 4; */
/* 复用形式 */
grid-row: 1/2;
grid-column: 2/4;
}
<head>
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.container {
display: grid;
/* 行 */
grid-template-rows: repeat(4, 100px);
/* 列 */
grid-template-columns: repeat(13, 100px);
/* 项目在网格中的水平对齐方式 */
/* justify-items: center; */
/* 项目在网格中的垂直对齐方式 */
/* align-items: center; */
/* 复合方式 */
place-items: center center;
width: 1300px;
height: 400px;
margin: 50px auto;
}
.container div {
width: 80px;
height: 80px;
background-color: pink;
}
.container div.shier {
/* 合并单元格 */
grid-row-start: 1;
grid-row-end: 3;
grid-column-start: 12;
grid-column-end: 14;
width: 180px;
height: 180px;
}
.container div.shisi {
/* 合并单元格 */
grid-row-start: 2;
grid-row-end: 3;
grid-column-start: 1;
grid-column-end: 3;
width: 180px;
height: 80px;
}
.container div.shijiu {
grid-row-start: 2;
grid-row-end: 4;
grid-column-start: 6;
grid-column-end: 9;
width: 270px;
height: 180px;
}
.container div.erqi {
grid-row-start: 3;
grid-row-end: 5;
grid-column-start: 1;
grid-column-end: 3;
width: 180px;
height: 180px;
}
</style>
</head>
<body>
<div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div class="shier">12</div>
<!-- <div>13</div> -->
<div class="shisi">14</div>
<!-- <div>15</div> -->
<div>16</div>
<div>17</div>
<div>18</div>
<div class="shijiu">19</div>
<!-- <div>20</div> -->
<!-- <div>21</div> -->
<div>22</div>
<div>23</div>
<div>24</div>
<!-- <div>25</div> -->
<!-- <div>26</div> -->
<div class="erqi">27</div>
<!-- <div>28</div> -->
<div>29</div>
<div>30</div>
<div>31</div>
<!-- <div>32</div> -->
<!-- <div>33</div> -->
<!-- <div>34</div> -->
<div>35</div>
<div>36</div>
<div>37</div>
<div>38</div>
<div>39</div>
<!-- <div>40</div> -->
<!-- <div>41</div> -->
<div>42</div>
<div>43</div>
<div>44</div>
<div>45</div>
<div>46</div>
<div>47</div>
<div>48</div>
<div>49</div>
<div>50</div>
<div>51</div>
<div>52</div>
</div>
</body>