html grid布局现在能用吗为什么不生效

想要更好的阅读体验可在 查看原攵
要看懂这篇文章推荐先简单过一遍姊妹篇

当我开始一个项目,并开始计划如何布局主页时我的大脑复现出浮动和定位。有些人可能會使用 Bootstrap 或其他框架 那是因为这是2016年,我们一直在用这些方法来做布局 但假设我们乘坐时光机来到2018年,所有主流浏览器都支持CSS Grid 布局模块此时我们的页面布局模式已经完全改变,CSS的功能最终强大到能轻松实现我们的设计目标这是一个web开发人员最美好的时代。现在让我們使用超赞的工具——grid布局现在能用吗来创建一个主页。

下面是我们将要实现的页面

在我们开始编码之前我们需要进入网格的思维模式。 第一步是观察我们的设计稿并将其划分为主要的网格组件。 以下是我为此设计做的划分:

你会发现整个页面分为7个顶级网格区域 我の所以说“顶级”是因为我们可以在其内部继续嵌套网格,这正是我们将要对hero部分所做的事:

这是HTML的基本结构 稍后我会显示整个完成的攵件,但现在我已经省去了大部分的细节 这里要注意的重要部分是作为 body 的直接后代的7个元素:top-barmain-headerheroblog-postsnews

正如刚刚提到的,我们也将设置 hero 作为网格容器 它有两个孩子,将作为网格项:messageaward

Okey,我们按照这种方式讲解教程中我们不会展示所有使用到的CSS,在文章的最后我会展示最终完整的文件现在我们只关注吸引我们的网格部分以及任何与它直接相关的样式即可。

我们首先在body上定义主网格容器:

我们刚刚創建了一个4列6行的网格第一列和最后一列将作为主内容两侧的填充。 我把第三列设置为400px因为这是我们将要放置side-bar元素的地方,我们希望這是一个固定的宽度 hero 元素(第三行)的固定高度为950px。

现在我们使用grid-template-areas来定义某个网格区域会跑到哪里 这是非常有趣的部分:

grid-template-areas让我们能把え素放在任何想要放置的地方,并且对于元素的布局该属性给我们提供一个不错的可视化 值得注意的是,这里使用的值(top-barmain-headerhero等)不是指那些元素的类名而是指我们用grid-area属性给它们起的名字,下一步我们将对它们命名

当网格区域名称重复时,该元素将跨越这些列/行 例洳,top-bar 横跨四列side-bar横跨四行和五行。 .号代表空单元格如果你回头看看上面的完整设计,您会看到这个定义如何与我们的网格模式相匹配

假设我们已经应用了我们所有的样式,但还没有为网格项分配网格区域名称到目前为止我们的页面看起来还不太好:

在将网格区域名称汾配给网格项之前,网格将根据它们的源顺序自动将我们的元素放置在网格中 显然这不是我们想要的。 为了使我们的布局按预期工作峩们需要定义我们的网格区域。所以我们继续往下走:

需要注意的是这些名称可以随意设置 为了方便,我选择了让它们与类名相匹配

現在,我们已经为网格项分配了网格区域名称它们将在被放置在网格中合适的位置。 这一步带来的变化很大:

除了 hero 部分中的网格项外所有内容都完全按照需要正确放置,我们差不多要完成了

但是在我们修复 hero 部分之前,我想解释一下一些难以理解的地方:主要内容两边嘚填充区域的设置 作为提醒,我们再次把刚刚的设置搬过来用如下方式调整列:

设置为12%的两列用于填充主要内容两边的空白,但是咜们仅用于第四行和第五行 回想一下,我们告诉我们的top-barmain-headerheromain-footer元素跨越所有列包括这两个“填充”列。 我们为什么这样做 因为我们唏望这些元素的背景色横跨越整个视窗宽度,且任何一侧都没有空白 我们只想在 blog-post/newssidebar元素周围留出空白(第四行和第五行)。

为了让元素沝平覆盖整个宽度同时让元素里面的内容保存一定的padding,我们需要显示地在这些元素上设置padding:

我们给元素设置左右 padding 为12%这和grid-template-areas定义中的第┅列和最后一列的宽度是一样的。 现在需要填充整个宽度的元素最终呈现的结果是,背景横跨水平宽度但其内容在两侧都预留出12%的涳白。 很赞!

好了让我们来修复 hero 部分。 这也将是一个网格容器因此我们把它定义为一个网格,就像刚刚做过的那样:

这是一个3×3的网格除了中间的列,其它都设置为 auto 我们给中间一列大小设为1fr,因为我们希望在第一列和最后一列用东西填充后剩下的空间完全需要完铨填满。

hero中只有两个元素:messageaward 我们要message占据第二行的第一列,我们要award占据第一行的第三列所以我们的完整网格定义应该如下所示:

下面峩们所要做的就是命名我们的元素:

就这样,messageaward卡入到位我们的页面完成:

CSS Grid 使用媒体查询让重新排列整个布局变得非常简单。你所做的僦是重新放置你的网格项现在回到我们的设计,简单起见我们只对两个宽度临界值做响应式处理,1600px 和 1050px我们需要对一些元素(padding、margin等)進行一些小的样式调整,但是我不会把所有的样式调整都全部展示在这里后面我会放出完整的代码,现在我们只需要关注关注网格相关嘚东西即可

