课四:响应式Web设计

媒体查询 · 弹性布局 · 移动优先 · 视口设置

一、核心知识点

  • 响应式设计核心概念:一个网站适配多种设备(PC/平板/手机)
  • 视口设置:meta viewport 标签配置
  • 媒体查询(Media Query)
    • 语法:@media (条件) { 样式 }
    • 常用条件:max-width/min-width、orientation(横竖屏)
    • 断点设置:768px(平板)、992px(小屏PC)、1200px(大屏PC)
  • 响应式布局技术
    • 流式布局:使用百分比宽度替代固定宽度
    • 弹性布局(Flex):flex-wrap、flex-direction、justify-content
    • 网格布局(Grid):grid-template-columns、grid-gap
  • 响应式图片:max-width: 100%、picture标签、srcset属性
  • 响应式字体:rem/em单位、clamp()函数

二、实操实例

实例名称

响应式新闻网站

实例目标

制作适配PC、平板、手机的响应式新闻网站,掌握媒体查询、弹性布局、网格布局等响应式核心技术。

三、详细实现步骤

📁 步骤1:创建文件结构

lesson4/ ├── index.html └── css/ └── style.css

📄 步骤2:编写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 rel="stylesheet" href="css/style.css"> <!-- 引入图标库 --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> </head> <body> <!-- 顶部导航 --> <header class="site-header"> <div class="container"> <div class="header-inner"> <div class="logo"> <h1>新闻头条</h1> </div> <!-- 移动端菜单按钮 --> <button class="menu-toggle" id="menuToggle"> <i class="fas fa-bars"></i> </button> <!-- 导航菜单 --> <nav class="main-nav" id="mainNav"> <ul> <li><a href="#" class="active">首页</a></li> <li><a href="#">国内</a></li> <li><a href="#">国际</a></li> <li><a href="#">科技</a></li> <li><a href="#">娱乐</a></li> <li><a href="#">体育</a></li> </ul> </nav> </div> </div> </header> <!-- 主要内容 --> <main class="site-content"> <div class="container"> <!-- 头条新闻 --> <section class="featured-news"> <div class="featured-image"> <img src="https://via.placeholder.com/1200x400" alt="头条新闻图片"> </div> <div class="featured-content"> <h2>前端开发技术发展新趋势,响应式设计成主流</h2> <p>随着移动设备的普及,响应式网页设计已经成为前端开发的必备技能,各大企业纷纷采用响应式方案提升用户体验。</p> <a href="#" class="read-more">阅读全文 ></a> </div> </section> <!-- 新闻列表(网格布局) --> <section class="news-grid"> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>CSS Grid布局详解:现代网页布局新选择</h3> <p>Grid布局提供了更强大的二维布局能力,相比Flex布局有更多的布局可能性。</p> <div class="news-meta"> <span>2026-03-05</span> <span>科技频道</span> </div> </div> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>移动端网页性能优化技巧分享</h3> <p>针对移动端的性能优化方法,包括图片压缩、代码精简、懒加载等实用技巧。</p> <div class="news-meta"> <span>2026-03-04</span> <span>技术频道</span> </div> </div> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>Vue3响应式原理深度解析</h3> <p>深入理解Vue3的响应式系统,对比Vue2的Object.defineProperty和Vue3的Proxy。</p> <div class="news-meta"> <span>2026-03-03</span> <span>前端频道</span> </div> </div> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>CSS变量在响应式设计中的应用</h3> <p>使用CSS自定义属性(变量)简化响应式样式管理,提高代码可维护性。</p> <div class="news-meta"> <span>2026-03-02</span> <span>CSS频道</span> </div> </div> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>响应式字体设计:适配各种屏幕尺寸</h3> <p>使用rem、em、clamp()等单位实现字体大小的自适应调整。</p> <div class="news-meta"> <span>2026-03-01</span> <span>设计频道</span> </div> </div> <div class="news-item"> <img src="https://via.placeholder.com/400x200" alt="新闻图片"> <h3>移动端触摸事件处理最佳实践</h3> <p>处理移动端的touch事件,解决点击延迟、滑动冲突等常见问题。</p> <div class="news-meta"> <span>2026-02-28</span> <span>移动开发</span> </div> </div> </section> </div> </main> <!-- 页脚 --> <footer class="site-footer"> <div class="container"> <div class="footer-columns"> <div class="footer-column"> <h3>关于我们</h3> <p>新闻头条是专业的科技新闻媒体,专注于前端开发、移动开发等领域的资讯分享。</p> </div> <div class="footer-column"> <h3>联系方式</h3> <ul> <li><i class="fas fa-envelope"></i> contact@news.com</li> <li><i class="fas fa-phone"></i> 123-4567-8910</li> </ul> </div> <div class="footer-column"> <h3>关注我们</h3> <div class="social-links"> <a href="#"><i class="fab fa-weixin"></i></a> <a href="#"><i class="fab fa-weibo"></i></a> <a href="#"><i class="fab fa-github"></i></a> </div> </div> </div> <div class="copyright"> <p>© 2026 新闻头条 - 版权所有</p> </div> </div> </footer> <!-- JavaScript --> <script> // 移动端菜单切换 const menuToggle = document.getElementById('menuToggle'); const mainNav = document.getElementById('mainNav'); menuToggle.addEventListener('click', function() { mainNav.classList.toggle('show'); }); // 窗口大小变化时关闭菜单 window.addEventListener('resize', function() { if (window.innerWidth >= 768) { mainNav.classList.remove('show'); } }); </script> </body> </html>

