没问题!我把“文章卡片区”改成样式独立到 CSS 文件、图片使用本地文件的最小可执行版本。下面按你说的给出两套:①主行代码(可直接运行);②带注释版。


① 主行代码(可直接运行)

文件结构(建议)

/article-cards.html
/css/article-cards.css
/assets/images/blog1.jpg
/assets/images/blog2.jpg

请将你自己的两张封面图放到 /assets/images/ 下,并命名为 blog1.jpg、blog2.jpg(或按需改名、同步改 HTML 里路径)。

A. article-cards.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>文章卡片区 · 本地图片 + 外链CSS</title>
  <link rel="stylesheet" href="css/article-cards.css" />
</head>
<body>
  <main class="container">
    <h2 class="section-title">最新文章</h2>

    <section class="grid">
      <article class="card">
        <img class="cover" src="assets/images/blog1.jpg" alt="文章封面1" />
        <div class="content">
          <h3 class="title"><a class="title-link" href="post-detail.html">从零实现博客卡片布局</a></h3>
          <p class="excerpt">用 Flexbox 做三列自适应,移动端自然收敛为单列;搭配圆角、阴影与 hover 态,清晰且有层次。</p>
          <div class="meta"><span>2025-08-20</span><span>前端基础</span></div>
          <div class="actions">
            <a class="btn" href="post-detail.html">阅读详情</a>
            <a class="btn btn-ghost" href="#">收藏</a>
          </div>
        </div>
      </article>

      <article class="card">
        <img class="cover" src="assets/images/blog2.jpg" alt="文章封面2" />
        <div class="content">
          <h3 class="title"><a class="title-link" href="post-detail.html">10 分钟做出可提交的作业</a></h3>
          <p class="excerpt">语义标签 + 统一间距 + 基本响应式,45 分钟课堂可见成果,提交两端截图即可。</p>
          <div class="meta"><span>2025-08-18</span><span>学习方法</span></div>
          <div class="actions">
            <a class="btn" href="post-detail.html">阅读详情</a>
            <a class="btn btn-ghost" href="#">收藏</a>
          </div>
        </div>
      </article>
    </section>
  </main>
</body>
</html>

B. css/article-cards.css

:root {
  --gap: 16px;
  --radius: 12px;
  --shadow: 0 6px 20px rgba(0,0,0,.08);
  --brand: #2563eb;
  --text: #0f172a;
  --muted: #475569;
  --bg: #f8fafc;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;
  color: var(--text);
  background: var(--bg);
}

.container { max-width: 1080px; margin: 0 auto; padding: 24px; }

.section-title { font-size: 20px; margin: 8px 0 16px; }

.grid { display: flex; flex-wrap: wrap; gap: var(--gap); }

.card {
  background: #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
  flex: 1 1 calc(33.333% - var(--gap));
  min-width: 260px;
  display: flex;
  flex-direction: column;
  transition: transform .15s ease, box-shadow .15s ease;
}

.card:hover { transform: translateY(-2px); box-shadow: 0 10px 28px rgba(0,0,0,.12); }

.cover { width: 100%; aspect-ratio: 16/9; object-fit: cover; display: block; }

.content { padding: 16px; display: flex; flex-direction: column; gap: 10px; }

.title { font-size: 18px; line-height: 1.3; margin: 0; }

.title-link { color: inherit; text-decoration: none; }
.title-link:hover { text-decoration: underline; }

.excerpt { color: var(--muted); font-size: 14px; line-height: 1.6; margin: 0; }

