下面我将为你提供一个从零开始的详细教程,带你一步步构建一个功能完整的淘宝商品详情页,我们将使用纯 HTML、CSS 和原生 JavaScript,这样你能更好地理解底层原理。

(图片来源网络,侵删)
最终效果预览
我们将创建一个类似下面这样的页面:
第一步:准备工作
-
文件结构:创建一个项目文件夹,然后在里面创建以下三个文件:
index.html(存放网页内容)style.css(存放样式)script.js(存放交互逻辑)
-
图片资源:你需要一些商品图片,你可以使用你自己的图片,或者从网上下载一些示例图片(
main.jpg,thumb1.jpg,thumb2.jpg等),将这些图片也放在你的项目文件夹中。 -
图标资源:我们使用一个非常流行的图标库 Font Awesome,在你的 HTML 文件的
<head>标签中,引入它的 CDN:
(图片来源网络,侵删)<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
第二步: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">Apple iPhone 15 Pro Max - 商品详情</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<!-- 1. 顶部导航栏 -->
<header class="main-header">
<div class="container">
<h1>我的淘宝店</h1>
</div>
</header>
<!-- 2. 主要内容区 -->
<main class="main-content container">
<div class="product-container">
<!-- 左侧:图片展示区 -->
<div class="product-gallery">
<div class="main-image-container">
<img id="main-image" src="images/main.jpg" alt="商品主图">
</div>
<div class="thumbnail-list">
<img class="thumbnail active" src="images/thumb1.jpg" alt="缩略图1" data-src="images/main.jpg">
<img class="thumbnail" src="images/thumb2.jpg" alt="缩略图2" data-src="images/thumb2.jpg">
<img class="thumbnail" src="images/thumb3.jpg" alt="缩略图3" data-src="images/thumb3.jpg">
<img class="thumbnail" src="images/thumb4.jpg" alt="缩略图4" data-src="images/thumb4.jpg">
</div>
</div>
<!-- 右侧:商品信息区 -->
<div class="product-info">
<h1 class="product-title">Apple iPhone 15 Pro Max 256GB 钛金属 - 全新上市</h1>
<div class="review-section">
<span class="price">¥ 9,999</span>
<div class="rating">
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star-half-alt"></i>
<span class="review-count">(4.5分 · 12,345条评价)</span>
</div>
</div>
<div class="summary">
<p class="summary-line"><span class="summary-label">促销</span> <span class="summary-value">限时优惠,满10000减200</span></p>
<p class="summary-line"><span class="summary-label">配送</span> <span class="summary-value">至 · 北京 朝阳区 免运费</span></p>
<p class="summary-line"><span class="summary-label">服务</span> <span class="summary-value">7天无理由退换 · 正品保证</span></p>
</div>
<div class="color-picker">
<span class="option-label">颜色:</span>
<div class="options">
<button class="option-btn active">钛原色</button>
<button class="option-btn">蓝色钛金属</button>
<button class="option-btn">白色钛金属</button>
</div>
</div>
<div class="quantity-picker">
<span class="option-label">数量:</span>
<div class="quantity-controls">
<button id="decrease-qty">-</button>
<input type="number" id="quantity" value="1" min="1" max="10">
<button id="increase-qty">+</button>
</div>
</div>
<div class="action-buttons">
<button class="add-to-cart-btn">
<i class="fas fa-shopping-cart"></i> 加入购物车
</button>
<button class="buy-now-btn">立即购买</button>
</div>
</div>
</div>
</main>
<!-- 3. 页脚 -->
<footer class="main-footer">
<div class="container">
<p>© 2025 我的淘宝店. All rights reserved.</p>
</div>
</footer>
<script src="script.js"></script>
</body>
</html>
第三步:CSS 样式 (style.css)
CSS 负责美化我们的网页,让它看起来像真正的淘宝页面。
/* --- 全局样式和变量 --- */
:root {
--primary-color: #ff6900; /* 淘宝橙色 */
--text-color: #333;
--light-gray: #f4f4f4;
--border-color: #eee;
--max-width: 1200px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
margin: 0;
background-color: #f5f5f5;
color: var(--text-color);
}
.container {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 20px;
}
/* --- 顶部导航 --- */
.main-header {
background-color: #fff;
border-bottom: 1px solid var(--border-color);
padding: 15px 0;
}
.main-header h1 {
margin: 0;
font-size: 24px;
color: var(--primary-color);
}
/* --- 主要内容 --- */
.main-content {
padding: 40px 0;
}
.product-container {
display: flex;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
overflow: hidden;
}
/* --- 左侧图片区 --- */
.product-gallery {
flex: 1;
padding: 20px;
max-width: 600px;
}
.main-image-container {
width: 100%;
height: 600px;
overflow: hidden;
border: 1px solid var(--border-color);
border-radius: 4px;
}
.main-image-container img {
width: 100%;
height: 100%;
object-fit: cover; /* 关键:保持图片比例并填充容器 */
}
.thumbnail-list {
display: flex;
margin-top: 15px;
gap: 10px;
}
.thumbnail {
width: 80px;
height: 80px;
border: 1px solid var(--border-color);
border-radius: 4px;
cursor: pointer;
opacity: 0.7;
transition: opacity 0.3s;
}
.thumbnail:hover,
.thumbnail.active {
opacity: 1;
border-color: var(--primary-color);
}
/* --- 右侧商品信息区 --- */
.product-info {
flex: 1;
padding: 30px;
display: flex;
flex-direction: column;
}
.product-title {
font-size: 24px;
font-weight: 500;
margin: 0 0 20px 0;
line-height: 1.4;
}
.review-section {
display: flex;
align-items: center;
margin-bottom: 25px;
}
.price {
font-size: 32px;
font-weight: bold;
color: var(--primary-color);
margin-right: 20px;
}
.rating i {
color: #f5a623;
}
.review-count {
color: #999;
font-size: 14px;
margin-left: 10px;
}
.summary {
margin-bottom: 30px;
}
.summary-line {
font-size: 14px;
margin-bottom: 10px;
display: flex;
align-items: center;
}
.summary-label {
color: #999;
width: 60px;
}
.summary-value {
flex: 1;
}
.option-label {
display: block;
margin-bottom: 10px;
font-weight: 500;
}
.color-picker .options {
display: flex;
gap: 10px;
}
.option-btn {
padding: 8px 16px;
border: 1px solid var(--border-color);
background-color: #fff;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s;
}
.option-btn:hover,
.option-btn.active {
border-color: var(--primary-color);
color: var(--primary-color);
}
.quantity-controls {
display: flex;
align-items: center;
border: 1px solid var(--border-color);
border-radius: 4px;
width: fit-content;
}
.quantity-controls button {
width: 40px;
height: 40px;
border: none;
background-color: #fff;
cursor: pointer;
font-size: 18px;
color: var(--text-color);
}
.quantity-controls button:hover {
background-color: var(--light-gray);
}
#quantity {
width: 60px;
height: 40px;
border: none;
border-left: 1px solid var(--border-color);
border-right: 1px solid var(--border-color);
text-align: center;
font-size: 16px;
}
/* --- 行动按钮 --- */
.action-buttons {
margin-top: auto;
display: flex;
gap: 15px;
}
.add-to-cart-btn, .buy-now-btn {
flex: 1;
padding: 15px;
border: none;
border-radius: 4px;
font-size: 16px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s;
}
.add-to-cart-btn {
background-color: #ff9900;
color: #fff;
}
.add-to-cart-btn:hover {
background-color: #e68a00;
}
.buy-now-btn {
background-color: #ff6900;
color: #fff;
}
.buy-now-btn:hover {
background-color: #e55a00;
}
/* --- 页脚 --- */
.main-footer {
background-color: #333;
color: #fff;
text-align: center;
padding: 20px 0;
margin-top: 40px;
}
第四步:JavaScript 交互 (script.js)
让我们的页面“活”起来。
// 1. 图片切换功能
document.addEventListener('DOMContentLoaded', () => {
const mainImage = document.getElementById('main-image');
const thumbnails = document.querySelectorAll('.thumbnail');
thumbnails.forEach(thumb => {
thumb.addEventListener('click', () => {
// 移除所有缩略图的 'active' 类
thumbnails.forEach(t => t.classList.remove('active'));
// 给当前点击的缩略图添加 'active' 类
thumb.classList.add('active');
// 更换主图
mainImage.src = thumb.getAttribute('data-src');
});
});
// 2. 数量增减功能
const decreaseBtn = document.getElementById('decrease-qty');
const increaseBtn = document.getElementById('increase-qty');
const quantityInput = document.getElementById('quantity');
decreaseBtn.addEventListener('click', () => {
let currentValue = parseInt(quantityInput.value);
if (currentValue > 1) {
quantityInput.value = currentValue - 1;
}
});
increaseBtn.addEventListener('click', () => {
let currentValue = parseInt(quantityInput.value);
if (currentValue < 10) { // 假设最大库存为10
quantityInput.value = currentValue + 1;
}
});
// 3. 颜色选择功能
const colorButtons = document.querySelectorAll('.color-picker .option-btn');
colorButtons.forEach(btn => {
btn.addEventListener('click', () => {
// 移除所有颜色按钮的 'active' 类
colorButtons.forEach(b => b.classList.remove('active'));
// 给当前点击的按钮添加 'active' 类
btn.classList.add('active');
// 这里可以添加切换商品图片的逻辑
// mainImage.src = 'images/' + btn.textContent + '.jpg';
console.log('选择了颜色:', btn.textContent);
});
});
// 4. 加入购物车和立即购买按钮功能
const addToCartBtn = document.querySelector('.add-to-cart-btn');
const buyNowBtn = document.querySelector('.buy-now-btn');
addToCartBtn.addEventListener('click', () => {
const selectedColor = document.querySelector('.color-picker .option-btn.active').textContent;
const selectedQuantity = quantityInput.value;
// 创建一个提示信息
const message = `已将 ${selectedQuantity} 件 "${selectedColor}" 加入购物车!`;
// 创建一个自定义的提示框
const toast = document.createElement('div');
toast.className = 'toast';
toast.textContent = message;
document.body.appendChild(toast);
// 3秒后移除提示框
setTimeout(() => {
document.body.removeChild(toast);
}, 3000);
console.log('加入购物车:', { color: selectedColor, quantity: selectedQuantity });
});
buyNowBtn.addEventListener('click', () => {
const selectedColor = document.querySelector('.color-picker .option-btn.active').textContent;
const selectedQuantity = quantityInput.value;
alert(`即将跳转到结算页面,购买 ${selectedQuantity} 件 "${selectedColor}",`);
console.log('立即购买:', { color: selectedColor, quantity: selectedQuantity });
});
});
// 5. 添加自定义提示框的样式
const style = document.createElement('style');
style.textContent = `
.toast {
position: fixed;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
background-color: #333;
color: white;
padding: 15px 25px;
border-radius: 4px;
z-index: 1000;
animation: fadeInOut 3s ease-in-out;
}
@keyframes fadeInOut {
0% { opacity: 0; transform: translate(-50%, 20px); }
10% { opacity: 1; transform: translate(-50%, 0); }
90% { opacity: 1; transform: translate(-50%, 0); }
100% { opacity: 0; transform: translate(-50%, 20px); }
}
`;
document.head.appendChild(style);
总结与进阶
恭喜!你已经成功创建了一个功能完整的淘宝风格商品页面。

(图片来源网络,侵删)
我们做了什么:
- HTML:搭建了页面的基本结构,包括头部、主体(图片和信息区)和页脚。
- CSS:使用 Flexbox 布局实现了左右分栏,并添加了各种样式,使其美观且具有响应式设计的基础。
- JavaScript:实现了四个核心交互功能:
- 点击缩略图切换主图。
- 使用 和 按钮调整购买数量。
- 选择商品颜色(并预留了扩展接口)。
- 点击“加入购物车”和“立即购买”按钮,并给出了用户友好的反馈。
如何进一步改进?
- 响应式设计:使用 CSS Media Queries,让页面在手机和平板上也能完美显示。
- 轮播图:为图片添加自动轮播功能。
- SKU 选择:当选择不同颜色或规格时,动态更新价格和库存信息。
- 更真实的交互:使用 AJAX 向后端发送请求,模拟真实的加入购物车和购买流程。
- 更多细节:添加商品详情标签页(如“宝贝详情”、“规格与包装”等)。
这个项目是学习前端开发的绝佳起点,希望这个教程对你有帮助!
