下面我将为你提供一个从零开始、分步详细的教程,带你一步步创建一个功能完整、设计美观的订餐网页。

(图片来源网络,侵删)
最终效果预览
我们将创建一个包含以下功能的网页:
- 顶部导航栏:网站Logo、主要栏目(首页、菜单、关于我们)。
- 主横幅:展示餐厅的推广语和特色。
- 菜品展示区:以卡片形式展示菜品,包含图片、名称、价格和“加入购物车”按钮。
- 购物车侧边栏:点击购物车图标后滑出,显示已选菜品、数量和总价,并提供结算功能。
- 页脚:包含联系方式和版权信息。
第一步:准备工作
你需要一个文本编辑器来编写代码,推荐使用:
- VS Code (强烈推荐,功能强大)
- Sublime Text
- Notepad++
创建一个项目文件夹,在里面创建三个文件:
index.html(网页的结构)style.css(网页的样式)script.js(网页的交互逻辑)
第二步:编写HTML结构 (index.html)
HTML是网页的骨架,我们先搭建好整个页面的结构。

(图片来源网络,侵删)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">美味小厨 - 在线订餐</title>
<link rel="stylesheet" href="style.css">
<!-- 引入一个图标库,这里我们使用 Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
</head>
<body>
<!-- 顶部导航栏 -->
<header class="header">
<nav class="navbar">
<a href="#" class="logo">美味小厨</a>
<ul class="nav-links">
<li><a href="#home">首页</a></li>
<li><a href="#menu">菜单</a></li>
<li><a href="#about">关于我们</a></li>
</ul>
<div class="cart-icon">
<i class="fas fa-shopping-cart"></i>
<span class="cart-count">0</span>
</div>
</nav>
</header>
<!-- 主横幅 -->
<section id="home" class="hero">
<div class="hero-content">
<h1>品味生活,从美食开始</h1>
<p>新鲜食材,匠心烹饪,为您带来极致的味蕾体验</p>
<a href="#menu" class="cta-button">立即点餐</a>
</div>
</section>
<!-- 菜品展示区 -->
<section id="menu" class="menu">
<h2 class="section-title">精选菜单</h2>
<div class="menu-container">
<!-- 菜品卡片 1 -->
<div class="menu-item" data-id="1" data-name="宫保鸡丁" data-price="38">
<img src="https://via.placeholder.com/300x200?text=Gong+Bao+Ji+Ding" alt="宫保鸡丁">
<h3>宫保鸡丁</h3>
<p class="price">¥38</p>
<button class="add-to-cart">加入购物车</button>
</div>
<!-- 菜品卡片 2 -->
<div class="menu-item" data-id="2" data-name="麻婆豆腐" data-price="28">
<img src="https://via.placeholder.com/300x200?text=Mapo+Tofu" alt="麻婆豆腐">
<h3>麻婆豆腐</h3>
<p class="price">¥28</p>
<button class="add-to-cart">加入购物车</button>
</div>
<!-- 菜品卡片 3 -->
<div class="menu-item" data-id="3" data-name="糖醋里脊" data-price="45">
<img src="https://via.placeholder.com/300x200?text=Tang+Cu+Li+Ji" alt="糖醋里脊">
<h3>糖醋里脊</h3>
<p class="price">¥45</p>
<button class="add-to-cart">加入购物车</button>
</div>
<!-- 菜品卡片 4 -->
<div class="menu-item" data-id="4" data-name="鱼香肉丝" data-price="35">
<img src="https://via.placeholder.com/300x200?text=Yu+Xiang+Rou+Si" alt="鱼香肉丝">
<h3>鱼香肉丝</h3>
<p class="price">¥35</p>
<button class="add-to-cart">加入购物车</button>
</div>
</div>
</section>
<!-- 购物车侧边栏 -->
<div class="cart-sidebar" id="cartSidebar">
<div class="cart-header">
<h3>我的购物车</h3>
<span class="close-cart">×</span>
</div>
<div class="cart-items">
<!-- 购物车项目将通过 JavaScript 动态添加 -->
</div>
<div class="cart-footer">
<div class="cart-total">
<strong>总计: ¥<span id="totalPrice">0</span></strong>
</div>
<button class="checkout-button">去结算</button>
</div>
</div>
<!-- 页脚 -->
<footer class="footer">
<p>© 2025 美味小厨. All rights reserved.</p>
<p>联系我们: 123-456-7890 | 地址: 美食街88号</p>
</footer>
<script src="script.js"></script>
</body>
</html>
第三步:添加CSS样式 (style.css)
CSS负责美化网页,让它看起来更专业、更美观。
/* --- 全局样式和变量 --- */
:root {
--primary-color: #e74c3c; /* 红色 */
--secondary-color: #2c3e50; /* 深蓝色 */
--background-color: #f4f4f4;
--text-color: #333;
--white: #fff;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Arial', sans-serif;
}
body {
background-color: var(--background-color);
color: var(--text-color);
}
.section-title {
text-align: center;
margin: 40px 0;
font-size: 2.5rem;
color: var(--secondary-color);
}
/* --- 导航栏 --- */
.header {
background-color: var(--white);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
position: sticky;
top: 0;
z-index: 1000;
}
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.logo {
font-size: 1.8rem;
font-weight: bold;
color: var(--primary-color);
text-decoration: none;
}
.nav-links {
display: flex;
list-style: none;
}
.nav-links li a {
color: var(--text-color);
text-decoration: none;
margin-left: 20px;
font-weight: 500;
transition: color 0.3s;
}
.nav-links li a:hover {
color: var(--primary-color);
}
.cart-icon {
position: relative;
cursor: pointer;
font-size: 1.5rem;
}
.cart-count {
position: absolute;
top: -8px;
right: -8px;
background-color: var(--primary-color);
color: var(--white);
border-radius: 50%;
padding: 2px 6px;
font-size: 0.8rem;
}
/* --- 主横幅 --- */
.hero {
background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://images.unsplash.com/photo-1565299624946-b28f40a0ca4b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1770&q=80');
background-size: cover;
background-position: center;
height: 80vh;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
color: var(--white);
}
.hero-content h1 {
font-size: 3.5rem;
margin-bottom: 20px;
}
.hero-content p {
font-size: 1.2rem;
margin-bottom: 30px;
}
.cta-button {
display: inline-block;
background-color: var(--primary-color);
color: var(--white);
padding: 15px 30px;
text-decoration: none;
border-radius: 5px;
font-weight: bold;
transition: background-color 0.3s;
}
.cta-button:hover {
background-color: #c0392b;
}
/* --- 菜单区 --- */
.menu-container {
max-width: 1200px;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
padding: 20px;
}
.menu-item {
background-color: var(--white);
border-radius: 10px;
overflow: hidden;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
text-align: center;
transition: transform 0.3s;
}
.menu-item:hover {
transform: translateY(-10px);
}
.menu-item img {
width: 100%;
height: 200px;
object-fit: cover;
}
.menu-item h3 {
padding: 20px 0 10px;
font-size: 1.5rem;
}
.menu-item .price {
font-size: 1.2rem;
font-weight: bold;
color: var(--primary-color);
margin-bottom: 15px;
}
.add-to-cart {
background-color: var(--primary-color);
color: var(--white);
border: none;
padding: 10px 20px;
cursor: pointer;
font-weight: bold;
transition: background-color 0.3s;
}
.add-to-cart:hover {
background-color: #c0392b;
}
/* --- 购物车侧边栏 --- */
.cart-sidebar {
position: fixed;
top: 0;
right: -400px; /* 默认隐藏在屏幕外 */
width: 400px;
height: 100vh;
background-color: var(--white);
box-shadow: -5px 0 15px rgba(0, 0, 0, 0.1);
transition: right 0.3s ease-in-out;
z-index: 1001;
}
.cart-sidebar.open {
right: 0;
}
.cart-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
border-bottom: 1px solid #eee;
}
.close-cart {
font-size: 1.5rem;
cursor: pointer;
}
.cart-items {
padding: 20px;
max-height: calc(100vh - 150px);
overflow-y: auto;
}
.cart-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 0;
border-bottom: 1px solid #eee;
}
.cart-item-info h4 {
margin-bottom: 5px;
}
.cart-item-price {
color: var(--primary-color);
font-weight: bold;
}
.cart-item-quantity {
display: flex;
align-items: center;
gap: 10px;
}
.cart-footer {
position: absolute;
bottom: 0;
width: 100%;
padding: 20px;
border-top: 1px solid #eee;
background-color: var(--white);
}
.cart-total {
font-size: 1.2rem;
margin-bottom: 15px;
text-align: right;
}
.checkout-button {
width: 100%;
background-color: var(--primary-color);
color: var(--white);
border: none;
padding: 15px;
font-size: 1.1rem;
font-weight: bold;
cursor: pointer;
transition: background-color 0.3s;
}
.checkout-button:hover {
background-color: #c0392b;
}
/* --- 遮罩层 --- */
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
}
.overlay.active {
opacity: 1;
visibility: visible;
}
第四步:实现JavaScript交互 (script.js)
这是网页的灵魂,负责处理用户点击、更新购物车、计算总价等所有动态功能。
// 获取DOM元素
const cartIcon = document.querySelector('.cart-icon');
const cartSidebar = document.getElementById('cartSidebar');
const closeCart = document.querySelector('.close-cart');
const addToCartButtons = document.querySelectorAll('.add-to-cart');
const cartItemsContainer = document.querySelector('.cart-items');
const cartTotalPrice = document.getElementById('totalPrice');
const cartCount = document.querySelector('.cart-count');
const checkoutButton = document.querySelector('.checkout-button');
// 购物车数据
let cart = [];
// 打开购物车
cartIcon.addEventListener('click', () => {
cartSidebar.classList.add('open');
// 添加遮罩层
document.body.classList.add('overlay-active');
});
// 关闭购物车
closeCart.addEventListener('click', closeCartSidebar);
// 点击遮罩层关闭购物车
document.addEventListener('click', (event) => {
if (event.target.classList.contains('overlay-active')) {
closeCartSidebar();
}
});
function closeCartSidebar() {
cartSidebar.classList.remove('open');
document.body.classList.remove('overlay-active');
}
// 为每个“加入购物车”按钮添加点击事件
addToCartButtons.forEach(button => {
button.addEventListener('click', addToCart);
});
// 添加商品到购物车
function addToCart(event) {
const menuItem = event.target.closest('.menu-item');
const id = parseInt(menuItem.dataset.id);
const name = menuItem.dataset.name;
const price = parseInt(menuItem.dataset.price);
// 检查商品是否已在购物车中
const existingItem = cart.find(item => item.id === id);
if (existingItem) {
existingItem.quantity += 1;
} else {
cart.push({ id, name, price, quantity: 1 });
}
updateCart();
}
// 更新购物车显示
function updateCart() {
// 清空购物车显示
cartItemsContainer.innerHTML = '';
// 更新总价和数量
let total = 0;
let totalItems = 0;
cart.forEach(item => {
total += item.price * item.quantity;
totalItems += item.quantity;
// 创建购物车中的商品元素
const cartItemElement = document.createElement('div');
cartItemElement.classList.add('cart-item');
cartItemElement.innerHTML = `
<div class="cart-item-info">
<h4>${item.name}</h4>
<p class="cart-item-price">¥${item.price}</p>
</div>
<div class="cart-item-quantity">
<button class="decrease-quantity" data-id="${item.id}">-</button>
<span>${item.quantity}</span>
<button class="increase-quantity" data-id="${item.id}">+</button>
</div>
`;
cartItemsContainer.appendChild(cartItemElement);
});
cartTotalPrice.textContent = total;
cartCount.textContent = totalItems;
// 为新增的加减按钮添加事件监听
document.querySelectorAll('.decrease-quantity').forEach(button => {
button.addEventListener('click', (e) => {
const id = parseInt(e.target.dataset.id);
decreaseQuantity(id);
});
});
document.querySelectorAll('.increase-quantity').forEach(button => {
button.addEventListener('click', (e) => {
const id = parseInt(e.target.dataset.id);
increaseQuantity(id);
});
});
}
// 增加商品数量
function increaseQuantity(id) {
const item = cart.find(item => item.id === id);
if (item) {
item.quantity += 1;
updateCart();
}
}
// 减少商品数量
function decreaseQuantity(id) {
const itemIndex = cart.findIndex(item => item.id === id);
if (itemIndex > -1) {
if (cart[itemIndex].quantity > 1) {
cart[itemIndex].quantity -= 1;
} else {
cart.splice(itemIndex, 1); // 如果数量为1,则从购物车中移除
}
updateCart();
}
}
// 结算按钮事件
checkoutButton.addEventListener('click', () => {
if (cart.length === 0) {
alert('您的购物车是空的!');
return;
}
alert('订单已提交!感谢您的光临。');
cart = []; // 清空购物车
updateCart();
closeCartSidebar(); // 关闭购物车
});
第五步:整合与运行
- 确保三个文件 (
index.html,style.css,script.js) 都在同一个文件夹下。 - 用浏览器打开
index.html文件。 - 你就可以看到一个功能完整的订餐网页了!你可以点击“加入购物车”,查看购物车,调整数量,并模拟结算。
如何进一步改进?
这个版本已经具备了基本功能,但你可以尝试以下进阶功能来提升它:
- 响应式设计:确保网页在手机、平板和电脑上都能完美显示,你可以使用媒体查询(
@media)来调整不同屏幕尺寸下的布局。 - 后端集成:将前端与后端(如 Node.js + Express, Python + Flask, PHP)连接,实现真正的订单提交、用户登录、支付等功能。
- 本地存储:使用
localStorage来保存用户的购物车,这样即使刷新页面,购物车里的商品也不会丢失。 - 更多菜品:从数据库动态加载菜品,而不是硬编码在HTML里。
- 动画效果:使用 CSS 动画或 JavaScript 库(如 AOS - Animate On Scroll)为页面添加更丰富的动画效果。
希望这个详细的教程能帮助你成功开发出自己的订餐网页!祝你编码愉快!

(图片来源网络,侵删)