.meta { display: flex; gap: 12px; font-size: 12px; color: #64748b; }

.actions { margin-top: auto; display: flex; gap: 10px; }

.btn {
  appearance: none;
  border: 0;
  background: var(--brand);
  color: #fff;
  padding: 10px 14px;
  border-radius: 999px;
  cursor: pointer;
  text-decoration: none;
  font-size: 14px;
}

.btn-ghost {
  background: transparent;
  color: var(--brand);
  border: 1px solid var(--brand);
}

/* 响应式:平板两列,手机一列 */
@media (max-width: 900px) {
  .card { flex-basis: calc(50% - var(--gap)); }
}

@media (max-width: 600px) {
  .container { padding: 16px; }
  .card { flex-basis: 100%; }
}

集成到你的博客时:如果你已经有 core.css 作为聚合入口,可把上面的规则追加到 content.css(或新建 article-cards.css 并由 core.css 用 @import 引入),HTML 页头就只保留 core.css 的 <link> 即可。


② 带注释版(教学/讲义可直接使用)

A\*. article-cards.html(逐行注释)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <!-- 基本编码与响应式视口 -->
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>文章卡片区 · 本地图片 + 外链CSS</title>
  <!-- 外链 CSS:把样式从 HTML 中抽离,便于复用与维护 -->
  <link rel="stylesheet" href="css/article-cards.css" />
</head>
<body>
  <!-- 主体区域:使用语义化 <main> 承载主要内容 -->
  <main class="container">
    <!-- 模块标题 -->
    <h2 class="section-title">最新文章</h2>

    <!-- 列表容器:使用 Flex 布局做多列 + 自动换行 -->
    <section class="grid">
      <!-- 单张卡片:语义化 <article> 表示一篇文章 -->
      <article class="card">
        <!-- 本地封面图:请确保文件路径正确 -->
        <img class="cover" src="assets/images/blog1.jpg" alt="文章封面1" />
        <div class="content">
          <!-- 标题 + 可点击链接到详情页(后续你可替换为真实地址) -->
          <h3 class="title"><a class="title-link" href="post-detail.html">从零实现博客卡片布局</a></h3>
          <!-- 摘要:简要说明文章内容 -->
          <p class="excerpt">用 Flexbox 做三列自适应,移动端自然收敛为单列;搭配圆角、阴影与 hover 态,清晰且有层次。</p>
          <!-- 元信息:日期/分类等 -->
          <div class="meta"><span>2025-08-20</span><span>前端基础</span></div>
          <!-- 操作区:主按钮 + 次按钮 -->
          <div class="actions">
            <a class="btn" href="post-detail.html">阅读详情</a>
            <a class="btn btn-ghost" href="#">收藏</a>
          </div>
        </div>
      </article>

      <!-- 第二张卡片:结构同上,替换图片与文案 -->
      <article class="card">
        <img class="cover" src="assets/images/blog2.jpg" alt="文章封面2" />
        <div class="content">
          <h3 class="title"><a class="title-link" href="post-detail.html">10 分钟做出可提交的作业</a></h3>
          <p class="excerpt">语义标签 + 统一间距 + 基本响应式,45 分钟课堂可见成果,提交两端截图即可。</p>
          <div class="meta"><span>2025-08-18</span><span>学习方法</span></div>
          <div class="actions">
            <a class="btn" href="post-detail.html">阅读详情</a>
            <a class="btn btn-ghost" href="#">收藏</a>
          </div>
        </div>
      </article>
    </section>
  </main>
</body>
</html>

B\*. css/article-cards.css(逐段注释)

/* 设计变量:统一控制间距、圆角、主色等 */
:root {
  --gap: 16px;
  --radius: 12px;
  --shadow: 0 6px 20px rgba(0,0,0,.08);
  --brand: #2563eb;
  --text: #0f172a;
  --muted: #475569;
  --bg: #f8fafc;
}

/* 盒模型:避免 padding/border 影响布局计算 */
* { box-sizing: border-box; }

/* 页面基础样式:重置 margin、设置字体与背景 */
body {
  margin: 0;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;
  color: var(--text);
  background: var(--bg);
}

/* 居中容器:限定最大宽度并设置左右留白 */
.container { max-width: 1080px; margin: 0 auto; padding: 24px; }

/* 模块标题:大小与下外边距 */
.section-title { font-size: 20px; margin: 8px 0 16px; }

/* 列表容器:Flex 多列 + 自动换行 + 卡片间距 */
.grid { display: flex; flex-wrap: wrap; gap: var(--gap); }

/* 卡片:白底、圆角、阴影;三等分的基础宽度;纵向排列内容 */
.card {
  background: #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
  flex: 1 1 calc(33.333% - var(--gap));
  min-width: 260px;
  display: flex;
  flex-direction: column;
  transition: transform .15s ease, box-shadow .15s ease;
}

/* 交互:轻微抬升 + 更深阴影 */
.card:hover { transform: translateY(-2px); box-shadow: 0 10px 28px rgba(0,0,0,.12); }

/* 封面图:16:9 比例,裁切填充容器 */
.cover { width: 100%; aspect-ratio: 16/9; object-fit: cover; display: block; }

/* 内容区:竖直堆叠并设置统一间距 */
.content { padding: 16px; display: flex; flex-direction: column; gap: 10px; }

/* 标题:字号与行高 */
.title { font-size: 18px; line-height: 1.3; margin: 0; }

/* 标题链接:继承颜色,hover 下显示下划线提示可点击 */
.title-link { color: inherit; text-decoration: none; }
.title-link:hover { text-decoration: underline; }

/* 摘要与元信息:副文本颜色、尺寸 */
.excerpt { color: var(--muted); font-size: 14px; line-height: 1.6; margin: 0; }
.meta { display: flex; gap: 12px; font-size: 12px; color: #64748b; }

/* 操作区:顶端自动占位,按钮横排 */
.actions { margin-top: auto; display: flex; gap: 10px; }

/* 主按钮:品牌底色 + 圆角胶囊 */
.btn {
  appearance: none;
  border: 0;
  background: var(--brand);
  color: #fff;
  padding: 10px 14px;
  border-radius: 999px;
  cursor: pointer;
  text-decoration: none;
  font-size: 14px;
}

/* 次按钮:线框样式,层级更轻 */
.btn-ghost {
  background: transparent;
  color: var(--brand);
  border: 1px solid var(--brand);
}

/* 响应式:<=900px 平板两列,<=600px 手机一列 */
@media (max-width: 900px) {
  .card { flex-basis: calc(50% - var(--gap)); }
}
@media (max-width: 600px) {
  .container { padding: 16px; }
  .card { flex-basis: 100%; }
}


快速自测(本地)

  1. 把两张图片放进 /assets/images/(文件名与 HTML 对应)。