3.二维布局:CSS Grid Layout

CSS Grid Layout模块为了能在二维空间里控制元素的顺序、位置和大小而定义了一组CSS属性。

  • 被设值为display: grid的元素叫网格容器(grid container)。
  • 容器进一步被网格线划分为不同的区域,叫网格单元(grid cell)。
  • 网格线之间的水平或垂直路径叫网格轨道(grid track)。
  • 由相邻网格单元组合起来的矩形区块叫网格区
  • 网格容器的直接子元素叫网格项,网格项可以放在网格区内。

3.1 定义行和列

定义一个2行4列的网格,行高300像素,4列等宽:

.grid {
display: grid;
grid-template-rows: 300px 300px;
grid-template-columns: 1fr 1fr 1fr 1fr;
}

表示列宽的单位是fr,意思是可用空间中的部分(fraction of available space)。

指定行和列的数量及大小时,可以混用不同的长度单位。

生成页面子区块的网格:

<section class="subcategory">
<div class="grid-a">
<header class="subcategory-header">
<h2>Lorem ipsum</h2>
</header>
<article class="story story-featured">
<!-- ... -->
</article>
<article class="story"></article>
<article class="story"></article>
<!-- ... -->
</div>
</section>
.grid-a {
display: grid;
grid-template-rows: auto auto auto;
grid-template-columns: repeat(5, 1fr); /* repeat()函数为网格轨道指定重复的行或列声明 */
}

使用minmax()函数:

.grid-a {
display: grid;
/* 声明最后两行至少4em高,且占据相等的可用空间。 */
grid-template-rows: auto minmax(4em, 1fr) minmax(4em, 1fr);
grid-template-columns: repeat(5, 1fr);
}

3.2 添加网格项

添加网格项要以其起止处的网格线作为参考。

.subsection-header {
grid-row-start:1;
grid-column-start:1;
grid-row-end:4;
grid-column-end:2;
}

简写方法:

.subsection-header {
/* 起止网格线的编号以斜杠(/)分隔。 */
grid-row:1/4;
grid-column:1/2;
}
.subsection-header {
grid-row:1/-1; /* -1表示最后一个网格轨道的终止网格线的编号 */
grid-column:1; /* 等价于grid-column:1/2,即默认跨度为一个网格单元 */
}

可以使用grid-area属性进一步简化网格项的声明。

对齐网格项:

网格项与块级元素类似,会自动填充自己所在网格区的宽度,除非明确设置它的宽度。百分比值相对于网格项所在网格区的宽度来计算。

如果网格项没有在水平方向填满网格区,可以通过justify-itemsjustify-self属性指定它的左、中、右分布。

align-selfjustify-self用于个别网格项。align-itemsjustify-items则用于网格容器上设置所有网格项的默认对齐。

.grid-a {
display: grid;
grid-template-rows: auto auto auto;
grid-template-columns: repeat(5, 1fr);
align-items: start;
}

对齐网格轨道:

只要网格轨道的总和没有覆盖整个网格容器,就可以使用align-content(垂直方向)和justify-content(水平方向)来移动轨道。

<div class="grid">
<div></div>
<!-- 省略7个空div -->
</div>
.grid {
display: grid;
height: 100px;
outline: 2px dashed #666;
width: 500px;
grid-template-rows: 100px; /* 行高100px */
grid-template-columns: repeat(8, 50px); /* 列宽50px */
justify-content: start; /* 默认值 */
}
.grid > * {
outline: 1px solid #fff;
background-color: #ccc;
}

定义了1行8列的网格,行高100像素,每列宽度为50像素。

<div class="grid grid-end">
<div></div>
<!-- 省略7个空div -->
</div>
.grid-end {
justify-content: end;
}

网格布局中的空距:

通过grid-column-gapgrid-row-gap属性创建固定宽度的空距,这其实就相当于多栏布局中的column-gap或者表格中的border-spacing

.grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-column-gap: 1.5em;
grid-row-gap: 1.5em;
}

3.3 自动网格定位

Grid Layout规范提供了一种自动定位的机制:所有网格项自动从第一行第一个可用的网格单元开始,逐列填充。一行填满后,网格会自动开启一行并继续填充。

