Appearance
第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 完整代码讲解与优化
在这个示例中,我们:
使用Grid布局:
- 定义了页面的整体结构,包括头部、侧边栏、主内容区和底部
- 使用
grid-template-areas为各个区域命名,使代码更加清晰 - 设置了响应式布局,在移动端自动调整为单列布局
使用Flex布局:
- 用于导航栏的水平排列和空间分配
- 用于侧边栏链接的垂直排列
- 用于卡片内部元素的布局,如标题和标签的对齐、日期和链接的对齐
优化技巧:
- 使用
auto-fill和minmax实现卡片的自适应排列 - 添加过渡效果,提升用户体验
- 使用媒体查询实现响应式布局
- 添加适当的间距和阴影,增强视觉层次感
- 使用
通过这个示例,你可以看到Grid和Flex布局的完美结合,它们各自负责不同的布局任务,共同构建出美观、实用的网页布局。
小结
本章通过两个进阶实战案例,展示了Grid布局在企业开发中的实际应用:
- 响应式网格布局:使用Grid布局配合媒体查询,实现了在不同屏幕尺寸下的自适应布局。
- Grid+Flex结合布局:Grid控制整体页面结构,Flex控制局部元素排列,两者结合使用,发挥各自的优势。
这些实战案例涵盖了企业开发中常见的布局场景,掌握这些技巧,你将能够更加灵活地应用Grid布局,构建出更加专业、美观的网页。
