Skip to content

19 Justify Content 对齐内容

网格中的特色徽标 示例 19a

我们已经见过使用弹性盒布局(flexbox)排列徽标的类似示例。但是在使用弹性盒布局时,只能在一个方向上对齐徽标,无法控制另一个方向的对齐方式。也就是说,我们可以水平排列徽标并使它们在每行中对齐,但无法使用弹性盒布局在多行之间对齐徽标。因此,如果希望徽标以整齐的网格格式显示,则需要使用网格布局(grid)。在这个示例中,我们还希望徽标分布均匀,占据容器的整个宽度。

Featured Logos in a Grid

如果对此使用grid-cols-4,容器将被划分为四个相等的列,这无法帮助我们将徽标分布到两端。相反,我们使用grid-cols-[auto,auto,auto,auto],它等同于grid-cols-[repeat(4,auto)]。接下来,我们需要将它们完全均匀分布。

Try it out

在上面的链接中,注意右侧有一个小间隙。我们需要修改这一点,使徽标从一端拉伸到另一端。

标记

html
<div class="container grid grid-cols-[repeat(4,auto)] gap-12">
  <img ... />
  <!-- Seven more img elements -->
</div>

解决方案

现在我们还需要一个实用类 justify-between 来均匀分布列。这和我们在弹性布局(flexbox)中所做的类似。

html
<div class="container grid grid-cols-[repeat(4,auto)] gap-12 justify-between">
  ...
</div>

Working Demo

目前它还不具备响应式效果。我们无需添加媒体查询就能实现响应式,稍后会讲到。现在,为了了解弹性布局(flex)和网格布局(grid)之间的区别,可以将 gridgrid-cols-* 实用类分别改为 flexflex-wrap

理解网格布局中的 justify-content 概念

在结合网格布局讨论这个属性之前,你还需要了解另外两个术语。在弹性布局中,有主轴(main axis)和交叉轴(cross axis)。同样,在使用网格布局时,有行内轴(inline axis)和块轴(block axis)。

行内轴是像 spanimg 这样的行内元素的排列方向,通常是水平的行方向。而块轴是像 divsection 这样的块级元素的排列方向,也就是垂直方向。

Axis

justify-* 实用类用于控制网格项目沿行内轴/行轴(即水平方向)的排列位置。简单来说,它用于控制网格列的排列和间距。justify-between 就是我们刚刚使用的实用类之一。下面列出了更多实用类:

Tailwind 类CSS 属性及值解释
justify-startjustify-content: flex-start;所有列都位于容器的起始位置
justify-endjustify-content: flex-end;所有列都位于容器的末尾位置
justify-centerjustify-content: center;所有列都位于容器的中心位置
justify-betweenjustify-content: space-between;所有列尽可能均匀分布,第一列位于起始位置,最后一列位于末尾位置(我们刚刚看到了它的实际效果)
justify-aroundjustify-content: space-around;列前和列后的间距是列与列之间间距的一半
justify-evenlyjustify-content: space-evenly;列前、列后和列之间的间距相等

默认情况下,如果所有项目的总宽度小于网格容器的可用空间,自动调整大小的元素的宽度会均匀增加以填满容器。在添加 justify-between 类之前,我们的示例中正是这种情况。

在浏览器(Chrome 或 Firefox)中,使用上述 Tailwind Play 链接的检查工具,点击 <div class="container"> 旁边的 “grid”,这将突出显示网格单元格。在设置 justify-content 属性之前,我们看到的效果如下:

Logos before setting justify-content

使用 grid-cols-* 我们将列设置为自动调整大小。由于所有徽标的宽度总和小于容器的宽度,剩余空间会被平均分配并添加到每一列。(这与使用 fr 单位不同。如果使用 1fr,每一列最终会具有相同的宽度。)

但是当我们添加 justify-between 后,效果如下:

Logos after setting justify-content

现在网格单元格只占用所需的宽度,剩余空间被添加到网格线(或网格间隙)中,而不是网格单元格。

注意:如果我们为任何网格列指定宽度时使用 fr 单位,就不会有剩余空间,因此 justify-* 实用类将不起作用!这就是为什么我们使用 grid-cols-[repeat(4,auto)] 而不是 grid-cols-4

购物车摘要 示例 19b

这是 CSS 网格的另一个很棒的示例 —— 一个购物车摘要,每一行包含一张图片、产品描述、数量和价格。在这里也可以使用 justify-* 实用类来分布列。

Shopping Cart Summary

Try it out

html
<div class="container grid grid-cols-[repeat(4,auto)] gap-y-8 gap-x-4">
  <img ... />
  <div class="desc">...</div>
  <div class="qty">...</div>
  <div class="price">...</div>
  ...
</div>

解决方案

除了使用 justify-between 属性,我们还需要给 .price 元素添加 text-right 类,以便将最后一列的文本对齐到右侧。

html
<div
  class="container grid grid-cols-[repeat(4,auto)] gap-y-8 gap-x-4 justify-between"
>
  ...
  <div class="price text-right">...</div>
  ...
  <div class="price text-right">...</div>
</div>

Working Demo

Released under the No License.