<ul class="grid-auto-rows">
<li class="story">
<h3><a href="#">Story 1</a></h3>
</li>
<!-- 省略8个li -->
</ul>
.grid-auto-rows {
display: grid;
grid-template-rows: auto;
grid-template-columns: repeat(5, 1fr);
grid-auto-flow: row; /* 默认值为稀疏模式 */
}
/* :nth-child(n)匹配其父元素的第n个子元素 */
.story:nth-child(1),
.story:nth-child(2) {
grid-column: span 3; /* 跨三列 */
}
.story:nth-child(4) {
grid-column: span 2; /* 跨两列 */
}

切换自动定位算法:

.grid-auto-rows {
/* 省略 */
grid-auto-flow: row dense; /* 稠密模式 */
}

自动定位的次序:

网格项的次序与源代码次序一致,每个网格项的默认次序是0。整数值,包括负值在内,都是有效的。

<!-- 省略 -->
<div class="grid-a">
<header class="subcategory-header">
<h2>Lorem ipsum</h2>
</header>
<article class="story story-featured">
<img src="http://placehold.it/600x300" alt="Dummy image">
<h3><a href="#">Cras suscipit nec leo id.</a></h3>
<p>Autem repudiandae aliquid tempora quos reprehenderit architecto, sequi repellat.</p>
</article>
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image">
<h3><a href="#">Perferendis, ipsam!</a></h3>
<p>Neque magnam vero obcaecati facere nobis sint dolore accusamus vitae consequuntur ad necessitatibus, laborum molestiae.</p>
</article>
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image">
<h3><a href="#">Curabitur mattis purus nec velit.</a></h3>
<p>Neque magnam vero obcaecati facere nobis sint dolore accusamus vitae consequuntur ad necessitatibus, laborum molestiae.</p>
</article>
</div>
<!-- 省略 -->
.grid-a {
display: grid;
}
/* :nth-of-type(n) 匹配同类型中的第n个同级兄弟元素。 */
.story:nth-of-type(2),
.story:nth-of-type(3) {
order: -2;
}
.story-featured {
order: -1;
}

3.4 网格模板区

使用grid-template-areas属性来声明网格布局。

grid-template-areas属性的值是以空格分隔的字符串列表。

每个字符串本身是空格分隔的自定义标识符,表示网格中的一行,其中每个标识符表示一列。

跨行或跨列相邻的同名网格单元构成所谓的命名网格区

<section class="subcategory">
<div class="grid-b">
<header class="subcategory-header">
<h2>Dolor sit amet</h2>
</header>
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image">
<h3><a href="#">Ut sit amet mi massa</a></h3>
<p>...</p>
</article>
<article class="story"></article>
<div class="ad">
<h3><a href="#">Buy more stuff!</a></h3>
</div>
<div class="ad"></div>
</div>
</section>
.grid-b {
display: grid;
grid-template-columns: 20% 1fr 1fr 1fr;
/* 点号表示匿名单元。 */
grid-template-areas: "hd st1 . st2"
"hd st1 . st2";
}
.grid-b .subcategory-header {
/* 使用grid-area属性自定义网格区名 */
grid-area: hd;
}
/* :nth-child(n)匹配其父元素的第n个子元素 */
.grid-b .story:nth-child(2) {
grid-area: st1;
}
.grid-b .story:nth-child(3) {
grid-area: st2;
}

默认的自动定位算法会把广告(<div class="ad"></div>)放到剩余的空单元中。

CSS Grid Layout规范允许用连续多个点表示一个匿名单元,因为这样更方便对齐多行模板字符串。

grid-template-areas: "hd ... ... ..."
"hd st1 ... st2"
"hd ... ... ...";

参考资料:

