玩转subgrid

本文中我们将了解如何使用 CSS Grid 的 subgrid 功能来对齐并排放置框的内容。

注意:在深入学习 subgrid 之前,了解 Grid 布局的基础知识很重要。可以参考MDN

1. 问题

如下图显示一行中的三个框。它们的内容不同,但由于 Grid 布局,它们的高度都相同。

每个盒子中的子组件不对齐,看起来非常不协调,但是Grid 是无法实现子组件对齐。对于 Grid 而言,只有一行框,它没有提供将它们包含的内容对齐到行中的方法。但是通过使用 subgrid,我们可以得到如下所示的结果。

下面让我们看看如何使用 subgrid 来实现这个效果。

2. 实现

2.1 搭建基本骨架

以下是我们演示的基本 HTML:

css 复制代码
<article>
  <section></section>
  <section></section>
  <section></section>
</article>

我们有 3个<article> ,每个包含三个 <section> 元素。<article> CSS设置为:

css 复制代码
article {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-column-gap: 10px;
}

这样<section> 元素排列在三列中。

每个 <section> 都包含一个 <h1>一个 <ul> 和一个 <div>

css 复制代码
<section>
    <h1>CSS 基础</h1>
    <ul>
        <li>flex</li>
        <li>grid</li>
    </ul>
    <div>CSS(层叠样式表)用于为网页添加样式</div>
</section>
<section>
    <h1>HTML基础:这是基本骨架</h1>
    <ul>
        <li>div</li>
        <li>span</li>
        <li>h1</li>
    </ul>
    <div>这个模块为学习 HTML 奠定了基础,让你熟悉重要的概念和语法</div>
</section>
<section>
    <h1>JavaScript 基础:一份全面的 JavaScript 指南,面向从初级到高级的学习者</h1>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <div>我们首先回答一些基本问题,例如"什么是 JavaScript?"、"它看起来是什么样的?"和"它能做什么?"</div>
</section>

此时,网格中的每一列其实都是一样的,但并不是每一列都充满了内容。如下图所示:

每列中的内容量不同,因此它们的高度不同。如何使它们高度一致,下面接着看:

2.2 section设置display:grid

只能在设置为 display: grid 的元素上使用 subgrid 值。由于我们想使用 subgrid 来对齐 <section> 元素的内容,因此我们需要将section设置为 display: grid

css 复制代码
section {
  display: grid;
}

内容现在填充我们的每个列,如下图所示:

注意:内容被拉伸到全高,因为列的默认设置是 align-content: stretch

2.3 使用子网格对齐内容

最后一步是让每列中的三个元素在行中对齐。首先,我们将 grid-template-rows 属性设置为 subgrid

css 复制代码
section {
  display: grid;
  grid-template-rows: subgrid;
}

如下图所示:

这里会很奇怪?为什么我们只能看到每列的最后一个元素。

问题在于我们的 <article> 元素只有一行,因此每个部分中的元素在那一行中彼此堆叠在一起。

我们需要告诉子网格内容跨越三行:

css 复制代码
section {
  display: grid;
  grid-template-rows: subgrid;
  grid-row: span 3;
}

我们的内容现在跨越子网格的三行,如下所示。

3. 浏览器支持

自 2023 年底以来,subgrid 已在所有主流浏览器中运行,可查看 caniuse 站点。所以现在开始使用 subgrid 是没有问题的。

4. 总结

最后总结一下:在 CSS Grid 中,通过 subgrid,可以解决多个子元素对齐不一致的问题,尤其是在不同列高度不一致时,使用 subgrid 可以让子元素在各列中对齐。

如有错误,请指正O^O!

相关推荐
漂流瓶jz4 小时前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
前端架构师-老李4 小时前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心5 小时前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武5 小时前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女5 小时前
css 画一个圆角渐变色边框
前端·css
zy happy5 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年6 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长6 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen6 小时前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js
jingling5556 小时前
Flutter | 基础环境配置和创建flutter项目
前端·flutter