You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CSS Grid实现响应式双栏博客布局:解决标题高度拉伸问题

问题描述

我需要实现如下所示的响应式设计,仅用纯CSS完成:
响应式设计示意图

我尝试了下面的CSS Grid方案,但Heading盒子被拉伸到和Table of contents一样高。有没有办法让这些行的高度各自独立?

我尝试的代码

h1          { grid-area: heading; }
div.toc     { grid-area: toc; }
div.content { grid-area: content; }
div.author  { grid-area: author; }
div.related { grid-area: related; }

article {
  display: grid;
  grid-template-areas:
    "heading"
    "toc"
    "content"
    "author"
    "related";
}

@media (min-width: 500px) {
  article {
    grid-template-columns: 1fr 1fr;
    grid-template-areas:
      "heading toc"
      "content author"
      "related .";
  }
}

article > * { border: 1px solid red; }
article > *, h3, p, ul, li { margin: 8px; }
<article>    
  <h1>My Heading</h1>
  <div class="toc">
    <h3>Table of contents</h3>
    <ul>
      <li>Chapter 1</li>
      <li>Chapter 2</li>
      <li>Chapter 3</li>
      <li>Chapter 4</li>
      <li>Chapter 5</li>
      <li>Chapter 6</li>
    </ul>
  </div>
  <div class="content">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Facere quidem modi, exercitationem atque cumque rem molestias dicta delectus tempore fuga voluptatum deserunt, quasi aliquid nulla dignissimos praesentium ullam, numquam nemo!</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut ab ipsa, fugit aliquam cumque quisquam, inventore mollitia perferendis, tempora nam magni maiores ea eveniet qui minus voluptatum doloribus modi quam.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eum, ut nulla. Cupiditate numquam dolor cumque, iure, debitis nulla reprehenderit placeat alias temporibus, maiores porro, repudiandae accusamus optio dicta quos officiis.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorum ea voluptatum, nam. Exercitationem eligendi magni doloremque, rerum aspernatur eos consequuntur, est vero facere nam temporibus libero animi modi cumque eveniet.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima veniam ipsum, ullam enim quisquam maiores illo totam consectetur dolor in laboriosam animi quam laborum quas quibusdam tempore, excepturi magni rerum!</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus minus excepturi temporibus velit laboriosam, nemo architecto repudiandae maiores, quidem mollitia recusandae corporis officiis deserunt quas, quis at, aliquid a animi!</p>
  </div>
  <div class="author">- written by me</div>
  <div class="related">
    <h3>Related articles</h3>
    <ul>
      <li>Article 1</li>
      <li>Article 2</li>
      <li>Article 3</li>
    </ul>
  </div>
</article>
解决方案

问题根源是CSS Grid的默认规则:同一行的网格项会自动拉伸至相同高度。要让Heading和TOC各自保持内容高度,最简单的办法是给这两个元素加上align-self: start,让它们只占用自身内容所需的高度,不会被强制拉平。

修改后的CSS代码

h1          { grid-area: heading; align-self: start; } /* 新增对齐规则 */
div.toc     { grid-area: toc; align-self: start; } /* 新增对齐规则 */
div.content { grid-area: content; }
div.author  { grid-area: author; }
div.related { grid-area: related; }

article {
  display: grid;
  grid-template-areas:
    "heading"
    "toc"
    "content"
    "author"
    "related";
}

@media (min-width: 500px) {
  article {
    grid-template-columns: 1fr 1fr;
    grid-template-areas:
      "heading toc"
      "content author"
      "related .";
  }
}

article > * { border: 1px solid red; }
article > *, h3, p, ul, li { margin: 8px; }

这样修改后,Heading和TOC就会根据自身内容高度显示,不会再被拉伸成一样高。如果需要其他区域也保持内容高度,给对应的网格项加上同样的align-self: start即可。

内容的提问来源于stack exchange,提问作者Tonald Drump

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:20:58