CSS页面布局与网格(下)的更多相关文章

  1. CSS页面布局与网格(上)

    1.布局规划 1.1 网格 网格系统是设计师在切分布局时作为参照的一组行和列. 1.2 布局辅助类 类名用于为布局添加样式.为了让样式可以重用,让类名表达其意图. .column { /* 一般列的样 ...

  2. CSS 页面布局、后台管理示例

    CSS 页面布局.后台管理示例 页面布局 1.头部菜单 2.中间内容/中间左侧菜单 3.底部内容 <div class='pg-header'> <div style='width: ...

  3. css页面布局

    写在前面: 页面布局整体上可以分为两类:固定宽度(一般固定960px):流式布局:将流式布局转换为固定布局很容易,只需要外围再包括一个div,为其设置宽度即可. html默认的布局方式是将每个块状标签 ...

  4. CSS页面布局常见问题总结

    在前端开发中经常会碰到各种类型布局的网页,这要求我们对css网页布局非常熟悉.其中水平垂直居中布局,多列布局等经常会被使用到,今天就来解决一下css布局方面的问题. 水平垂直居中的几种方法 说到水平垂 ...

  5. css页面布局总结

    W3C标准:是万维网制定的一系列标准,包括结构化标准语言(html.xml),表现 标准语言(css),行为标准语言(DOM,ECMAScript<javascript>)组成.这个标准倡 ...

  6. css页面布局之左侧定宽,右侧自适应

    二列布局的特征是侧栏固定宽度,主栏自适应宽度.三列布局的特征是两侧两列固定宽度,中间列自适应宽度. 之所以将二列布局和三列布局写在一起,是因为二列布局可以看做去掉一个侧栏的三列布局,其布局的思想有异曲 ...

  7. 3种常见的CSS页面布局--双飞翼布局、粘连布局、左右两列布局

    一.左右两列布局 1.代码如下,可先粘贴复制,自行运行 <!DOCTYPE html><html> <head> <meta charset="UT ...

  8. 第五章 CSS页面布局基础

    1.标准文档流 在正常流中,在没有使用浮动或者定位的情况下,文本元素按照从上到下.从左到右的格式布局.这是浏览器的默认行为.在正常流中,块级元素从上到下依次排列,而行级元素从左到右依次排列.正常流中的 ...

  9. 第6天:DIV+CSS页面布局实战

    今天我从早上9:00写代码一直写到下午18:00,写的我差点抑郁了,还好最后终于写出了一个完整页面,没有做动画效果,就是练习了一下DIV+CSS布局,做的是福务达(www.zzfwd.cn)的主页,真 ...

随机推荐

  1. java 面向对象(二十四):interface:接口

    interface:接口1.使用说明: 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能 ...

  2. 微信小程序热更新,小程序提示版本更新,版本迭代,强制更新,微信小程序版本迭代

    相信很多人在做小程序的时候都会有迭代每当版本迭代的时候之前老版本的一些方法或者显示就不够用了这就需要用到小程序的热更新.或者说是提示升级小程序版本 editionUpdate:function(){ ...

  3. SqlServer同义词

    最近在项目中遇到跨库操作具有相同表结构的数据表的问题.(A库中的数据表a和B库中的数据表b,两者表结构相同) 跨库操作中我们一般是为了实现不同数据库中表字段信息,字段状态等实时同步,可能很多人会想到使 ...

  4. 更优雅的在 Xunit 中使用依赖注入

    Xunit.DependencyInjection 7.0 发布了 Intro 上次我们已经介绍过一次大师的 Xunit.DependencyInjection https://www.cnblogs ...

  5. Go的100天之旅-06数组和Slice

    目录 数组 Slice 数组 Go的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性.和其它语言相比差异主要在声明和初始化的写法上,下面是简单声明一个数组: ...

  6. C++算法 广搜

    有一个同学推荐我写一下广搜,广搜在最短路(骗分)上确实也有突出贡献,普及组应该也会考到,我今天就给要考普及组的同学讲讲课,今天讲广搜. 广搜,把可以走到的地点存进队列,然后一个个走,所以他第一次走到一 ...

  7. Java顺序查找、二分查找

    Java顺序查找.二分查找   查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低. 顺序查找 动图演示 详细代码 // 顺序查找 public st ...

  8. three.js 制作属于自己的动态二维码

    今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,在线案例点击博客原文.这是郭先生的微信二维码哦! 1. 解析图片流 canvas = document.cre ...

  9. 题解 CF1359B 【New Theatre Square】

    题意 有一个 n×m 的广场,其中一部分要铺地砖,地砖有两种, 1 × 1 和 1×2 的,后者只能横着铺,其中, 1 × 1的单价为 x , 1 × 2 的单价为 y , 输入这个广场," ...

  10. 数据结构 | 30行代码,手把手带你实现Trie树

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第28篇文章,我们一起来聊聊一个经典的字符串处理数据结构--Trie. 在之前的4篇文章当中我们介绍了关于博弈论的 ...