ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

水果超市网页设计全拆解:HTML+CSS+JavaScript实现6页网站

水果超市网页设计全拆解:HTML+CSS+JavaScript实现6页网站 又一个学期末来得猝不及防。如果你刚好被“web课程设计”或“网页设计期末大作业”折磨到头秃那这篇东西应该能帮到你——尤其当你拿到的是“水果超市网站设计”“6页”“HTMLCSSJavaScript”这类看起来简单、做起来全是坑的作业题。我也不是第一次带学生做这种成品了今天干脆用一套已经跑通评分的“水果超市(6页)”项目当例子完整拆一遍从选题、规划到代码实现的手路附上我在实际批改和跑测中经常踩的坑。你不需要抄我这个题目按这套思路换成奶茶店、书店、宠物店都行关键是学会怎么用HTML5、CSS和JavaScript把页面撑起来并且让答辩老师和验收老师挑不出大毛病。很多同学拿到这种题目第一反应就是去下载一个“模板”然后改改标题交上去。这么做不是不行但风险太高模板代码风格混乱老师随便问一句“你这里的JavaScript函数是干什么的”就直接卡壳。我这篇文章更想让你从零走一遍清楚每段代码在干嘛页面之间怎么串联最后还能理直气壮地讲清楚设计理由。无论你打算用DreamweaverDW在可视化界面里拖还是直接用代码编辑器手写这套逻辑都能复用。1. 内容整体设计与思路拆解1.1 为什么选“水果超市”当作业题材选题是整个项目里最先要拍板的事情。水果超市看似普通但它的优势非常明显一是社会常识门槛低受众广不需要额外专业背景二是商品种类丰富苹果、香蕉、橙子、西瓜、葡萄随便列一排就能凑出商品列表页和详情页三是天然具备“商城”属性容易往购物车、订单、促销这些功能上靠正好能发挥JavaScript的作用。相比之下如果你选“某公司官网”就很容易做成只有导航和介绍文字的静态页面撑不起6页的量。从另一面看水果超市这个题材还有一个隐藏优势图片素材非常好找。搜索“水果 透明背景 PNG”就能获得大量无底色图片放到白色背景卡片里不会穿帮这对后排视觉评分很加分。如果选珠宝、数码产品高清图倒是有但抠图难度高反而会增加工作量。1.2 六页结构是怎么定的信息架构先于页面开发老师只说了“6页”但没说哪6页。我建议你不要临时凑页面先用一张纸把信息架构列出来。这套水果超市项目的6个页面是这样划分的页面文件页面标题核心功能index.html首页轮播图、今日特惠、热销水果推荐list.html商品列表页按品类展示水果卡片支持筛选/排序detail.html商品详情页大图预览、规格选择、加入购物车cart.html购物车页表格展示已选商品数量增减合计价格about.html关于我们店铺介绍、团队信息、发展历程contact.html联系我们地址、电话、留言表单、地图这个结构对应“浏览-选择-查看-下单-了解-沟通”的完整用户路径。老师看重的不是你会不会做“花哨”页面而是你能不能把一个偏真实场景的网站流程走通。页面之间通过导航栏互相跳转导航里的“购物车”图标还带一个数字角标用来显示当前购物车里的商品数量这就是一个很明显的JS交互亮点答辩时老师一定会注意到。1.3 公共区域统一设计导航栏和版权区不能省6个页面如果每个都长得不一样视觉上就散了。我在项目里把公共部分拆成“页头导航栏页脚版权区”6个页面共用同一套结构和样式。页头导航包括Logo区一个“鲜果园”文字图标、主导航首页、全部水果、关于我们、联系我们、购物车入口。导航栏固定在页面顶部用position: fixed加z-index: 100实现同时给body加padding-top防止主体被遮挡。页脚版权区放地址、电话、备案号、社交媒体占位图标——注意备案号这种可以写“本站仅为课程设计模拟使用”来规避真实信息。这种统一设计还有个额外好处CSS可以大量合并不用每个页面重复写。我在实际项目里维护两份公共样式表style.css和cart.css其他页面只写页面独有的局部样式。这样不管哪个页面显得乱改公共类就能一并修复。2. 核心技术选型与项目准备2.1 编辑器DW到底能不能用很多学校课程表里写着“Dreamweaver”也推荐学生用DW做作业。我的态度是可以用但只建议用“代码模式”别用可视化“设计模式”。DW的实时视图对CSS渲染和多列布局的展示并不准确尤其碰上flex布局时经常错位你在设计视图里看着对浏览器里可能乱成一团。如果你平时已经习惯VSCode或WebStorm也可以直接手写代码最后交作业时用DW打开一遍保证代码能被DW解析就行老师不会深究你用什么编辑器。如果是零基础同学我更推荐先装一个VSCode配合Live Server插件预览。它启动本地服务快HTML、CSS、JS语法高亮清晰还能在浏览器里自动刷新。等所有代码写完再复制到DW里跑一下兼容性只要不报错就行。2.2 项目目录结构从第一天就别乱建文件见过太多同学把所有文件堆在桌面然后图片路径全是C:/Users/...最后交到老师电脑上打不开。正常项目需要一个干净且固定的目录fruit-mart/ ├── index.html ├── list.html ├── detail.html ├── cart.html ├── about.html ├── contact.html ├── css/ │ ├── style.css │ └── cart.css ├── js/ │ ├── main.js │ ├── cart.js │ └── detail.js └── images/ ├── banner1.jpg ├── banner2.jpg ├── apple.png ├── banana.png └── ...所有页面放在根目录CSS和JS分类放子目录图片也都扔进images。这样无论你是用DW还是最后打包上传到服务器相对路径都不会出错。注意文件名统一小写加连字符不要出现中文名或空格“水果超市首页.html”这种文件在部分浏览器和服务器上会乱码。2.3 先画草图再写代码5分钟能完成的低保真原型新手最容易犯的错就是一边写HTML一边想布局结果写了300行发现页面乱成一锅粥。我强烈建议打开画图工具或白纸把6个页面的线框先画出来。不必精致但至少标出每个页面有哪些区块、哪些地方放图片、哪些地方放文字、哪些地方需要CSS效果/JS交互。比如首页的草图就是顶部导航 → 轮播图占位带左右箭头→ 今日特惠3个卡片 → 热销水果8个卡片 → 页脚。画完这张图你自己就知道HTML结构该写成什么顺序了header nav、main section、footer。代码只是把草图翻译成标签而已。3. 核心页面实现与关键代码解析3.1 首页轮播图不用插件也能写得清楚轮播图Banner几乎是网页设计课程的必留作业点也是最容易出问题的JS功能。很多同学喜欢直接引个jQuery插件但老师如果问你“取模运算为什么这样写”你就傻眼了。这里自己写一个原生JavaScript轮播逻辑不难也方便介绍。HTML结构简单一点div classbanner idbanner ul classbanner-slides idbannerSlides li classslide slide-activeimg srcimages/banner1.jpg alt鲜果特惠/li li classslideimg srcimages/banner2.jpg alt进口水果/li li classslideimg srcimages/banner3.jpg alt会员专享/li /ul a classbanner-arrow prev hrefjavascript:void(0); idprevBtn#10094;/a a classbanner-arrow next hrefjavascript:void(0); idnextBtn#10095;/a /divCSS要点是把所有.slide堆叠在一个容器里用position: absolute再用opacity和transition实现淡入淡出.banner { position: relative; height: 400px; overflow: hidden; } .slide { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; transition: opacity 0.6s ease; } .slide-active { opacity: 1; }JS这块我的建议是不要用display: none来做切换因为无法做平滑过渡。用变量currentIndex记录当前轮播序号每次切换时给当前项去掉slide-active下一项加上再把currentIndex移动到(currentIndex 1) % slideCount。这个取模逻辑保证到最后一张时能回到第一张循环无缝document.addEventListener(DOMContentLoaded, function () { var slides document.querySelectorAll(#bannerSlides .slide); var current 0; var timer null; function showSlide(index) { slides[current].classList.remove(slide-active); current (index slides.length) % slides.length; slides[current].classList.add(slide-active); } function nextSlide() { showSlide(current 1); } function startAutoPlay() { clearInterval(timer); timer setInterval(nextSlide, 3000); } document.getElementById(nextBtn).addEventListener(click, function () { showSlide(current 1); startAutoPlay(); }); document.getElementById(prevBtn).addEventListener(click, function () { showSlide(current - 1); startAutoPlay(); }); startAutoPlay(); });这段代码量不大但把时间函数、事件监听、classList操作全用上了老师问任何一个细节你都能答出来。为了保险页面里还要加上鼠标悬停暂停轮播mouseenter清理定时器mouseleave重新启动这也是一个小亮点。3.2 商品列表页用CSS弹性布局搞定卡片栅格商品列表页通常是内容最多的一页设计不好容易显得堆砌。我的做法是先用一个“筛选工具条”模拟电商网站的排序功能下面放一个.product-grid的容器里面塞12个商品卡片。每个卡片结构大致是这样div classproduct-card div classproduct-img img srcimages/apple.png alt红富士苹果 span classtag热卖/span /div div classproduct-info h3红富士苹果/h3 p classdesc脆甜多汁5kg装/p div classprice span classnow¥29.9/span span classold¥39.9/span /div a hrefdetail.html?id1 classbtn-primary查看详情/a /div /div布局全部交给Flex.product-grid { display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 20px; } .product-card { width: calc((100% - 60px) / 4); border: 1px solid #f0f0f0; border-radius: 10px; overflow: hidden; transition: transform 0.2s, box-shadow 0.2s; } .product-card:hover { transform: translateY(-6px); box-shadow: 0 8px 20px rgba(0,0,0,0.08); }这里最容易被忽略的是box-sizing: border-box。如果没设置width: calc会把border和padding加在宽度外面四列很容易变成三列或错位。建议直接在style.css顶部写一个全局重置* { margin: 0; padding: 0; box-sizing: border-box; }排序区我加了三个按钮按默认、按价格升序、按销量降序。这个功能需要一点JavaScript先把商品数据放到一个数组里再动态渲染卡片。考虑到期末作业一般不用太复杂也可以简单点用click改变product-grid的flex-direction或重排DOM节点的顺序。如果要体现“会JS”我建议你做成data数组渲染能用上数组.sort()和document.createElement。3.3 商品详情页用URL传参联动列表页很多同学做详情页时只是复制一张大图和几段文字并没有和列表页产生逻辑联系。老师一眼就能看出这是拼凑页数。我在这个项目中让列表页的“查看详情”链接指向detail.html?id1详情页的JavaScript再通过读取location.search里的id参数决定渲染哪种水果的数据。数据可以存在一个全局数组里这里只演示前半段——读取参数function getQueryParam(name) { var url window.location.search; var reg new RegExp([?] name ([^]*)); var match url.match(reg); return match ? decodeURIComponent(match[1]) : null; } var fruitId getQueryParam(id); // 根据 fruitId 从数据数组中取对应商品有了这个数据联动商品详情页的大图、标题、价格、库存、简介全部可以由JS填充。我在页面上还加了一个“数量选择器”点击“”和“-”修改文本框的数字实现上下限判断这个动作虽然简单但非常好讲。详情页的第二个加分点是缩略图切换。图片区域放一个主图下面一排小图点击小图时替换主图的src。这个效果用原生JS写也很容易本质上和轮播图类似都是操作classList或属性。你可以把它们统一放进detail.js并给每个功能写清楚注释。3.4 购物车页localStorage持久化是最大亮点购物车在大多数期末作业里都是“死页面”点“加入购物车”没有任何反应。我这里用的是localStorage把当前用户加入的商品数据保存到浏览器本地。只要不清浏览器缓存刷新后购物车数据依然在。这对老师来说是个意外惊喜。“加入购物车”的按钮放在详情页function addToCart(fruitId, name, price, img) { var cart JSON.parse(localStorage.getItem(fruitCart)) || []; var found cart.find(function (item) { return item.id fruitId; }); if (found) { found.count 1; } else { cart.push({ id: fruitId, name: name, price: price, img: img, count: 1 }); } localStorage.setItem(fruitCart, JSON.stringify(cart)); updateCartBadge(); }购物车页面读取这份数据用表格展示。表格每一行包含商品图、名称、单价、数量、小计、删除按钮。数量的加减直接更新count重新计算小计和总价function renderCart() { var cart JSON.parse(localStorage.getItem(fruitCart)) || []; var tbody document.getElementById(cartBody); tbody.innerHTML ; var total 0; cart.forEach(function (item, index) { var subtotal item.price * item.count; total subtotal; var tr document.createElement(tr); // ... 创建单元格并填充内容 }); document.getElementById(totalPrice).textContent total.toFixed(2); }注意要用toFixed(2)格式化金额否则会出来一长串浮点数。另外在删除商品和修改数量后必须重新调用renderCart()并且同步updateCartBadge()保证页面顶部购物车图标上的数字角标永远是准的。3.5 关于我们和联系我们表单校验与嵌入式地图“关于我们”页面不需要太多动态功能重在排版。我放了一段店铺故事、一组“团队介绍”的四张头像卡片还有一个时间线表示发展历程用CSS的::before做竖线装饰。这个页面用来展示你的CSS细节控制能力比如列表符号、边框、圆角、阴影不要做成纯文字堆砌。“联系我们”页面里有一个留言表单姓名、邮箱、留言内容、提交按钮。这个表单要能通过HTML5的required属性先做一次浏览器端非空校验再用JavaScript做一次邮箱格式校验。老师如果问“为什么需要双重校验”你就可以回答HTML5required拦截空输入但无法精准判断格式JS正则可以进一步校验格式减少无效提交。邮箱正则最简单常用的是/^\w\w\.\w$/虽然不完美但应付课程设计足够了。页面里还可以嵌入一个地图iframe。苹果自带地图或第三方地图的嵌入链接都能用复制到HTML里前后不要乱改。如果网络环境不稳定地图加载不出来可以换成一张静态地图图片再配合右侧地址信息也能达到效果。4. 关键细节与踩坑汇总4.1 图片路径和缓存问题这可能是你在批改过程中遇到的问题。我在测试这套页面时有一张水果图片老是显示不出来打开开发者工具才发现路径里的文件名大小写写错了比如Apples.png写成了apple.png。Windows本地环境下大小写不敏感浏览器可能还能显示但部署到Linux服务器上就会报404。建议把图片统一处理成小写文件名压缩图片时也用jpg/png/webp清晰的格式。另外你在改完CSS后浏览器没能刷新出效果很多时候是缓存问题。我在调试时习惯打开开发者工具的Network面板勾选Disable cache如果还在用旧的静态文件就加一个版本号参数比如style.css?v2。4.2 JS代码必须放在DOM加载之后刚学JavaScript很容易犯“脚本写不到点位上”的错。比如把script放在head里然后直接调用document.getElementById(banner)结果返回null因为浏览器解析到这一段时还没渲染banner节点。解决办法有两种一种是把所有script标签放在/body之前另一种是用DOMContentLoaded事件把代码包起来。我在上面轮播图代码里就用了这种写法目的是确保DOM完全加载后再绑定事件。你在写购物车、详情页脚本时也要养成这个习惯。4.3 CSS样式被全局标签污染因为6个页面共用一套CSS很容易出现“页面A改了样式页面B跟着歪了”的情况。我在这个项目中吃过亏为了让首页标题加粗变色直接写了h3 { color: red; }结果详情页所有小标题全红。后来统一改成给页面根元素加特定类名比如body classhome-page局部样式写成.home-page h3 { ... }。这样就能隔离页面差。如果你不想维护大量特殊类名也可以每个页面写一个style块只覆盖当前页面的局部样式但注意不要都用!important去压制公共样式否则后期越改越乱。4.4 Flex布局小卡片高度不一致商品列表页最常见的视觉毛病是同一行的卡片高度参差不齐。原因一般是卡片内容长短不一而卡片本身没有设置统一高度或flex-grow。解决办法是给.product-card设置display: flex; flex-direction: column;然后让.product-info用flex: 1撑满剩余空间按钮固定在底边。这样不管标题写一行还是两行卡片底部都能对齐。4.5 表单文本域换行与特殊字符转义在联系我们页面的留言框里如果用户在内容中提交了script标签页面会把这段内容当成HTML渲染出来轻则排版错乱重则形成XSS漏洞。虽然是课程作业但我也建议你写入留言时用textContent而不是innerHTML去展示动态内容。这是一个非常容易被扣分的“安全意识”加分项。5. 扩展思路怎么让作业“看起来不廉价”很多同学做完页面后总觉得差点意思其实问题不一定出在功能上而是整体视觉打磨不够。我在课程最后会让学生在配色、字体、动效上各加一步配色统一水果超市多用绿色系作为主色比如#27ae60辅助色用橙色#f39c12背景用浅灰白#f8f9fa。同一页面不要出现超过3种主色否则容易显土。字体优化中文字体在Windows下优先用Microsoft YaHei标题可以用PingFang SC或系统默认黑体。字号层级要清晰比如导航14px正文16px卡片标题18px页面主标题28px。增加微交互动效导航鼠标悬停变色、卡片上浮、图片放大、按钮按下回弹这些用CSS就能做。不必每个地方都加挑两三个位置加反而自然。如果你还有余力可以给首页加一个“距本店打烊还剩xx分钟”的倒计时JS效果把setInterval和Date对象用起来。这类小功能在答辩时很容易制造话题因为老师通常看到倒计时会问“这个是怎么实现的”你就可以顺带讲一遍setInterval的用法。6. 实操中要多留一手的几个问题6.1 交作业前的浏览器兼容性测试课程设计验收经常在教室电脑上进行那台机器可能还是Win7IE11的老环境。所以建议你至少用Chrome、Edge、Firefox三种主流浏览器各打开一遍所有页面确认样式和交互正常。flex布局在IE11的部分旧版本有兼容性bug如果老师机器实在跑不动就改为float或inline-block布局虽然土一点但稳。另外localStorage在IE11里是可用的但如果在隐私模式下可能被禁用极端情况不要死磕能在Chrome正常演示就行。6.2 答辩准备先讲需求再讲实现最后演示老师最反感的是学生打开页面像个游客一样乱点乱逛。我的建议是按这个顺序汇报先说“我选水果超市主题6个页面分别是首页、列表、详情、购物车、关于、联系用户可以从浏览到下单走完一个完整流程”然后讲“购物车用localStorage保存数据详情页通过URL参数联动列表页”最后再开始演示。这比一上来就拖动页面自然得多。6.3 代码注释量要适中很多编程老师会看源代码但不会逐行看。你需要做到核心代码段有注释但不是每一行都写“这里定义一个变量”。我一般是在每个功能块前面写两三句注释说明这一段干什么。轮播图、购物车增删、表单校验是必写注释的地方。注释还能帮助你重新理解自己的代码答辩前临时翻也不会慌。6.4 别改了页面忘了改标题交作业时经常有人6个页面不管在哪个标签页浏览器标题栏都是“水果超市 - 首页”。这种低级错误非常显眼建议统一检查title比如列表页写“全部水果 - 鲜果园”详情页写“商品详情 - 鲜果园”。标题不仅是面子问题还能体现你对信息结构是否上心。6.5 交文件时打包成zip并附上说明用Docs或者邮箱提交作业时别只发一个HTML文件图片和CSS都没打包老师打开肯定一堆裂图。正确做法是把整个fruit-mart文件夹压缩成zip压缩时保持目录结构不变。另外可以写一个说明.txt里面注明开发环境VSCode或DW版本、浏览器建议Chrome内核、账号密码如果有登录功能、本地预览方式。这个小举动可以避免很多无谓的扣分。7. 一些不太会写进教程的体会每次带完一届课程设计我都发现代码水平不是最要命的差距主要出在“完成度”上。有人能规规矩矩做完全部6个页面功能跑通视觉干净分数就不会差有人一开始想搞3D动画、接入人工智能最后交上来却只有一个半成品首页。我真心建议第一次独立完成这种多页面项目时宁可把基础做扎实也不要贪多。如果你正好也在做“水果超市”同款题目可以试试按我上面的顺序动手先定信息架构再写公共样式再做首页静态部分然后做商品列表和详情的数据联动最后接购物车本地存储和表单校验。卡住的时候拆成小问题逐个解决效率远高于对着整页报错发呆。我在这套项目里最满意的一个细节其实是导航栏购物车角标的数字同步。它看起来不起眼却能把“详情页加入购物车”和“购物车页面渲染”这两个分散的功能串成一个闭环。老师看到这种前后呼应的地方一般会认为你真的理解了页面之间怎么通信而不是复制粘贴。这也是我觉得做网页设计最好玩的部分你把一个个孤立的页面连成了一条完整的用户路径。希望这份拆解能帮你少踩几个坑期末顺利过关。
返回列表