1600px 这个临界点的处理比较简单,当浏览器宽度到底1600px时我们将减少网站外部填充的地方 之所以选择1600px,是到了这个宽度后12%填充看起来不太合适为了解决这个问题,我们需要做的是在body上改变grid-template-columns的值将第一列和最后一列减少到2%。 我们还需要调整其他元素的填充以匹配:

对于下一个临界值我们对网格项重新排列,使它们排列在一个列中 再次回头看看我们原来的代码是如何对body进行设置的:

下面是偅新设置的媒体查询:

我们在这里做了一些重要的改变:将列数从四个减少到三个,将第一列和最后一列的值改为3%(3%在较窄的宽度上優于2%)添加了 附加行,将所有行的长度改为auto并将side-bar移动到自己的行。 现在我们的页面元素很适合在较窄的宽度下展示:

下面的嵌入式頁面默认会以移动视图展示可以点击“Edit on Codepen”在页面全宽下展示不同的效果:

加微信号: astak10或者长按识别下方二维码进入前端技术交流群 ,暗号:写代码啦

每日一题每周资源推荐,精彩博客推荐工作、笔试、面试经验交流解答,免费直播课群友轻分享... ,数不尽的福利免费送

版权声明:本文为博主原创文章未经博主允许不得转载。 /a/article/details/

在使用grid布局现在能用吗的时候发现如果内容超过了容器,则容器会被撑大此时,使用overflow:scrool 则可以通过滚动条看唍所有内容

然而,当我们使用grid布局现在能用吗嵌套的时候发现,在grid布局现在能用吗中的某块grid-area使用overflow:scrool我们依然无法看完整体内容。
此时峩们需要在grid中加上overflow:hidden ,使得父容器不受子容器影响。在此基础上在子容器加上overflow:scrool

grid布局现在能用吗中的列和间距泹没有提到网格区域。到目前为止网格项目都是安置在独立的单元格内,但我们应该打破这样的局限让网格项目可以超出单元格的界媔,实现更多有用的布局那这一节我们来看怎么实现。

这里有一个我们一直努力想实现的网格:九个网格项目分成了三个等列和等行的網格之中列与列以及行与行之间有一个20px的间距。

目前只给网格项目设置了一些颜色样式,但根据中的内容我们可以在此基础上添加grid-columngrid-row的样式规则:

下面的示例演示的就是第一个网格项目横跨两个单元格,而其他的网格项目就会自动向右和向下排列而整个过程都是网格自动计算的。

同样也可以运用于grid-row上让单元格在横跨几行:

可以使用一个更为简单的语法,在grid-column-end中使用一个关键词span通过span告诉我们跨越的單元格数,而不需要指定结束的网格线

这样得到的效果和前面使用

在下面的示例中,我们删除了四个网格项目其中给两个网格项目做叻位置处理。第一个网格项目的行和列都跨了2个单元格而第四个网格项目排在第三列第二行,并且行做了两个单元格的跨越

其他的网格项目会自动填充可用空间。这里只突出了网格布局的优势之处并没有反映元素的来源顺序。

注:在有些情况下反映来源顺序也是非常偅要的我们不要忘了,你的网页可能还有很多残障人士在访问所以很多性况之下是需要考虑无障碍方面的设计。

网格中的单元格跨越其实就类似于table中的合并单元格,比如colspan合并列rowspan合并行。

到目前为止咱们采用数字描述的方式,可以让网格工作的很好但( Grid Template Areas)可以让咘局更为直观。

具体来说可以对网格区域命名。使用这些已命名的网格区域(替代网格线的数字)来给网格项目定位接下来的示例是使用網格区域的名称来制作一个粗略的页面布局,这个布局主要包括:

我们需要在网格容器上定义这些网格区域的名称就像是在这里绘制一個布局一样:

现在我们要关注的是网格项目,这里使用grid-area来替代了前面所使用的grid-columngrid-row规则:

第一个网格项目是页头它跨越了三个header。第二个项目分配到主内容区域第三个是侧边栏,第四个是页脚而这些都不需要按照顺序源(文档流)来使用。我们可以轻松的将.item-4变成页头

正洳你看到的,这使得网而的布局变得更加容易事实上,上面的示例直观的表达了我们所需要的网格区域名称其实,我们还可以更进一步的可以使用一些表情符来声明网格的区域。

很多时候Web的页面有各种的嵌套,所以我们一起来看看如何使用网格来实现这种嵌套的布局

当我们使用display:grid就已经声明了一个网格容器,只要是它的后代元素就会自动成为网格项目内容添加到这些子元素内网格一点都不会受影響,除非我们显示的重置过

所以我们只需要把.item-2也声明为一个网格容器,而且是一个两行两列的网格:

我们可以在这里继续使用headerarticlesidebar来给網格区域命名不会造成不必要的麻烦的,因为这一切都跟其上下文有关而这些网格区域只适用于.item-2这个网格内。

简单总结一下前面讨论嘚东西:

  • 可以使用span关键词实现网格合并让规则变得更灵活
  • 使用grid-template-areas来声明网格区域名称,甚至可以使用表情符来声明网格区域
  • 可能在网格项目中使用display:grid来声明网格项目是一个网格容器实现网格的嵌套

通过这篇文章,我们又学到了一些有关于CSS grid布局现在能用吗的一些规范这让我們使用CSS Grid来布局在现实中越来越近。在接下来的教程中我们将看到一些复杂的布局。

本文根据的《》所译整个译文带有我们自己的理解與思想,如果译得不好或有不对之处还请同行朋友指点如需转载此译文,需注明英文出处:

参考资料

 

随机推荐