🎨 步骤3:编写CSS样式(关键部分)

/* 基础变量定义 */ :root { --primary-color: #3498db; --dark-color: #2c3e50; --light-color: #f8f9fa; --gray-color: #95a5a6; --white-color: #ffffff; --shadow: 0 2px 10px rgba(0,0,0,0.1); --transition: all 0.3s ease; } /* 基础样式重置 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: "微软雅黑", "Helvetica Neue", sans-serif; line-height: 1.6; color: var(--dark-color); background-color: #f5f5f5; } a { text-decoration: none; color: inherit; transition: var(--transition); } ul { list-style: none; } img { max-width: 100%; /* 响应式图片核心 */ height: auto; display: block; } /* 容器 - 流式宽度 */ .container { width: 90%; max-width: 1200px; /* 最大宽度限制 */ margin: 0 auto; padding: 0 15px; } /* 头部样式 */ .site-header { background-color: var(--white-color); box-shadow: var(--shadow); position: sticky; top: 0; z-index: 999; } .header-inner { display: flex; justify-content: space-between; align-items: center; padding: 15px 0; } .logo h1 { font-size: clamp(1.2rem, 3vw, 1.8rem); /* 响应式字体 */ color: var(--primary-color); font-weight: 700; } /* 移动端菜单按钮 */ .menu-toggle { background: none; border: none; font-size: 1.5rem; color: var(--dark-color); cursor: pointer; display: block; /* 移动端默认显示 */ } /* 导航菜单 */ .main-nav { position: absolute; top: 100%; left: 0; width: 100%; background-color: var(--white-color); box-shadow: var(--shadow); padding: 20px; transform: translateY(-100%); opacity: 0; visibility: hidden; transition: var(--transition); } .main-nav.show { transform: translateY(0); opacity: 1; visibility: visible; } .main-nav ul { display: flex; flex-direction: column; /* 移动端竖向排列 */ gap: 15px; } .main-nav a { font-size: 1rem; color: var(--dark-color); padding: 8px 0; display: block; border-bottom: 1px solid #eee; } .main-nav a.active, .main-nav a:hover { color: var(--primary-color); } /* 主要内容 */ .site-content { padding: 30px 0; } /* 头条新闻 */ .featured-news { margin-bottom: 40px; background-color: var(--white-color); border-radius: 8px; overflow: hidden; box-shadow: var(--shadow); } .featured-image img { width: 100%; height: auto; } .featured-content { padding: 20px; } .featured-content h2 { font-size: clamp(1.2rem, 4vw, 1.8rem); margin-bottom: 15px; line-height: 1.4; } .featured-content p { color: #666; margin-bottom: 20px; line-height: 1.8; } .read-more { display: inline-block; padding: 10px 20px; background-color: var(--primary-color); color: var(--white-color); border-radius: 4px; font-weight: 500; } .read-more:hover { background-color: #2980b9; } /* 新闻网格 */ .news-grid { display: grid; grid-template-columns: 1fr; /* 移动端单列 */ gap: 20px; } .news-item { background-color: var(--white-color); border-radius: 8px; overflow: hidden; box-shadow: var(--shadow); transition: var(--transition); } .news-item:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .news-item img { width: 100%; height: 200px; object-fit: cover; } .news-item h3 { font-size: 1.2rem; padding: 15px 15px 10px; line-height: 1.4; } .news-item p { padding: 0 15px 15px; color: #666; font-size: 0.9rem; } .news-meta { display: flex; justify-content: space-between; padding: 10px 15px 15px; border-top: 1px solid #eee; font-size: 0.8rem; color: var(--gray-color); } /* 页脚 */ .site-footer { background-color: var(--dark-color); color: var(--white-color); padding: 40px 0 20px; margin-top: 40px; } .footer-columns { display: flex; flex-direction: column; /* 移动端竖向排列 */ gap: 30px; margin-bottom: 30px; } .footer-column h3 { font-size: 1.2rem; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 2px solid rgba(255,255,255,0.1); } .footer-column p { color: #bbb; font-size: 0.9rem; line-height: 1.8; } .footer-column ul { display: flex; flex-direction: column; gap: 10px; } .footer-column li { display: flex; align-items: center; gap: 10px; color: #bbb; font-size: 0.9rem; } .social-links { display: flex; gap: 15px; margin-top: 15px; } .social-links a { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; background-color: rgba(255,255,255,0.1); color: var(--white-color); font-size: 1.2rem; } .social-links a:hover { background-color: var(--primary-color); transform: translateY(-3px); } .copyright { text-align: center; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.1); color: #999; font-size: 0.8rem; } /* 媒体查询 - 平板 (768px以上) */ @media (min-width: 768px) { /* 菜单按钮隐藏 */ .menu-toggle { display: none; } /* 导航菜单横向排列 */ .main-nav { position: static; background: none; box-shadow: none; padding: 0; transform: translateY(0); opacity: 1; visibility: visible; width: auto; } .main-nav ul { flex-direction: row; gap: 25px; } .main-nav a { border-bottom: none; padding: 5px 0; position: relative; } .main-nav a::after { content: ""; position: absolute; bottom: 0; left: 0; width: 0; height: 2px; background-color: var(--primary-color); transition: width 0.3s ease; } .main-nav a:hover::after, .main-nav a.active::after { width: 100%; } /* 头条新闻 - 左右布局 */ .featured-news { display: grid; grid-template-columns: 2fr 1fr; } .featured-content { display: flex; flex-direction: column; justify-content: center; padding: 30px; } /* 新闻网格 - 2列 */ .news-grid { grid-template-columns: repeat(2, 1fr); } /* 页脚 - 多列布局 */ .footer-columns { flex-direction: row; justify-content: space-between; } .footer-column { flex: 1; padding: 0 15px; } } /* 媒体查询 - 桌面 (992px以上) */ @media (min-width: 992px) { /* 新闻网格 - 3列 */ .news-grid { grid-template-columns: repeat(3, 1fr); } /* 头条新闻文字更大 */ .featured-content h2 { font-size: 2rem; } } /* 媒体查询 - 大屏桌面 (1200px以上) */ @media (min-width: 1200px) { .container { width: 85%; } }

▶️ 步骤4:运行与验证

  1. 打开 index.html 文件
  2. 调整浏览器窗口大小,验证响应式效果:
    • 移动端(<768px):单列布局、汉堡菜单、竖向导航
    • 平板(768px-992px):双列新闻网格、横向导航、头条新闻左右布局
    • 桌面(≥992px):三列新闻网格、更大的字体和间距
  3. 在真实移动设备上测试(或使用浏览器开发者工具的设备模拟)

四、关键注意事项

  • 必须设置 meta viewport 标签,否则移动设备会以桌面宽度渲染
  • 使用 clamp() 函数实现字体的平滑缩放,避免媒体查询断点处的字体突变
  • 图片设置 max-width: 100% 确保不会超出容器宽度
  • 移动端优先设计(Mobile First):先写移动端样式,再通过媒体查询扩展大屏样式
  • 使用CSS变量统一管理颜色、间距等样式值,便于维护
  • 避免使用固定宽度,尽量使用百分比、flex、grid等弹性布局方式
← 返回总目录