Skip to content

第13章:进阶实战(综合应用,贴合企业开发)

在基础实战中,我们已经掌握了Grid布局的基本应用。本章将通过两个进阶实战案例,展示Grid布局在企业开发中的实际应用,帮助你更好地理解和掌握Grid布局的高级用法。

实战5:响应式网格布局(适配移动端+PC端)

响应式设计是现代前端开发的核心要求之一,Grid布局配合媒体查询可以轻松实现响应式网格布局。

13.1 媒体查询(media query)基础

媒体查询是CSS3的重要特性,用于根据设备的屏幕尺寸、方向等特性应用不同的样式。基本语法如下:

css
@media (max-width: 768px) {
  /* 当屏幕宽度小于等于768px时应用的样式 */
}

@media (min-width: 769px) and (max-width: 1024px) {
  /* 当屏幕宽度在769px到1024px之间时应用的样式 */
}

@media (min-width: 1025px) {
  /* 当屏幕宽度大于等于1025px时应用的样式 */
}

13.2 PC端:多列网格布局

在PC端,我们可以使用Grid布局创建多列网格,例如4列布局:

html
<div class="grid-container">
  <div class="grid-item">项目1</div>
  <div class="grid-item">项目2</div>
  <div class="grid-item">项目3</div>
  <div class="grid-item">项目4</div>
  <div class="grid-item">项目5</div>
  <div class="grid-item">项目6</div>
  <div class="grid-item">项目7</div>
  <div class="grid-item">项目8</div>
</div>
css
/* PC端样式 */
.grid-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 20px;
  padding: 20px;
}

