我们要做的第一件事是将整个<article>标签变成一个grid容器,并设置至少三列。
article { display: grid; grid-template-columns: 1fr 740px 1fr;}第一列和最后一列充当边缘部分并且自适应,它们大部分情况下包含着空白区域。中间一列固定为740px,将容纳文章的主体内容。
注意,我们没有定义行是因为每一行的高度都是由它们的自身内容所决定。文章中的每块内容(段落、图片、标题)自成一行。
下一步是确保网格中的所有内容默认开始于第二条纵向网格线。
article > * { grid-column: 2;}现在我们得到如下结果:
我们立刻就发现它变得稍微好看一点了,因为两边的空白区域让文本更易于阅读了。
然而,将左右margin属性设置为auto也能实现这种效果,而且更简单。我们为什么要用CSS Grid呢?
好了,当我们想要模仿Medium上的图片的某些特性的时候,问题出现了。例如插入一张全屏宽的图片,像下面这样:
<p style="width: 100vw;margin-left:-webkit-calc(50% - 50vw);margin-left:calc(50% - 50vw);"><a href="/images/2018-04-20-recreate-medium-article-layout-with-grid/4.jpg" class="fancybox" rel="group"><img src="/images/2018-04-20-recreate-medium-article-layout-with-grid/4.jpg" alt=""></a></p>
如果我们之前用了margin: 0 auto, 我们将只能利用负边距(margins)来使得图片占据全屏宽度,这种方法显得很hack。
使用CSS Grid的话,可以很轻易的解决这个问题,我们只需要简单的用列来设置宽度。为了确保图片占据整个宽度,我们只需要将其跨度设置为从第一列到最后一列。
article > figure { grid-column: 1 / -1; margin: 20px 0;}我们再设置一下上下边距,就得到了一幅漂亮的全屏宽的图片: