Grid 布局¶
统计信息:字数 4657 阅读10分钟
详细教程参考阮一峰老师:https://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html
Grid 布局类似 Flex 布局。flex 主要是垂直和水平轴分布,Grid 是网格状分布,功能更强大。
下面是基本案例
首先新建一个 HTML
<div id="root">
<div id="child1">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>
在父盒子上设置属性
/* 在父盒子上设置 */
#root {
background-color: #ccc;
/* 整体是 grid 布局(类似 flex inline-flex) */
display: grid;
display: inline-grid;
/* 1、列属性 */
/* 分成四列,每一列的宽度都是100px */
grid-template-columns: 100px 100px 100px 100px;
/* 也可以使用百分比(每一个宽度是 25%) */
grid-template-columns: 25% 25% 25% 25%;
/* 相同的参数使用 repeat,重复4次,每一次的宽度是 25% */
grid-template-columns: repeat(4, 25%);
/* 每一个子元素是100px, 父盒子的宽度不确定,自动填充满 */
grid-template-columns: repeat(auto-fill, 100px);
/* fr 表示比例,这里表示每一行有三个元素,宽度比例是 1:1:2,类似于flex布局中的比例 */
grid-template-columns: 1fr 1fr 2fr;
/* minmax 表示某个子元素宽度在最大最小值之间,优先匹配最大的值200px */
grid-template-columns: 1fr 1fr minmax(100px, 200px);
/* auto 表示自动宽度,如果多个 auto 可以均分剩余的宽度 */
grid-template-columns: auto 500px auto;
/* 可以自定义网格先名称:三个区域四个网格线名称 */
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
/* 左右两栏布局 */
grid-template-columns: 30% 70%;
/* 7网格布局——用于日历 */
grid-template-columns: repeat(7, 1fr);
grid-template-columns: 100px 100px 100px;
/* 2、行属性 */
/* 分成三行,每一行的高度是 50 100 50 */
grid-template-rows: 50px 100px 50px;
/* 行属性也支持上面的样式 */
/* 3、间隔 */
/* 行间距和列间距是 10 和 20 */
grid-gap: 10px 20px;
/* 也可以单独设置 */
grid-row-gap: 20px;
grid-column-gap: 30px;
/* 4、区域合并:类似于合并单元格 */
/* 默认九个不合并 */
grid-template-areas: 'a b c'
'd e f'
'g h i';
/* 合并成七巧板 */
grid-template-areas: 'a a c'
'e b c'
'e d d';
/* 页面布局 */
grid-template-areas: "header header header"
"main main sidebar"
"footer footer footer";
/* 5、子元素排列顺序 */
/* 先行后列排布,还是先列后行排布 */
grid-auto-flow: row | column | row dense | column dense;
/* 6、子元素的排列对齐,与 flex 一致, 或者一起写成 place-item */
justify-items: center;
align-items: center;
place-items: center center;
/* 整个内容区在容器中的位置(9个子元素的整体,在父盒子中的位置) */
/* start | end | center | stretch | space-around | space-between | space-evenly; */
justify-content: space-around;
align-content: space-around;
place-content: space-between space-between;
/* 7、超出部分显示 */
/* 如果默认第N个元素在内部,然后手动设置在外部,就是超出的部分,超出的行列的高度可以这样设置 */
/* 手动设置,详见下面 */
grid-auto-columns: 10px;
grid-auto-rows: 10px;
}
在子盒子上设置属性
#root #child1 {
/* 1 某个子元素的四条边分别位于哪个网格线 */
grid-column-start: 2;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 3;
/* grid-column-start: header-start | header-end 这里是特定的边界线的名称; */
/* 或者使用 span 表示跨域几个单位长度,这样就不需要计算开始和结束的边界线 */
/* 如果不同子项目发生重叠,那么根据 z-index 设置不同的层级 */
/* 如果一个子元素占据了上面的空间,那么后面的子元素向下排列 */
/* 实际上可以使用 bootstrap 处理这部分样式 */
grid-column-start: span 2;
/* 可以简写成下面的格式 */
grid-column: 1 / 3; /* 等价于 grid-column-start: 1; grid-column-end: 3 */
grid-row: 2 / 4;
/* 2 某个子元素位于哪个区域 */
grid-area: e; /* 这个子元素位于 e 区域 */
/* 或者可以直接设置四条边 <row-start> / <column-start> / <row-end> / <column-end> */
grid-area: 1 / 1 / 3 / 3;
/* 3 子元素内部内容的样式 */
justify-self: center;
align-self: center;
place-self: center;
}
这样就能实现简单的 grid 布局
Last update:
November 9, 2024