.grid-item {
  background-color: #f0f0f0;
  padding: 20px;
  text-align: center;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

13.3 移动端:单列或双列布局

在移动端,我们可以通过媒体查询调整网格布局,改为双列或单列布局:

css
/* 平板端样式 */
@media (max-width: 1024px) {
  .grid-container {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* 移动端样式 */
@media (max-width: 768px) {
  .grid-container {
    grid-template-columns: 1fr;
  }
}

13.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>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font-family: Arial, sans-serif;
      background-color: #f5f5f5;
    }

    .container {
      max-width: 1200px;
      margin: 0 auto;
      padding: 20px;
    }

    h1 {
      text-align: center;
      margin-bottom: 30px;
      color: #333;
    }

    .grid-container {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 20px;
    }

    .grid-item {
      background-color: white;
      padding: 20px;
      text-align: center;
      border-radius: 8px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      transition: transform 0.3s ease;
    }

    .grid-item:hover {
      transform: translateY(-5px);
      box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
    }

    .grid-item h3 {
      margin-bottom: 10px;
      color: #333;
    }

    .grid-item p {
      color: #666;
      font-size: 14px;
    }

    /* 响应式样式 */
    @media (max-width: 1024px) {
      .grid-container {
        grid-template-columns: repeat(2, 1fr);
      }
    }

    @media (max-width: 768px) {
      .grid-container {
        grid-template-columns: 1fr;
      }
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>响应式网格布局示例</h1>
    <div class="grid-container">
      <div class="grid-item">
        <h3>项目1</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
      <div class="grid-item">
        <h3>项目2</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
      <div class="grid-item">
        <h3>项目3</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
      <div class="grid-item">
        <h3>项目4</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
      <div class="grid-item">
        <h3>项目5</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
      <div class="grid-item">
        <h3>项目6</h3>
        <p>这是一个响应式网格项目,在不同屏幕尺寸下会自动调整布局。</p>
      </div>
    </div>
  </div>
</body>
</html>

实战6:Grid+Flex结合布局(企业开发高频)

在企业开发中,我们经常需要结合使用Grid和Flex布局,Grid用于整体页面结构,Flex用于局部元素的排列。

13.5 核心思路

  • Grid布局:用于控制页面的整体结构,如头部、主体、侧边栏、底部等大的区域划分。
  • Flex布局:用于控制局部元素的排列,如导航栏、卡片内部的内容、列表等。

13.6 实操:网页布局(Grid)+ 导航栏/卡片内部(Flex)

下面是一个完整的Grid+Flex结合布局示例:

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Grid+Flex结合布局</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font-family: Arial, sans-serif;
      background-color: #f5f5f5;
      color: #333;
    }

    /* Grid整体布局 */
    .page-container {
      display: grid;
      grid-template-areas:
        "header header header"
        "sidebar main main"
        "footer footer footer";
      grid-template-columns: 250px 1fr 1fr;
      grid-template-rows: auto 1fr auto;
      min-height: 100vh;
      gap: 20px;
      padding: 20px;
    }

    /* 头部 */
    .header {
      grid-area: header;
      background-color: #333;
      color: white;
      padding: 20px;
      border-radius: 8px;
    }

    .nav {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    .logo {
      font-size: 24px;
      font-weight: bold;
    }

    .nav-links {
      display: flex;
      gap: 20px;
    }

    .nav-links a {
      color: white;
      text-decoration: none;
      padding: 8px 16px;
      border-radius: 4px;
      transition: background-color 0.3s ease;
    }

    .nav-links a:hover {
      background-color: rgba(255, 255, 255, 0.1);
    }

    /* 侧边栏 */
    .sidebar {
      grid-area: sidebar;
      background-color: white;
      padding: 20px;
      border-radius: 8px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .sidebar h3 {
      margin-bottom: 15px;
      color: #333;
    }

    .sidebar-links {
      display: flex;
      flex-direction: column;
      gap: 10px;
    }

    .sidebar-links a {
      color: #666;
      text-decoration: none;
      padding: 10px;
      border-radius: 4px;
      transition: background-color 0.3s ease;
    }

    .sidebar-links a:hover {
      background-color: #f0f0f0;
      color: #333;
    }

    /* 主内容区 */
    .main {
      grid-area: main;
      background-color: white;
      padding: 20px;
      border-radius: 8px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .main h2 {
      margin-bottom: 20px;
      color: #333;
    }

    /* 卡片网格 */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
      gap: 20px;
      margin-top: 20px;
    }

    .card {
      background-color: #f9f9f9;
      border-radius: 8px;
      padding: 20px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
    }

    .card-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 15px;
    }

    .card-header h3 {
      color: #333;
    }

    .card-tag {
      background-color: #e3f2fd;
      color: #1976d2;
      padding: 4px 8px;
      border-radius: 12px;
      font-size: 12px;
    }

    .card-content {
      color: #666;
      font-size: 14px;
      line-height: 1.5;
    }

    .card-footer {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-top: 15px;
      padding-top: 15px;
      border-top: 1px solid #eee;
    }

    .card-date {
      font-size: 12px;
      color: #999;
    }

    .card-link {
      color: #1976d2;
      text-decoration: none;
      font-size: 14px;
      font-weight: 500;
    }

    /* 底部 */
    .footer {
      grid-area: footer;
      background-color: #333;
      color: white;
      padding: 20px;
      border-radius: 8px;
      text-align: center;
    }

    /* 响应式样式 */
    @media (max-width: 768px) {
      .page-container {
        grid-template-areas:
          "header"
          "main"
          "sidebar"
          "footer";
        grid-template-columns: 1fr;
        grid-template-rows: auto auto auto auto;
      }

      .nav {
        flex-direction: column;
        gap: 10px;
        align-items: flex-start;
      }

      .nav-links {
        flex-wrap: wrap;
      }
    }
  </style>
</head>
<body>
  <div class="page-container">
    <!-- 头部 -->
    <header class="header">
      <nav class="nav">
        <div class="logo">企业网站</div>
        <div class="nav-links">
          <a href="#">首页</a>
          <a href="#">产品</a>
          <a href="#">服务</a>
          <a href="#">关于我们</a>
          <a href="#">联系我们</a>
        </div>
      </nav>
    </header>

    <!-- 侧边栏 -->
    <aside class="sidebar">
      <h3>快速导航</h3>
      <div class="sidebar-links">
        <a href="#">首页</a>
        <a href="#">产品中心</a>
        <a href="#">解决方案</a>
        <a href="#">新闻动态</a>
        <a href="#">加入我们</a>
      </div>
    </aside>

    <!-- 主内容区 -->
    <main class="main">
      <h2>产品展示</h2>
      <div class="card-grid">
        <div class="card">
          <div class="card-header">
            <h3>产品1</h3>
            <span class="card-tag">热销</span>
          </div>
          <div class="card-content">
            这是一款高性能的产品,具有多种功能和优良的品质,为用户提供卓越的使用体验。
          </div>
          <div class="card-footer">
            <span class="card-date">2024-01-01</span>
            <a href="#" class="card-link">了解更多</a>
          </div>
        </div>
        <div class="card">
          <div class="card-header">
            <h3>产品2</h3>
            <span class="card-tag">新品</span>
          </div>
          <div class="card-content">
            这是一款最新推出的产品,采用先进技术,为用户带来全新的体验和价值。
          </div>
          <div class="card-footer">
            <span class="card-date">2024-02-01</span>
            <a href="#" class="card-link">了解更多</a>
          </div>
        </div>
        <div class="card">
          <div class="card-header">
            <h3>产品3</h3>
            <span class="card-tag">推荐</span>
          </div>
          <div class="card-content">
            这是一款深受用户喜爱的产品,性价比高,功能强大,是您的理想选择。
          </div>
          <div class="card-footer">
            <span class="card-date">2024-03-01</span>
            <a href="#" class="card-link">了解更多</a>
          </div>
        </div>
        <div class="card">
          <div class="card-header">
            <h3>产品4</h3>
            <span class="card-tag">促销</span>
          </div>
          <div class="card-content">
            这是一款正在促销的产品,限时优惠,机会难得,赶快行动吧!
          </div>
          <div class="card-footer">
            <span class="card-date">2024-04-01</span>
            <a href="#" class="card-link">了解更多</a>
          </div>
        </div>
      </div>
    </main>

    <!-- 底部 -->
    <footer class="footer">
      <p>© 2024 企业网站 版权所有</p>
    </footer>
  </div>
</body>
</html>

13.7 完整代码讲解与优化

在这个示例中,我们:

  1. 使用Grid布局

    • 定义了页面的整体结构,包括头部、侧边栏、主内容区和底部
    • 使用grid-template-areas为各个区域命名,使代码更加清晰
    • 设置了响应式布局,在移动端自动调整为单列布局
  2. 使用Flex布局

    • 用于导航栏的水平排列和空间分配
    • 用于侧边栏链接的垂直排列
    • 用于卡片内部元素的布局,如标题和标签的对齐、日期和链接的对齐
  3. 优化技巧

    • 使用auto-fillminmax实现卡片的自适应排列
    • 添加过渡效果,提升用户体验
    • 使用媒体查询实现响应式布局
    • 添加适当的间距和阴影,增强视觉层次感

通过这个示例,你可以看到Grid和Flex布局的完美结合,它们各自负责不同的布局任务,共同构建出美观、实用的网页布局。

小结

本章通过两个进阶实战案例,展示了Grid布局在企业开发中的实际应用:

  1. 响应式网格布局:使用Grid布局配合媒体查询,实现了在不同屏幕尺寸下的自适应布局。
  2. Grid+Flex结合布局:Grid控制整体页面结构,Flex控制局部元素排列,两者结合使用,发挥各自的优势。

这些实战案例涵盖了企业开发中常见的布局场景,掌握这些技巧,你将能够更加灵活地应用Grid布局,构建出更加专业、美观的网页。

© 2026 编程马·菜鸟教程 版权所有