网格布局 Grid 网格是由一系列水平及垂直的线构成的一种布局模式。根据网格,我们能够将设计元素进行排列,帮助我们设计一系列具有固定位置以及宽度的元素的页面,使我们的网站页面更加统一。
一个网格通常具有许多的列(column) 与 行(row) ,以及行与行、列与列之间的间隙,这个间隙一般被称为沟槽(gutter) 。
基本概念 Grid 布局由以下几个基本概念组成:
**网格容器 (grid container)**:网格布局由网格容器和网格项组成。网格容器是将网格项放置到网格中的容器。网格容器可以是任何元素,但通常使用 div
元素。
**网格项 (grid item)**:网格项是放置在网格容器中的元素。网格项可以是任何元素,但通常使用 div
元素。
**网格线 (grid line)**:网格线是将网格容器划分为行和列的线。网格线可以是水平线或垂直线。
**网格列 (grid column)**:网格列是网格容器中垂直方向的线。
**网格行 (grid row)**:网格行是网格容器中水平方向的线。
常用属性 网格容器属性
网格容器具有以下属性用于控制网格布局:
display
: 设置网格容器的显示模式。网格容器必须设置为 display: grid
或 display: inline-grid
才能使用网格布局。
grid-template-columns
: 设置网格容器的列数和列宽(使用fr
、px
、em
等单位)。
grid-template-rows
: 设置网格容器的行数和行高(使用fr
、px
、em
等单位)。
grid-template
: 同时设置 grid-template-columns
和 grid-template-rows
。
grid-auto-columns
: 设置网格容器的列宽。
grid-auto-rows
: 设置网格容器的行高。
网格项属性
网格项具有以下属性用于控制网格项在网格中的布局:
grid-column
: 设置网格项所在的列。
grid-row
: 设置网格项所在的行。
grid-column-start
: 设置网格项在列中的起始位置。
grid-column-end
: 设置网格项在列中的结束位置。
grid-row-start
: 设置网格项在行中的起始位置。
grid-row-end
: 设置网格项在行中的结束位置。
grid-area
: 设置网格项所在的区域。
grid-gap
: 设置网格线之间的间距。
网格布局 定义固定和自适应的列宽、行宽
示例:
1 2 3 4 5 6 7 8 9 10 11 .grid-example { display : grid; grid-template-columns : 100px 200px auto; grid-template-rows : 100px 200px auto; } .item { margin : 10px ; background-color : rgb (100 , 150 , 200 ); }
1 2 3 4 5 6 7 8 9 10 11 <div class ="grid-example" > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > </div >
效果:
使用百分比定义列宽、行宽
示例:
1 2 3 4 5 6 7 8 9 10 11 .grid-example { display : grid; grid-template-columns : 30% 2 fr 1 fr; grid-template-rows : 30% 2 fr 1 fr; } .item { margin : 10px ; background-color : rgb (100 , 150 , 200 ); }
1 2 3 4 5 6 7 8 9 10 11 <div class ="grid-example" > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > </div >
效果:
等分(平均分配)列宽、行宽
示例:
1 2 3 4 5 6 7 8 9 10 11 .grid-example { display : grid; grid-template-columns : repeat (3 , 1 fr); grid-template-rows : repeat (3 , 1 fr); } .item { margin : 10px ; background-color : rgb (100 , 150 , 200 ); }
1 2 3 4 5 6 7 8 9 10 11 <div class ="grid-example" > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > </div >
效果:
使用 minmax
定义列、行的最小和最大宽度、高度
示例:
1 2 3 4 5 6 7 8 9 10 11 .grid-example { display : grid; grid-template-columns : minmax (100px , 1 fr) minmax (200px , 2 fr); grid-template-rows : minmax (100px , 1 fr) minmax (200px , 2 fr); } .item { margin : 10px ; background-color : rgb (100 , 150 , 200 ); }
1 2 3 4 5 6 <div class ="grid-example" > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > </div >
效果:
网格间隙 网格间隙由 grid-row-gap
和 grid-column-gap
两个属性来控制。另外,CSS Grid Level 2 中引入了 gap
属性,可以同时控制 grid-row-gap
和 grid-column-gap
示例:
1 2 3 4 5 6 7 8 9 10 11 12 .grid-example { display : grid; grid-template-columns : 30% 30% 30% ; grid-template-rows : 200px 200px ; grid-row -gap : 50px ; grid-column -gap : 30px ; } .item { margin : 10px ; background-color : rgb (100 , 150 , 200 ); }
1 2 3 4 5 6 7 8 <div class ="grid-example" > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > <div class ="item" > Grid演示</div > </div >
效果:
网格定位 网格定位通常指的是使用 grid-column
、grid-row
、以及 grid-area
这些属性来定位网格布局中的项目。这些属性用于指定项目在网格中所占的列和行,或者直接指定项目所在的区域。
grid-column
是用于设置一个网格项横跨的列的属性。它是 grid-column-start
和 grid-column-end
的简写。通过 grid-column
,你可以更方便地定义网格项在水平方向上的位置和跨足的列数。
grid-row
是用于设置一个网格项横跨的行的属性。它是 grid-row-start
和 grid-row-end
的简写。通过 grid-row
,你可以更方便地定义网格项在垂直方向上的位置和跨足的行数。
grid-area
属性是一个用于同时设置 grid-row-start
、grid-column-start
、grid-row-end
以及 grid-column-end
属性的简写属性。通过 grid-area
,你可以更直观地定义一个网格项在网格布局中的位置和大小。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 .example { display : grid; grid-template-columns : repeat (3 , 1 fr); grid-template-rows : repeat (2 , 150px ); gap : 10px ; padding : 20px ; } .item { background-color : #f2f2f2 ; padding : 20px ; border : 1px solid #ddd ; text-align : center; } .item1 { grid-column : 1 / 3 ; grid-row : 1 / 2 ; } .item2 { grid-area : 2 / 2 / 3 / 4 ; }
1 2 3 4 5 6 7 8 <div class ="example" > <div class ="item item1" > Item 1</div > <div class ="item item2" > Item 2</div > <div class ="item" > Item 3</div > <div class ="item" > Item 4</div > <div class ="item" > Item 5</div > <div class ="item" > Item 6</div > </div >
效果:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 body { margin : 0 ; padding : 0 ; } .container { display : grid; grid-template-columns : 1 fr 2 fr; grid-template-rows : auto; grid-template-areas : "header header" "sidebar main" "footer footer" ; min-height : 100vh ; } .header { grid-area : header; background-color : #333 ; color : #fff ; padding : 10px ; } .sidebar { grid-area : sidebar; background-color : #f2f2f2 ; padding : 10px ; } .main { grid-area : main; padding : 10px ; } .footer { grid-area : footer; background-color : #333 ; color : #fff ; padding : 10px ; }
1 2 3 4 5 6 7 8 9 <div class ="container" > <div class ="header" > Header</div > <div class ="sidebar" > Sidebar</div > <div class ="main" > <h1 > Main Content</h1 > <p > This is the main content area.</p > </div > <div class ="footer" > Footer</div > </div >
效果: