ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用HTML+CSS+JavaScript从零搭建相宜本草购物商城

用HTML+CSS+JavaScript从零搭建相宜本草购物商城 刚敲完期末作业的最后一版页面大概率不少同学正对着浏览器里那个“能打开但没眼看”的商城发愁图片歪了、导航不动、购物车按钮点了没反应。这正是每年网页设计课交作业前最常见的状态。这篇东西也不绕弯子直接围绕“大学生HTML期末大作业——HTMLCSSJavaScript购物商城相宜本草”这一套需求来聊把从零开始做一个能交差、能拿分、答辩时不心虚的相宜本草商城项目按我实际带人做过的流程完整捋一遍。无论你是刚接触前端三件套的新手还是想在期末作业上冲一把“优秀”的选手都可以照着这个思路直接复刻。先说一个很多人理解错的事期末大作业不等于商业项目老师要看的是你掌握了多少HTML标签、CSS样式和JavaScript交互而不是你真的把电商平台做出来了。所以下面每个设计决策我都尽量讲清楚“为什么这么做”你知其然也知其所以然答辩才有话说。1. 选题逻辑购物商城千千万为什么偏挑相宜本草做模板很多同学一打开Dreamweaver或者VS Code就开始写代码结果写了一半卡住。做网页最忌讳的就是不看项目直接动手。相宜本草这个品牌恰恰是拿来当期末商城模板最舒服的一个方向。1.1 品牌调性直接决定“好看程度”相宜本草是护肤品牌主打中草药、自然、草本这些关键词它的VI体系基本是红色系加米白视觉气质偏温和和满屏科技蓝、荧光绿的“数码风”完全不是一回事。你做一个护肤商城整个页面用红白渐变、暖色调背景不用复杂的海报设计就会自带一种“像个正经品牌”的感觉。反过来如果选一个没有明确视觉风格的虚构品牌你可能要花大量时间在配色和字体上反复犹豫最后做出来还是像“网页设计练习作业”。所以带品牌的项目第一优势就是品牌已经帮你决定了色彩、文案和图片方向你只需要按要求把它落地。1.2 期末评分的潜规则三件事占大头带过几次期末答辩后发现老师评分一般不会真的拿你的网站去和淘宝、京东对比重点只盯三件事。第一页面结构是否清晰完整至少要有头、导航、主体内容、商品展示区、底部版权最好还有登录或结算内容第二CSS是否体现出了你的控制力比如布局用了Flex或Grid、hover有效果、页面不是所有东西全部堆在左边第三JavaScript是否有真正的交互比如加购、数量加减、轮播、弹窗而不是只有一个简单的alert。相宜本草商城恰好能覆盖这三个评分点商品列表天然需要卡片布局这就引出Flex/Grid购物车的增删改查是标准JS基本功品牌动效做几个按钮涟漪和3D图片旋转又能在展示时获得额外印象分。所以毫不夸张地说这是个“性价比”很高的选题。2. 首页结构拆解导航、轮播、商品卡、页脚怎么编排不显廉价不少同学拿到的题目只有一句话比如“制作一个相宜本草官网商城首页”但没人告诉你页面应该包含哪几个模块。这里我直接给出一套可以直接用的页面分区方案。2.1 先画一个信息层级再写HTML动笔写代码之前我习惯先在纸上画“大盒子”也就是信息架构。一般商城主页按顺序放六个区域顶部工具条包含“欢迎来到相宜本草官方商城”和登录/注册链接Logo区与搜索框左边放品牌名称中间放搜索框右侧放购物车图标主导航栏首页、护肤系列、面膜专区、优惠活动、关于我们轮播Banner区2到3张主推产品图自动切换商品列表区用卡片网格展示产品每个卡片有图、名称、价格、加购按钮页脚版权、友情链接、联系方式这样划分之后HTML写起来就是从上到下四个语义化标签header、nav、main、footer主内容里再包几个section。这比一溜烟儿全部用div要规范得多老师看源代码时也会觉得你确实懂HTML结构而不是只会写div套div。2.2 商品卡是商城页面的灵魂结构上要“耐拆”商品卡看似简单但很多人的做法是把图片、文字、价格全写成固定div导致后面想加第5个商品时得复制一大段代码。正确做法是让每张卡片结构统一用类名区分。一个标准的商品卡片长这样div classproduct-card img srcimages/product-1.jpg alt相宜本草面膜 h3相宜本草四倍蚕丝面膜/h3 p classprice¥89.00/p button classadd-btn>:root { --brand-red: #9E2B22; --bg-cream: #F9F5F0; --accent-gold: #C8A165; --text-main: #333333; }为什么推荐CSS变量因为期末作业改来改去是常态老师如果让你“把红色调温柔一点”你只要改一行全局变量而不是一个类一个类查找替换。另外按钮、价格文字、hover下划线统一用品牌红也会让页面看起来像经过设计。3.2 涟漪光圈扩散效果怎么加在按钮上热搜词里经常有人搜“CSS涟漪光圈扩散”这个效果非常适合用在这个项目的“加入购物车”按钮或者Banner按钮上。原理也不复杂用伪元素做一个圆形从scale(0)开始配合透明度变化让它慢慢放大消失形成“水波散开”的感觉。.btn-ripple { position: relative; overflow: hidden; background: var(--brand-red); color: #fff; border: none; padding: 8px 20px; cursor: pointer; } .btn-ripple::after { content: ; position: absolute; width: 20px; height: 20px; left: 50%; top: 50%; background: rgba(255, 255, 255, 0.5); border-radius: 50%; transform: translate(-50%, -50%) scale(0); animation: ripple 1.2s ease-out infinite; } keyframes ripple { 0% { transform: translate(-50%, -50%) scale(0); opacity: 0.6; } 100% { transform: translate(-50%, -50%) scale(8); opacity: 0; } }这里必须提醒一句这个涟漪会一直循环播放。如果全班都看到你的按钮一直在发光反而显得不加节制。建议只给Banner的主按钮加循环涟漪购物车的按钮只在点击时触发一次。实现“点击触发一次”的方式也不难JS里给按钮添加一个类以后用setTimeout移除类。3.3 3D旋转和卡片悬浮的实操代码热搜词里还有一条是“CSS中transform: rotateY(60deg) translateZ(300px) 这个出来是什么样子”这个效果如果用在商品图上会做出一种“产品包装盒微微转开”的立体感。不过千万注意这个效果不适合所有图片适合那种本身是盒子或瓶罐造型的产品图。一个稳妥的做法是给商品图片包一层容器鼠标移入时做一个Y轴旋转和轻微的位移.product-img-wrapper { perspective: 800px; } .product-img-wrapper img { transition: transform 0.6s ease; } .product-card:hover .product-img-wrapper img { transform: rotateY(18deg) translateZ(12px); }这样图片不是平白无故转90度而是像你拿起产品盒端详一样幅度小、视觉舒服。卡片悬浮效果则是“上移加阴影”默认卡片阴影很轻hover后向上移动6px阴影加深变大。这一招做完素人页面立刻有“专业感”。3.4 动画“克制”原则——不是越炫越好做CSS动效最容易犯的毛病是“每样东西都想动一下”。我刚学CSS的时候就是让Banner、文字、商品卡全部一进场就弹跳结果交上去之后被点评“太花了”。有效的做法是页面加载动画只做一个比如Banner大标题淡入即可交互动画不超过三个比如卡片悬浮、按钮涟漪、轮播切换。动效的目的是让老师知道“这个学生会CSS动画”不是让他看一场特效秀。4. 购物车模块用JavaScript把“展示型网页”变成“可用商城”在期末作业里JavaScript的分量能占到三到四成。如果一个页面只有HTML和CSS做得再好看也只是一张静态海报没有达到“商城”该有的交互要求。购物车模块是最值得做的JS功能又刚好是JavaScript基础知识的标准组合对象操作、数组遍历、DOM更新、事件监听。4.1 数据结构和渲染逻辑怎么设计很多新手加购时喜欢直接改按钮文字比如点一下把“加入购物车”改成“已加入”这太简单了不值得成为主交互。正确做法是用一个对象来模拟购物车的数据模型let cart {}; function addToCart(id, name, price) { if (cart[id]) { cart[id].count; } else { cart[id] { name: name, price: price, count: 1 }; } renderCart(); }变量id是商品唯一编号count是数量price是单价。这个结构虽然简单但它是后面所有购物车功能的地基。如果你后面想加“删除商品”“修改数量”只要在这个对象上做增减就行不需要重写页面结构。4.2 加购、改数量、算总价一次说清商品卡按钮绑定事件可以用事件委托。在document上监听click通过closest找到按钮再读取>document.addEventListener(click, function (e) { const btn e.target.closest(.add-btn); if (btn) { addToCart(btn.dataset.id, btn.dataset.name, parseFloat(btn.dataset.price)); } });渲染购物车列表和总价是核心代码。在renderCart里用Object.keys(cart)遍历商品对象把小计价格算出来再累加得到总价function renderCart() { const list document.getElementById(cart-list); const totalPrice document.getElementById(cart-total); let html ; let total 0; for (let id in cart) { const item cart[id]; const subtotal item.price * item.count; total subtotal; html li ${item.name} × ${item.count} span¥${subtotal.toFixed(2)}/span button classinc>localStorage.setItem(herborist_cart, JSON.stringify(cart)); window.addEventListener(load, function () { const saved localStorage.getItem(herborist_cart); if (saved) { cart JSON.parse(saved); renderCart(); } });localStorage是浏览器自带的本地存储能力期末阶段用它对得上知识范围而且效果直观。注意要写成整个购物车对象的序列化不要一个商品一个key地存不然数据管理和后期修改都麻烦。4.4 结算表单与基础校验购物车有了之后最好再做一个“去结算”的弹层或者独立结算区包含姓名、电话、收货地址这些输入项。JavaScript在这里可以做两件有意义的事一是非空校验二是订阅按钮点击事件阻止默认提交。document.getElementById(checkout-btn).addEventListener(click, function (event) { event.preventDefault(); const name document.getElementById(customer-name).value.trim(); const phone document.getElementById(customer-phone).value.trim(); if (name || phone ) { alert(请填写姓名和电话); return; } alert(订单提交成功感谢购买相宜本草产品); cart {}; renderCart(); });这里用event.preventDefault()阻止按钮默认提交表单然后手动做校验。等你以后学了fetch、ajax会发现就是在这一步的基础上把alert换成真实接口请求逻辑完全是通的。5. 答辩前实测期末作业最常见的扣分点和补救动作临近提交很多同学还在手忙脚乱地加新功能却不知道真正的问题往往不在“少功能”而在“基础毛病”。以下是我在验收作业时反复看到的四类问题列出来等于一份避坑清单。5.1 路径错误图片不显示的经典原因图片加载不出来90%是因为路径写错。期末作业里常见的是在img标签里写了类似C:\Users\...这样的绝对路径一旦换台电脑或移动文件夹图片就全挂。你应该把网站文件夹当作一个整体图片放在images子目录里HTML引用时写images/xxx.jpg这种相对路径。提交前务必换一台电脑或者把文件夹打包发给朋友让他打开index.html检查图片是否正常。5.2 功能按钮“没反应”的排查套路一个常见的尴尬场景是答辩时点“加入购物车”页面完全没反应。如果出现这种情况不要慌按顺序排查三件事。第一按F12打开控制台看报错有没有“xxx is not defined”或“cannot read property”这类提示第二检查script标签是不是写在页面底部且路径正确写错文件名或者script标签放在head里还没用defer就可能拿不到DOM元素第三检查是不是同时引了多个版本的jQuery或插件导致变量被覆盖。期末项目一般不用引框架纯原生JavaScript反而更稳也更好解释。5.3 代码风格与注释习惯这能让你答辩时多讲两分钟我一直建议学生在代码里写清楚注释特别是每个模块的开头加一行注释说明这是“导航栏”还是“购物车”还是“轮播图控制”。老师看源代码的时候会直接感受到你思路清晰。起名也别再用box1、div2这种让人摸不着头脑的类名用banner、product-grid、footer-info这种有语义的名字。答辩时你就可以指着注释说“这里我用了一个对象来保存购物车数据”比临时翻代码找半天要体面得多。5.4 独立演示脚本和备份建议最后分享一个实用的个人经验不要一上来直接点成品页面先准备好一套“演示路径”。合理的顺序是先展示首页整体布局鼠标经过商品卡片看悬浮效果点一下Banner按钮展示涟漪光圈扩散再点几个“加入购物车”点加号和减号展示数量与总价变化刷新页面展示购物车没有丢失最后填一个结算表单弹出提交成功。整个流程两分钟每一类评分点都覆盖到了。提交前把项目文件夹压缩备份一份最好在云盘和U盘各存一份别等到答辩现场才发现文件损坏或者版本不对。按照这个节奏一个结构清楚、有品牌感、CSS动效和JavaScript交互都拿得出手的“相宜本草购物商城”期末大作业就能稳定完成了。我在实际带的过程中最深的体会就是期末作业需要的不是炫技而是完整的“项目感”。当你把一个普通的商城网页做出可以加购、结算、刷新的闭环时你已经比大部分只会放图片的同学往前迈了一大截。这个项目后期还能继续扩展成多页面、轮播图、登录注册问卷等形态逐步把你学到的前端知识全部串起来。
返回列表