带你入门 CSS Grid 布局
前言
三月中旬的时候,有一个对于 CSS 开发者来说很重要的消息,最新版的 Firefox 和 Chrome 已经正式支 CSS Grid 这一新特性啦。没错:我们现在就可以在最流行的两大浏览器上玩转 CSS Grid 啦 ~(≧▽≦)/~
为什么 CSS Grid 很重要?
因为 CSS Grid 布局是 Web 的第一个真正的布局系统。它的目的是将内容组织成行列的形式,最终使开发人员能高度控制我们眼前屏幕上页面的显示效果。这意味着我们终于可以摒弃多年的各种 hack 和 trick 了,CSS Grid 布局不仅仅可以使复杂的布局和精美的排版成为可能,而且还可以使其变的干净利落可维护。
通过使用 CSS Grid,Web开发变得更加简洁且对开发者更加友好了 :-D 。那么 Grid 是如何工作的咩?有些教程事无巨细,但是我认为我们应该从最基础的知识学起。下面我们将会实现一个比较简单的小例子,即在一个页面上放置一串字母。
在开始前,我们先添加几个标签:
<div class="wrapper">
<div class="letter">
A
</div>
<div class="letter">
B
</div>
</div>
首先,我们使用 font-size
和 color
设置这些字母的字体和颜色,然后使用诸如 align-items
和 justify-content
之类的 flexbox
属性将其居中。CSS Grid 没有替换 flexbox
属性,尽可能保留了它们的功能。我们甚至可以将这些属性与 CSS Grid 结合。但是现在先让我们回到这个 demo:
在上面这个例子中,一个大的 div
又包含着两个 div
,它们默认属性是 display: block
。接下来我们用 Grid layout 设置父类元素:
.wrapper {
display: grid;
}
在这我放一下完整的 HTML 和 CSS 代码:
<div class="wrapper">
<div class="letter">
A
</div>
<div class="letter">
B
</div>
</div>
body,html {
padding: 0;
margin: 0;
}
.wrapper {
display: grid;
}
.letter {
background-color: #0069b3;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
font-size: 70px;
color: white;
line-height: 1;
font-family: 'hobeaux-rococeaux-background', Helvetica;
font-weight: 200;
cursor: pointer;
transition: all .3s ease;
}
则显示结果如下:
现在你可能看到似乎没什么变化。为什么这样呢?这不像设置 display: inline-block;
或者 display: inline;
,当我们把布局设为网格布局是不会发生很明显的变化。事实上,想让我们的 grid
起作用,首先需要给它设置一个确切的行数和列数。在这个例子中,我们可以让两个字母并排排列:
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
grid-column-gap: 1px;
background-color: black;
}
让我们拆解一下上面的代码。首先我们用 grid-template-columns
创建了一个两列的网格,如果你以前没见过这样的,那 1fr
可能看起来比较奇怪 ,但它是有效的 CSS 单元,可以将每一列列为我们网格的一小部分。在这个例子中,意味着让两列等宽。
效果如下:
看见效果了就开心了吧,哈哈。但是看到两列之间的黑线了吗?这是 wrapper
勾勒的每个字母 div
的背景,因为我们将 grid-column-gap
设置为了 1px
。通常,我们会设置更大的距离,尤其是对于两个相邻的文本框来说。但在本例中,1px
就足够了。
如果我们再添加两个新字母会怎样呢?我们应该怎么改变布局?
<div class='wrapper'>
<div class='letter'>
A
</div>
<div class='letter'>
B
</div>
<div class='letter'>
C
</div>
<div class='letter'>
D
</div>
</div>
看吧,加两个字母之后也没啥神奇的效果。加两个字母对网格没什么影响,为什么呢?因为我们已经将其设置成了两列,所以这两个字母的 div
直接被放在了它们下面,并且正好是 1fr
宽:
但是现在我有一个疑问啊,为啥字母 A、C 之间以及 B、D 之间没有 1px
的距离╭(╯^╰)╮
因为 grid-column-gap
只用于列,我们刚才做的是在网格布局中增加了一行。那就必须使用 grid-row-gap
才能看到想要的效果:
.wrapper {
grid-column-gap: 1px;
grid-row-gap: 1px;
/* other styles go here */
/* we could have also used the shorthand `grid-gap` */
}
现在我们已经创建好了一个一行一列的网格布局,所以接下来我们就得改变标记了。但是咱现在再挖掘下列的好玩的地方。如果给 grid-template-columns
属性添加另一个值会有啥变化?像这样:
.wrapper {
grid-template-columns: 1fr 1fr 1fr;
}
啊哈,这就添加了一个新的列啊。我们现在也可以清晰地看见 wrapper
的背景,因为现在那没东西显示:
如果我们改变 fr
,那一个非对称的网格布局就搞出来了。假如我们想让网格的第一列是其他两列的三倍:
这会使A和D两列的宽度大于其他两列:
好玩吧?我们没必要在担心负边距或者网格列的完美百分比。我们可以轻松地做很复杂的网格布局,而不用像以前那样用数学来算...
现在我们只需要给 grid-template-columns
属性添加一个新的值,一个网格列就奇迹般地出现了。
你可能会问,那=响应式网格怎么实现?那其实也很简单。比如我们默认想要显示为 2 列,如果屏幕为 500px 的时候我们想让其显示为 3 列,如果屏幕再大点,我们要4列。只需要这样写:
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
@media screen and (min-width: 500px) {
grid-template-columns: 1fr 1fr 1fr;
}
@media screen and (min-width: 800px) {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
}
确保在你能用电脑在新窗口打开下面这个 Demo 链接-Demo,来试试改变浏览器窗口大小,看看响应式效果。
grid-template-columns
属性比本文展示的要更复杂,但是本文是很好的一个起点。接下来我们会学习 CSS Grid 中真正的革命性意义的属性: grid-template-rows
看下面的一小段代码,结合我们已经学的知识,搞明白这个新属性能干啥:
.wrapper {
display: grid;
grid-template-columns: 3fr 1fr 1fr;
grid-template-rows: 1fr 3fr;
}
我们现在可以设置行高之间的关系。如果我们把前面的行高设成 1fr
,最后一个则设置为 3fr
,这意味着第二行的行高是第一行的3倍:
这可能看起来很简单,以前我们从没真正做到过这一点。我们总是不得不在一个特定元素上设置最小高度或者改变类名。我们以前从没以现在这样的方式创建过行之间的关系,这就是 CSS Grid 强大之处。
有了这些小知识和一些新属性,我们可以创建非常复杂的布局,不对称网格和响应式网格只是冰山一角。目前为止,只是对 CSS Grid 的初探,还有很多没有谈到的。但是我觉得 Jen Simmons 在写 Grid 的时候描述的最好:
我们要一直探索 CSS Grid,直到搞清楚它想做的是什么,它能勉强做什么和它做不了什么。设计师可能永远不会学 CSS 的代码,但是要足够了解 CSS 才能更好地理解我们的艺术媒介(artistic medium)。
当然,上面的代码起初看起来会有些奇怪。但是我想表达的意思是:我们不再需要使用臃肿的 CSS 框架,也不用管一大堆繁琐的布局。这就是 CSS Grid 真正让我兴奋的地方,它让我们以一种全新的方式看界面的显示。
我们不仅需要学习一大堆新属性,还要重新思考我们以前所学的东西。所以 CSS Grid 不仅仅是一个规范,它本身就是一个奇怪的哲学。
让我们一起来探索吧!
浏览器支持情况
绿色表示在列出的版本(及以上)的完全支持。黄色表示部分支持。红色表示不支持。有关完整的浏览器支持详情,请参阅 Caniuse.
相关学习资源链接
欢迎大家在评论区留下你的想法和感受!
欢迎大家关注知乎专栏:全栈成长之路
文章保质保量 (づ ̄3 ̄)づ╭?~
也欢迎大家加入学习交流QQ群:637481811
本文首发于我的 个人网站 LeviDing ,更多内容欢迎关注我的个人网站。
欢迎扫描上方二维码关注 公众号: LeviDing 订阅实时动态。
带你入门 CSS Grid 布局的更多相关文章
- CSS Grid布局指南
简介 CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,主要目的是改变我们基于网格设计的用户接口方式.如我们所知,CSS 总是用于网页的样式设置,但它并没有起到 ...
- CSS Grid 布局完全指南(图解 Grid 详细教程)
CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...
- 快速使用CSS Grid布局,实现响应式设计
常用Grid布局属性介绍 下面从一个简单Grid布局例子说起. CSS Grid 布局由两个核心组成部分是 wrapper(父元素)和 items(子元素). wrapper 是实际的 grid(网格 ...
- CSS Grid 布局
CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...
- CSS Grid 布局学习笔记
CSS Grid 布局学习笔记 好久没有写博客了, MDN 上关于 Grid 布局的知识比较零散, 正好根据我这几个月的实践对 CSS Grid 布局做一个总结, 以备查阅. 1. 基础用法 Grid ...
- 5分钟学会 CSS Grid 布局
欢迎加入前端交流群交流知识&&获取视频资料:749539640 这是一篇快速介绍网站未来布局的文章. Grid 布局是网站设计的基础,CSS Grid 是创建网格布局最强大和最简单的工 ...
- css Grid布局
CSS Grid 布局完全指南(图解 Grid 详细教程)https://www.html.cn/archives/8510#prop-grid-gap 5分钟学会 CSS Grid 布局https: ...
- 用 CSS Grid 布局制作一个响应式柱状图
最新一段时间比较喜欢玩弄图表,出于好奇,我想找出比较好的用 CSS 制作图表的方案.开始学习网上开源图表库,它对我学习新的和不熟悉的前端技术很有帮助,比如这个:CSS Grid. 今天和大家分享我学到 ...
- CSS Grid 布局(Grid Layout)完全指南 #flight.Archives003
Title/ CSS Grid 布局(Grid Layout)完全指南 #flight.Archives003 序 : 写完这篇文章后,我准备一直做下去了,包括flight的各个分区,也看到前方的路. ...
随机推荐
- 论文翻译——Character-level Convolutional Networks for Text Classification
论文地址 Abstract Open-text semantic parsers are designed to interpret any statement in natural language ...
- mysql自定义函数统计订单状态:GET_ORDER_STATUS()
DELIMITER $$ USE `local_hnyz`$$ DROP FUNCTION IF EXISTS `GET_ORDER_STATUS`$$ CREATE DEFINER=`root`@` ...
- 55)PHP,在html嵌套PHP写法
样例代码:
- Spring的@Transactional(readOnly=true)注解,对其效果进行测试
https://blog.csdn.net/xcdsdf14545/article/details/86164012
- Datagridview 实现二维表头和行合并
借鉴别人的,改了改,没用timer using System;using System.Collections.Generic;using System.ComponentModel;using Sy ...
- Kafka(五) —— Kafka源码本地调试
搭建环境 安装scala 安装gradle 在kafka源码的根目录执行命令 gradle wrapper gradle idea 打开IDEA,File -> Open -> kafka ...
- cesium初探之加载三维模型
项目需要用到二三维地图切换,本来准备研究ArcGIS js for Web 3d,但考虑到版权的问题,决定试着用cesium来做,于是花了2天时间抱着试试看的心态把cesium从环境配置到加载三维模型 ...
- peculiar|retreated|civilize|conceivable
ADJ-GRADED 奇怪的:古怪的:不寻常的If you describe someone or something as peculiar, you think that they are str ...
- Disk Group基础概念与深度解析
- 微信小游戏排行榜页滚动查看排行榜(canvas指定区域溢出滚动,懒渲染)
在微信小游戏中,好友排名数据是能在关系数据域操作,整个关系数据域只会返回一个最终的sharedCanvas,并且这个canvas不能调用toDataURL()方法,所以要展示好友排行榜的话只能在关系数 ...