【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次

【GLM-5 陪练式前端新手入门】第四篇:卡片布局 ------ 让个人主页内容更有层次

目录

[【GLM-5 陪练式前端新手入门】第四篇:卡片布局 ------ 让个人主页内容更有层次](#【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次)

[1 项目背景:给个人主页填充 "内容卡片"](#1 项目背景:给个人主页填充 “内容卡片”)

[2 AI 赋能:向 GLM-5 提出卡片布局学习需求](#2 AI 赋能:向 GLM-5 提出卡片布局学习需求)

[3 快速落地:跟着 AI 搭建响应式卡片布局](#3 快速落地:跟着 AI 搭建响应式卡片布局)

[3.1 核心实现思路:卡片布局就像 "便签排列"](#3.1 核心实现思路:卡片布局就像 “便签排列”)

[3.2 代码实践:编写有交互效果的卡片布局](#3.2 代码实践:编写有交互效果的卡片布局)

[3.3 本地运行:3 步查看卡片布局效果](#3.3 本地运行:3 步查看卡片布局效果)

[3.4 动手练习:修改卡片,巩固知识点](#3.4 动手练习:修改卡片,巩固知识点)

[4 实践感悟:卡片布局是个人主页的 "内容骨架"](#4 实践感悟:卡片布局是个人主页的 “内容骨架”)


🎯 主题 1:初体验拾光 ------ AI 陪练式前端新手入门

本文聚焦 GLM-5 引导零基础新手从导航栏制作进阶到卡片布局的实战过程。

活动仓库链接:https://atomgit.com/GitCode/0daymodel


1 项目背景:给个人主页填充 "内容卡片"

在第三篇的学习中,我借助 GLM-5 完成了网页导航栏,解决了 "用户去哪里" 的问题,但个人主页还缺少核心的内容展示载体。导航栏只是 "指路牌",真正让页面有价值的,是清晰呈现的作品、技能或个人信息 ------ 而卡片布局,就是前端开发中最常用的内容展示方式。

作为零基础新手,我对卡片布局的实现逻辑一无所知:不知道如何让卡片整齐排列,也不明白如何让它们在不同屏幕上自适应。于是我再次求助 GLM-5,希望延续 "一步一知识点、一步一练习" 的陪练模式,学会制作响应式、有设计感的卡片布局。


2 AI 赋能:向 GLM-5 提出卡片布局学习需求

延续之前的学习节奏,我向 GLM-5 提出了精准的卡片布局学习需求:

"我已经学会了 HTML、CSS 基础和导航栏制作,现在要学习第四步:卡片布局。请你用通俗易懂的语言讲解卡片布局的核心实现思路,提供可直接运行的 HTML+CSS 代码,布置一个小练习(比如修改卡片的大小、间距或内容),并解释关键代码的含义。"

GLM-5 不仅拆解了卡片布局的 "便签卡片" 核心思路,还指定了技术栈(Tailwind CSS、Inter 字体、Lucide Icons),设计了带有悬停交互效果的卡片示例,兼顾了教学性和视觉吸引力,让我能直观感受到卡片布局的作用。

复制代码
用户已经学会了 HTML、CSS 基础和导航栏制作,现在要学习第四步:卡片布局。我需要:

1. 用通俗易懂的语言讲解卡片布局的核心实现思路
2. 提供可直接运行的 HTML+CSS 代码
3. 布置一个小练习
4. 解释关键代码的含义

按照设计规格,我需要使用:
- Tailwind CSS
- Inter 字体
- Lucide Icons
- 配色方案
- 卡片样式(圆角、阴影、边框等)

让我设计一个教学性质的卡片布局页面,展示卡片的核心概念。

卡片布局的核心思路:
1. 容器包裹多个卡片
2. 使用 Flexbox 或 Grid 排列卡片
3. 卡片本身是一个独立的"盒子",包含图片、标题、描述、按钮等
4. 卡片有圆角、阴影、边框等视觉效果
5. 卡片有 hover 交互效果

我会创建一个简单但完整的示例,包含:
- 多个卡片
- 不同排列方式展示
- hover 效果
- 响应式布局

代码要简洁易懂,适合初学者学习# 卡片布局教程

## 核心思路(通俗理解)

**卡片布局就像"便签卡片"的排列:**

1. **每个卡片** = 一个独立的"小盒子",里面装着图片、标题、文字、按钮
2. **卡片容器** = 一个"大托盘",把所有卡片整齐地摆放在里面
3. **排列方式** = 用 Flexbox(弹性盒子)让卡片自动换行、均匀分布
4. **视觉美化** = 圆角边框 + 阴影 = 卡片"浮起来"的感觉

---

## 完整代码示例

```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>卡片布局学习</title>
    
    <!-- 字体 -->
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
    <!-- 图标 -->
    <script src="https://unpkg.com/lucide@latest"></script>
    <!-- Tailwind CSS -->
    <script src="https://cdn.tailwindcss.com"></script>
    
    <style>
        * { font-family: 'Inter', sans-serif; }
    </style>
</head>
<body class="bg-slate-50 min-h-screen">

    <!-- 页面标题 -->
    <header class="text-center py-12">
        <h1 class="text-3xl font-semibold text-slate-900 tracking-tight">卡片布局示例</h1>
        <p class="text-slate-500 mt-2">学会这个,你就能做出精美的产品展示页!</p>
    </header>

    <!-- ============================================ -->
    <!-- 核心区域:卡片容器 + 多个卡片 -->
    <!-- ============================================ -->
    <main class="max-w-6xl mx-auto px-6 pb-16">
        
        <!-- 卡片容器(大托盘) -->
        <div class="flex flex-wrap gap-6 justify-center">
            
            <!-- 卡片 1 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card1/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">精美设计</h3>
                    <p class="card-text">每个卡片都是独立的内容单元,可以包含图片、文字和按钮。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

            <!-- 卡片 2 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card2/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">灵活布局</h3>
                    <p class="card-text">使用 Flexbox 可以轻松实现卡片的自动换行和均匀分布。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

            <!-- 卡片 3 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card3/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">交互效果</h3>
                    <p class="card-text">鼠标悬停时卡片会上浮,阴影加深,带来生动的体验。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

        </div>
        <!-- 卡片容器结束 -->

    </main>

    <!-- ============================================ -->
    <!-- CSS 样式:卡片的核心样式 -->
    <!-- ============================================ -->
    <style>
        /* ========== 卡片本体 ========== */
        .card {
            width: 320px;                    /* 卡片宽度 */
            background: white;               /* 白色背景 */
            border-radius: 16px;             /* 圆角 16px */
            border: 1px solid #e2e8f0;       /* 边框颜色 */
            overflow: hidden;                /* 隐藏超出部分(让图片也有圆角) */
            box-shadow: 0 1px 2px rgba(0,0,0,0.04);  /* 轻微阴影 */
            transition: all 0.3s ease;       /* 动画过渡 */
        }

        /* 卡片悬停效果 */
        .card:hover {
            transform: translateY(-8px);     /* 向上移动 8px */
            box-shadow: 0 20px 25px rgba(0,0,0,0.1);  /* 阴影加深 */
            border-color: #cbd5e1;           /* 边框变深 */
        }

        /* ========== 卡片图片 ========== */
        .card-image {
            width: 100%;                     /* 图片宽度撑满卡片 */
            height: 180px;                   /* 固定高度 */
            object-fit: cover;               /* 图片裁剪填满,不变形 */
        }

        /* ========== 卡片内容区 ========== */
        .card-content {
            padding: 24px;                   /* 内边距 */
        }

        /* ========== 卡片标题 ========== */
        .card-title {
            font-size: 18px;                 /* 字号 */
            font-weight: 600;                /* 加粗 */
            color: #0f172a;                  /* 深色文字 */
            margin-bottom: 8px;              /* 底部间距 */
        }

        /* ========== 卡片描述文字 ========== */
        .card-text {
            font-size: 14px;                 /* 字号 */
            color: #64748b;                  /* 灰色文字 */
            line-height: 1.6;                /* 行高 */
            margin-bottom: 16px;             /* 底部间距 */
        }

        /* ========== 卡片按钮 ========== */
        .card-button {
            display: inline-flex;            /* 弹性布局,让图标和文字对齐 */
            align-items: center;             /* 垂直居中 */
            gap: 6px;                        /* 图标和文字的间距 */
            background: #0F172A;             /* 按钮背景色 */
            color: white;                    /* 文字白色 */
            font-size: 14px;                 /* 字号 */
            font-weight: 500;                /* 字重 */
            padding: 10px 16px;              /* 内边距 */
            border-radius: 8px;              /* 圆角 */
            border: none;                    /* 无边框 */
            cursor: pointer;                 /* 鼠标手型 */
            transition: background 0.2s;     /* 颜色过渡动画 */
        }

        /* 按钮悬停效果 */
        .card-button:hover {
            background: #1e293b;             /* 悬停时背景变浅一点 */
        }
    </style>

    <script>
        lucide.createIcons();  // 初始化图标
    </script>

</body>
</html>
```

---

## 关键代码含义解释

| 代码 | 含义 |
|------|------|
| `flex flex-wrap gap-6` | Flex布局 + 自动换行 + 卡片间距24px |
| `width: 320px` | 每个卡片固定宽度320像素 |
| `border-radius: 16px` | 圆角,让卡片看起来更柔和 |
| `overflow: hidden` | 让卡片内部的图片也跟着圆角显示 |
| `object-fit: cover` | 图片填满区域,裁剪多余部分,不变形 |
| `transform: translateY(-8px)` | 悬停时卡片向上移动8像素 |
| `box-shadow` | 阴影,让卡片有"浮起"的感觉 |

---

## 🎯 小练习

尝试修改以下内容,看看效果变化:

1. **修改卡片大小**:把 `.card` 的 `width: 320px` 改成 `400px` 或 `260px`
2. **修改间距**:把 `gap-6` 改成 `gap-4`(16px)或 `gap-8`(32px)
3. **修改圆角**:把 `border-radius: 16px` 改成 `8px` 或 `24px`
4. **修改悬停上浮距离**:把 `translateY(-8px)` 改成 `translateY(-12px)` 或 `translateY(-4px)`
5. **添加第4张卡片**:复制一个卡片,修改图片 `seed` 值和文字内容

---

## 卡片布局的"万能公式"

```
┌─────────────────────────────────────┐
│  卡片容器(flex flex-wrap gap-6)    │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐│
│  │ 卡片1   │ │ 卡片2   │ │ 卡片3   ││
│  │ ├图片   │ │ ├图片   │ │ ├图片   ││
│  │ ├标题   │ │ ├标题   │ │ ├标题   ││
│  │ ├描述   │ │ ├描述   │ │ ├描述   ││
│  │ └按钮   │ │ └按钮   │ │ └按钮   ││
│  └─────────┘ └─────────┘ └─────────┘│
└─────────────────────────────────────┘
```

学会这个结构,你就能做出产品展示、团队介绍、博客文章列表等各种页面!

3 快速落地:跟着 AI 搭建响应式卡片布局

在 GLM-5 的引导下,我顺利完成了卡片布局的制作,从核心思路到代码实现,全程清晰易懂。

3.1 核心实现思路:卡片布局就像 "便签排列"

GLM-5 用一个通俗的比喻,帮我瞬间理解了卡片布局的本质:

卡片布局就像 "便签卡片的排列":

  1. 每个卡片 = 一个独立的 "小盒子",里面装着图片、标题、文字、按钮;
  2. 卡片容器 = 一个 "大托盘",用 Flexbox 让卡片自动换行、均匀分布;
  3. 视觉美化 = 圆角边框 + 阴影,让卡片有 "浮起来" 的质感;
  4. 交互效果 = 悬停时卡片上浮、阴影加深,提升用户体验。

3.2 代码实践:编写有交互效果的卡片布局

GLM-5 提供了一段完整的可运行代码,我在 VS Code 中新建 kapian.html 文件,粘贴了以下内容:

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>卡片布局学习</title>
    
    <!-- 字体 -->
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
    <!-- 图标 -->
    <script src="https://unpkg.com/lucide@latest"></script>
    <!-- Tailwind CSS -->
    <script src="https://cdn.tailwindcss.com"></script>
    
    <style>
        * { font-family: 'Inter', sans-serif; }
    </style>
</head>
<body class="bg-slate-50 min-h-screen">

    <!-- 页面标题 -->
    <header class="text-center py-12">
        <h1 class="text-3xl font-semibold text-slate-900 tracking-tight">卡片布局示例</h1>
        <p class="text-slate-500 mt-2">学会这个,你就能做出精美的产品展示页!</p>
    </header>

    <!-- ============================================ -->
    <!-- 核心区域:卡片容器 + 多个卡片 -->
    <!-- ============================================ -->
    <main class="max-w-6xl mx-auto px-6 pb-16">
        
        <!-- 卡片容器(大托盘) -->
        <div class="flex flex-wrap gap-6 justify-center">
            
            <!-- 卡片 1 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card1/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">精美设计</h3>
                    <p class="card-text">每个卡片都是独立的内容单元,可以包含图片、文字和按钮。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

            <!-- 卡片 2 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card2/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">灵活布局</h3>
                    <p class="card-text">使用 Flexbox 可以轻松实现卡片的自动换行和均匀分布。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

            <!-- 卡片 3 -->
            <div class="card">
                <img src="https://picsum.photos/seed/card3/400/240.jpg" alt="卡片图片" class="card-image">
                <div class="card-content">
                    <h3 class="card-title">交互效果</h3>
                    <p class="card-text">鼠标悬停时卡片会上浮,阴影加深,带来生动的体验。</p>
                    <button class="card-button">
                        <i data-lucide="arrow-right" class="w-4 h-4"></i>
                        了解更多
                    </button>
                </div>
            </div>

        </div>
        <!-- 卡片容器结束 -->

    </main>

    <!-- ============================================ -->
    <!-- CSS 样式:卡片的核心样式 -->
    <!-- ============================================ -->
    <style>
        /* ========== 卡片本体 ========== */
        .card {
            width: 320px;                    /* 卡片宽度 */
            background: white;               /* 白色背景 */
            border-radius: 16px;             /* 圆角 16px */
            border: 1px solid #e2e8f0;       /* 边框颜色 */
            overflow: hidden;                /* 隐藏超出部分(让图片也有圆角) */
            box-shadow: 0 1px 2px rgba(0,0,0,0.04);  /* 轻微阴影 */
            transition: all 0.3s ease;       /* 动画过渡 */
        }

        /* 卡片悬停效果 */
        .card:hover {
            transform: translateY(-8px);     /* 向上移动 8px */
            box-shadow: 0 20px 25px rgba(0,0,0,0.1);  /* 阴影加深 */
            border-color: #cbd5e1;           /* 边框变深 */
        }

        /* ========== 卡片图片 ========== */
        .card-image {
            width: 100%;                     /* 图片宽度撑满卡片 */
            height: 180px;                   /* 固定高度 */
            object-fit: cover;               /* 图片裁剪填满,不变形 */
        }

        /* ========== 卡片内容区 ========== */
        .card-content {
            padding: 24px;                   /* 内边距 */
        }

        /* ========== 卡片标题 ========== */
        .card-title {
            font-size: 18px;                 /* 字号 */
            font-weight: 600;                /* 加粗 */
            color: #0f172a;                  /* 深色文字 */
            margin-bottom: 8px;              /* 底部间距 */
        }

        /* ========== 卡片描述文字 ========== */
        .card-text {
            font-size: 14px;                 /* 字号 */
            color: #64748b;                  /* 灰色文字 */
            line-height: 1.6;                /* 行高 */
            margin-bottom: 16px;             /* 底部间距 */
        }

        /* ========== 卡片按钮 ========== */
        .card-button {
            display: inline-flex;            /* 弹性布局,让图标和文字对齐 */
            align-items: center;             /* 垂直居中 */
            gap: 6px;                        /* 图标和文字的间距 */
            background: #0F172A;             /* 按钮背景色 */
            color: white;                    /* 文字白色 */
            font-size: 14px;                 /* 字号 */
            font-weight: 500;                /* 字重 */
            padding: 10px 16px;              /* 内边距 */
            border-radius: 8px;              /* 圆角 */
            border: none;                    /* 无边框 */
            cursor: pointer;                 /* 鼠标手型 */
            transition: background 0.2s;     /* 颜色过渡动画 */
        }

        /* 按钮悬停效果 */
        .card-button:hover {
            background: #1e293b;             /* 悬停时背景变浅一点 */
        }
    </style>

    <script>
        lucide.createIcons();  // 初始化图标
    </script>

</body>
</html>

3.3 本地运行:3 步查看卡片布局效果

  1. 保存 kapian.html 文件(确保后缀为 .html);
  2. 双击文件,用浏览器打开;
  3. 看到三张整齐排列的卡片,鼠标悬停时卡片会上浮、阴影加深,瞬间有了 "专业产品展示页" 的质感。

3.4 动手练习:修改卡片,巩固知识点

按照 GLM-5 的指导,我完成了 5 个小练习:

  1. 把卡片宽度从 320px 改成 400px,卡片变得更宽,内容更舒展;
  2. 把容器间距 gap-6 改成 gap-8,卡片之间的空隙更大,布局更透气;
  3. 把卡片圆角从 16px 改成 24px,整体风格更柔和;
  4. 把悬停上浮距离从 translateY(-8px) 改成 translateY(-12px),交互效果更明显;
  5. 复制了一张新卡片,修改了图片和文字,卡片布局的内容更丰富了。

每一次修改后刷新浏览器,都能直观看到变化,这种 "试错 - 观察 - 理解" 的方式,让我对卡片布局的代码逻辑理解得更透彻。


4 实践感悟:卡片布局是个人主页的 "内容骨架"

这次卡片布局学习让我对前端开发有了新的认知:

  • 卡片布局的核心是 "容器 + 单元":用 Flexbox 容器排列独立的卡片单元,既灵活又清晰;
  • Tailwind CSS 简化了样式编写:不用写大量重复的 CSS 代码,通过类名就能快速实现响应式布局;
  • 交互细节决定体验:一个简单的悬停上浮效果,就能让卡片从 "静态" 变成 "动态",用户体验瞬间提升;
  • 响应式是关键:通过 flex-wrap 让卡片自动换行,在手机和电脑上都能完美显示,避免了布局错乱。

现在,通过GLM-5提供的方案,我已经学习到了 "导航栏 + 卡片布局",从 "有路牌" 升级为 "有内容",离完成一个完整的个人主页又近了一步。

参与链接

GLM-5 在线体验:https://ai.atomgit.com/zai-org/GLM-5/model-inference

GLM-5 活动贴:https://ai.atomgit.com/zai-org/GLM-5/discussions

相关推荐
悠闲蜗牛�1 小时前
高并发大模型推理优化实战:从模型压缩到服务化部署
人工智能
Hello.Reader1 小时前
Leptos + Tauri 2 前端配置Trunk + SSG + 移动端热重载一次打通(Leptos 0.6 口径)
前端
AI周红伟1 小时前
大模型部署入门教程,消费级显卡跑通Qwen3.5-Plus,最低配置部署教程,不能在简单了
大数据·人工智能·大模型·智能体
阿_旭2 小时前
【视觉AI赋能智慧农业】三大应用场景、简化农作流程、核心价值全解析
人工智能·智慧农业
沃达德软件2 小时前
视频监控数据分析服务
图像处理·人工智能·深度学习·目标检测·计算机视觉·数据挖掘·数据分析
岱宗夫up2 小时前
【前端基础】HTML + CSS + JavaScript 进阶(一)
开发语言·前端·javascript·css·html
国科安芯2 小时前
实战验证:ASM1042S2S CANFD收发器的质子单粒子效应试验与在轨性能
网络·人工智能·单片机·嵌入式硬件·物联网·fpga开发
刘海东刘海东2 小时前
一条新的人工智能道路(2)
人工智能
新缸中之脑2 小时前
Taalas:智能的硅变时刻
人工智能