HTML5期末作业实战:厦门旅游网14页面完整开发指南 📅 发布时间:2026/8/27 6:16:10 👁 浏览次数: 简介网页制作是前端开发学习的核心实践而一份完整的HTML5期末作业往往需要综合运用HTML5语义化标签、CSS3布局与动画、JavaScript交互设计等技术。从页面骨架搭建到公共模块复用从Flex/Grid响应式布局到轮播图、表单验证等交互实现每个环节都体现着工程化思维与代码组织能力。以厦门旅游网为例的14页面项目完整展示了如何将旅游类网站的视觉表现力与功能逻辑相结合在满足作业要求的同时提升作品的专业度与答辩说服力。本文围绕网页制作全流程拆解技术选型、常见布局坑点及答辩高频问题为学习者提供可落地的实践参考。 期末周、课程设计、实训项目……每年这个时候都有一大波同学被“网页制作成品”这几个字折磨得头大。如果你正好刷到这篇十有八九是在找一份拿得出手、能直接交差又不会被老师一眼看穿是模板的HTML5期末作业。今天这篇就结合“厦门旅游网”这个14页面的完整项目把从页面规划、技术选型到具体实现的整个流程摊开来讲包括代码怎么组织、CSS3和JS的高级特性怎么用、以及最后答辩时老师最爱问的几个问题怎么应对。这份项目我前前后后带过好几届学生落地整体难度适中既能体现H5CSS3JS三大块的功底做出来的视觉效果又足够唬人拿来当期末作业或者课程设计都非常合适。1. 项目从哪下手先把14个页面的骨架定下来1.1 为什么选“旅游类网站”当期末作业做网页设计期末作业选题基本决定了一半的分数。论坛、个人主页、电商首页这些题材要么交互太简单要么页面结构太过套路化老师看多了容易审美疲劳。旅游类网站是我个人非常推荐的选题方向原因有三个第一旅游类网站的视觉表现空间极大风景图、渐变色、卡片式布局都有天然的发挥余地最能直观体现CSS3功底第二页面类型丰富既要有展示型的首页也要有列表页、详情页、表单页方便你凑够“14个页面”这种硬性数量要求第三交互场景天然存在——轮播图、Tab切换、回到顶部、搜索筛选、表单验证JS的活儿全都能安排上不用硬凹需求。厦门旅游网这个主题在旅游类里属于“稳妥牌”。作为热门旅游城市厦门在视觉上有鼓浪屿、环岛路、沙坡尾这些高辨识度的地标图片素材一搜一大把版权上也很少踩雷尽量用Unsplash、Pexels这类免费图库。内容上既可以说景点、说美食、说住宿也能延展出攻略、游记、留言板这些互动型页面14页的填充难度大大降低。1.2 14个页面到底怎么分配才合理有些同学一听到“14个页面”就开始焦虑以为要把14个页面全做成完全不同布局的大型页面。实际上14个页面完全可以按照“首页 频道页 内容页 功能页 辅助页”的逻辑来分层规划很多页面之间只需要复用公共模块工作量没有想象中大。我这份项目最终定下来的页面结构是首页index.html、景点列表页、景点详情页、美食列表页、美食详情页、住宿列表页、住宿详情页、旅游攻略列表页、旅游攻略详情页、游记分享页、留言板、关于我们、登录页、注册页正好是14个页面。列表页和详情页之间是重复的卡片结构约等于一套模板换数据登录页和注册页共用一套表单样式关于我们和留言板的侧边栏布局完全一致只换主体内容。这样算下来真正需要从零开始设计的页面其实只有首页、列表页、详情页、功能页、辅助页这五种模板每个模板再做两到三个变体就够了。1.3 公共模块先行导航栏、页脚、侧边栏网页开发里有一条很朴素的道理先搭公共模块再做具体页面。因为导航栏、页脚这些东西你在14个页面里要用14遍如果每一页都重新写一遍不仅效率低而且稍有不慎就是导航栏宽度对不齐、链接地址写错这种低级问题。这套项目里导航栏我建议做成“通栏深色 半透明吸顶 下拉子菜单”的组合。半透明吸顶是CSS3的一个典型应用点用position: sticky或者position: fixed都能实现配合backdrop-filter: blur()做出毛玻璃效果视觉上非常加分。导航结构上可以规划为“首页、景点、美食、住宿、攻略、游记、留言板”七个一级栏目其中“景点、美食、住宿、攻略”四个栏目都可以加下拉菜单把二级页面塞进去这样页面之间的跳转关系就从“平铺”变成了“树状”网站的层级感一下就出来了。页脚的话三栏布局是标准做法左侧放网站的简介和logo中间放快速链接关于我们、联系邮箱等右侧放备案信息或版权声明。页脚这块还有一个容易被忽略的点——要在页脚上方加一条浅色的分割线或者利用背景色差进行区分让整页的视觉结束感更清晰。2. 核心技术点拆解HTML5CSS3JS分别该把功夫下在哪里2.1 HTML5不要只把div当万能工具现在很多同学写HTML还是“一div到底”这对期末作业的评分来说是非常吃亏的。HTML5新增了header、nav、main、section、article、aside、footer这一批语义化标签它们不仅能替代div让代码结构一目了然更能让你的作业从“写出来了”跃升到“写得专业”。以首页为例正确的结构应该是这样组织的网页最上方是header区域里面嵌套nav放主导航主体内容放进main按内容区块拆成若干个section比如“热门景点”“当地美食”“精品住宿”“游玩攻略”每个section用article来装具体的景点卡片右侧有推荐的用aside包起来最底部才是footer。这种写法一旦被老师看到印象分直接拉高一个档次。另外一个常被忽略的H5标签是figure和figcaption用来包裹图文组合比如景点卡片里的图片加说明文字语义上比div p正宗得多。另外表单是HTML5作业的另一个考点。登录页和注册页里input的type一定要用对邮箱用typeemail密码用typepassword需要勾选的同意条款用typecheckbox。加上required必填属性和placeholder提示文字浏览器端的基础验证就有了这段代码能直接证明你掌握了HTML5的表单新特性。2.2 CSS3用Flex和Grid把页面结构搭稳CSS3是期末作业拿分的核心因为它直接决定作品的“颜值”。我建议技术点这样分配布局方式上主用Flexbox辅以Grid。Flex是解决一维布局的比如导航栏左右分布、卡片内图片和文字竖排、按钮居中等用display: flex加justify-content和align-items就能搞定比float好用十倍不止。Grid适合二维布局比如景点列表页的三列九宫格用display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;一句话就能让卡片均匀排布段间距整齐得像用尺子量过而且响应式也比float方案好做。圆角与阴影也是CSS3的重点。景点卡片的border-radius: 12px、按钮的box-shadow: 0 4px 12px rgba(0,0,0,0.1)这类细节能让整个页面瞬间摆脱“学生作业感”。用得好的阴影是悬浮提升层次感用不好的阴影就是一层发灰的模糊块这里我的经验是阴影参数里透明度不要超过0.15模糊半径控制在10到20像素之间扩撒半径最好设置为0效果最自然。动画与过渡效果是拉开差距的地方。建议在卡片上做hover上浮效果transform: translateY(-6px)transition: all 0.3s ease在按钮上做背景渐变动画在 banner 的字幕上用比较克制的text-shadow做呼吸效果。CSS3的keyframes动画可以做一个页面加载时的淡入效果但不要满屏乱飞——期末作业不是电竞官网动画是为了辅助浏览体验而不是炫技做太多反而显得廉价。2.3 JavaScript不抄插件也能做出够用的交互说实话期末作业阶段的JS用不到太深的东西但如果你连JS都没写老师很可能觉得你在“逃避”前端三件套里的核心一环。不用慌也不需要去抄什么复杂的插件原生JS做到这几个交互就够用了轮播图也叫图片幻灯片是旅游网站的标配功能。实现原理无非是把图片排成一行放在一个容器里通过切换transform: translateX()的值来左右移动再配合定时器实现自动播放点击左右按钮手动切换。最简版大概40行代码就能搞定建议不要用display: none切图——那种实现太“原始”懂行的老师一眼就能看出来。Tab切换用在首页“热门景点/当地美食/精品住宿”这种板块上或者攻略列表页的筛选排序功能里。原理是给每个Tab绑定点击事件切换时给当前Tab加active类同时控制对应内容区块的显隐。回到顶部按钮这个虽然简单但非常显眼是个性价比极高的加分项。监听window.onscroll当滚动距离超过页面一屏时显示按钮点击后使用requestAnimationFrame或setInterval让页面平滑滚动到顶部而不是直接用location.href #这种老掉牙的方式。表单验证注册页最好加上。用JS判断密码长度是否大于6位、两次输入的密码是否一致、邮箱格式是否匹配。这既是JS应用点也是网页交互严谨性的体现。我当时做的时候还加了一个用户名长度判断输入少于2位就弹红色提示且禁止提交这下JS的“存在感”直接拉满。懒加载也可以安排上用在景点详情页的长图列表上。先给img的>:root { --primary-color: #1a9c8c; --secondary-color: #f5c451; --text-main: #333333; --text-light: #666666; --bg-page: #f8f8f8; --card-shadow: 0 4px 15px rgba(0, 0, 0, 0.08); }后面写页面的时候直接color: var(--primary-color)调用既规范又方便统一调整页面多了之后你会感谢这个决定。3. 实操全过程从零搭出厦门旅游网的完整流程3.1 初始化目录结构和共用文件在动手写页面之前先把目录结构规划好。合理的目录是既能让你开发时手不忙脚乱也能在答辩时让老师觉得你工程素养不错。我建议这样组织xiamen-travel/ ├── index.html ├── css/ │ ├── common.css │ ├── index.css │ ├── list.css │ ├── detail.css │ ├── form.css │ └── about.css ├── js/ │ ├── common.js │ ├── slider.js │ ├── tab.js │ ├── backtotop.js │ └── validate.js ├── images/ │ ├── banner/ │ ├── spots/ │ ├── food/ │ └── hotel/ └── pages/ ├── spots.html ├── spot-detail.html ├── foods.html ├── food-detail.html ├── hotels.html ├── hotel-detail.html ├── guides.html ├── guide-detail.html ├── travel-notes.html ├── message.html ├── about.html ├── login.html └── register.htmlcommon.css里放所有页面通用的样式——清浮动、链接默认样式重置、导航栏、页脚、返回顶部按钮、通用卡片样式。每个页面通过自己的CSS文件覆盖独有的样式。JS文件同理common.js里放回到顶部、下拉菜单这类公共交互功能型的代码拆分成独立的文件是为了让每个函数的职责清晰答辩时老师问起来你能讲明白“哪个文件干什么”。记得在pages目录下的HTML里引用CSS时路径要写成../css/common.css这是新手最容易翻车的地方。3.2 首页开发的具体实现步骤首页是整份作业的门面也是工作量最大的页面。我按区块拆解步骤Banner轮播图是最先动的区块。我在index.html里放了三个div.slide每个里面是一张背景图加一个居中的标题和副标题然后通过CSS把.slider-container设置成display: flexoverflow: hidden。slider.js里定义一个let currentIndex 0每隔3秒让currentIndex加1然后操作container.style.transform translateX(- currentIndex * 100 %)当索引等于幻灯片数量时直接归零实现无缝循环效果。景点推荐板块我用Grid排了一个三列卡片布局。每一张卡片由图片、标题、简介、一个“查看详情”的文字链接组成。卡片默认状态是普通的白色背景加阴影hover时上浮并展示一个半透明的遮罩层这个遮罩层用CSS3的position: absoluteopacity过渡来实现。登录注册入口放在导航栏右侧是整站功能性的体现。做了两个按钮登录按钮是白底淡色边框注册按钮是主色渐变底白色文字。这两个按钮直接链接到pages/login.html和pages/register.html保证14个页面的跳转关系是闭环的这是老师检查“页面完整性”时的必看内容。3.3 列表页与详情页的通用模板操作列表页的核心工作是“复用”。写spots.html时我直接把首页的“热门景点”卡片区块复制过来把6张卡片扩充成9到12张再在顶部加一个筛选排序栏比如“按热度 / 按评分 / 按价格”。这三个排序按钮不需要真正的后台数据排序用JS的数组排序就能模拟把卡片对应的标题、评分这些数据存在一个数组里点击按钮时对数组进行排序然后用document.querySelectorAll操作DOM的顺序这也是JS数组方法的实战运用。详情页的布局我建议做成“左侧内容 右侧侧边栏”。左侧放图片大图、文字介绍、行程安排这类正文右侧侧边栏放“热门景点推荐”“相关美食”“联系我们”等模块。左右用Flex布局左侧flex: 2右侧flex: 1。右侧的“热门推荐”一般是4到5个小卡片点击能跳到对应的详情页。这样详情页的跳转关系又多了好几层网站的整体连通性也变得更好。3.4 登录注册页与表单样式登录和注册页的HTML结构很简单一个居中的卡片容器里放一个form里面是label、input、button。漂亮的关键在于CSS细节——输入框聚焦时的表现是老师会认真看的地方我用input:focus设置了border-color: var(--primary-color)和box-shadow: 0 0 0 3px rgba(26, 156, 140, 0.15)这个光晕效果既现代又不会太突兀是很多优秀UI的常用手法。注册页的JS验证我做了四个检查项function validateForm() { var username document.getElementById(username).value.trim(); var password document.getElementById(password).value; var confirmPwd document.getElementById(confirmPwd).value; var email document.getElementById(email).value.trim(); if (username.length 2) { alert(用户名不能少于2个字符); return false; } if (password.length 6) { alert(密码长度不能少于6位); return false; } if (password ! confirmPwd) { alert(两次输入的密码不一致); return false; } var emailReg /^\w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)*$/; if (!emailReg.test(email)) { alert(请输入正确的邮箱格式); return false; } return true; }这是我实测过的经典写法零依赖、逻辑清晰、答辩时就能直接说“这里用了正则表达式校验邮箱格式”一句话就暴露不了你的真实水平。3.5 留言板和关于我们页的布局套路留言板页面是一个典型的“表单 展示列表”页面。上面是一个textarea留言框和“提交留言”按钮下面是已经留言内容的列表纯静态假数据。你可以在JS里加一个小功能点击提交按钮后把textarea里输入的内容动态插入到留言列表的顶部。这个操作配合数组的unshift方法和DOM的insertBefore或者innerHTML拼接都能实现逻辑也不复杂。这个小交互在答辩现场的演示效果特别好因为它是全站少有的“点击后能看到真实变化”的功能。关于我们页面建议做一个“网站简介 团队/站点数据 联系我们”的结构配上地图截图或者几张厦门风光图。这个页面不需要什么交互但必须在SEO和结构上做清楚——语义化标签、标题层级、alt属性这些细节都可以在这里集中展示。最好再加一段CSS3的linear-gradient背景渐变把关于页做得有设计感一些。4. 常见问题与排查技巧实录4.1 三个让人崩溃的CSS布局坑做网页期末作业时我见过最多的同学翻车在这三个地方坑一导航栏和banner之间出现一条白色缝隙。原因是浏览器默认的body有margin: 8px在页面顶部总会留下一圈白边。解法是写一个全局reset* { margin: 0; padding: 0; box-sizing: border-box; }把三件套全部清零所有间距从零开始自己控制。box-sizing: border-box一定要加否则你在Flex或Grid里设置宽度时会莫名其妙地多算border和padding的尺寸。坑二flex容器里的子元素宽度压缩变形。Flex布局下子元素默认可以收缩如果你的图片或卡片被挤扁了多半是没加flex-shrink: 0或者在图片上没写死width和height。经验之谈凡是希望保持固定尺寸的元素直接加flex: 0 0 auto或者width/height别给它自由发挥的空间。坑三下拉菜单的定位飘了。下拉子菜单的容器要设置position: relative子菜单用position: absolute定位到父容器下方。很多同学写完发现子菜单跑到了页面的右下角就是因为父容器没设relative子菜单的absolute就跑去定位到最近的定位祖先或者是浏览器视口了。这个知识点是面试必考的前端基础题期末答辩老师也可能会点。4.2 JS报错的经典现场新手写原生JS时最容易遇到的报错是TypeError: Cannot read property addEventListener of null意思是你想给一个不存在的DOM元素绑定事件。排除思路就两步一是确认JavaScript代码是否放在了HTML末尾/body之前确保DOM已经加载完毕二是检查ID名是否拼写一致有时候getElementById(slide)写成了getElementById(slider)这种错误看半天都发现不了。另一个经典问题是轮播图在最后一页切换回第一页时视觉跳变。原因是translateX从最后一页宽度瞬间回到0%中间没有过渡动画。处理思路是做一个“假第一张”放在最后当切换到假第一张后关掉过渡动画瞬间跳回真的第一张。或者更简单的方式用setInterval每次移动一格到最后一张时直接重置并关闭过渡。我在代码里采用了后者虽说不算最优雅但在应付期末作业这个层面已经完全够用了。4.3 不同浏览器兼容性检查前端期末作业最大的隐性要求是“能在不同浏览器里跑起来”。虽然现在的Chrome、Edge、Firefox对HTML5和CSS3的支持已经很好了但仍有几个需要注意的兼容点backdrop-filter: blur()在某些老版本浏览器上不支持如果你用了毛玻璃效果最好同时准备一个纯色半透明背景兜底position: sticky在一些老内核浏览器上不生效可以用position: fixed做降级方案CSSgap属性在老版本Safari上也有兼容问题实在不放心就用margin或padding代替。我在项目里提前用supports语法做了优雅降级浏览器支持backdrop-filter就用毛玻璃不支持就显示半透明背景。这属于进阶代码但在老师那里非常加分。举个实际写法.nav-bar { background: rgba(255, 255, 255, 0.8); } supports (backdrop-filter: blur(10px)) { .nav-bar { background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(10px); } }4.4 期末答辩时老师最爱问的几个问题答辩环节老师可能会盯着项目问几个“追踪式”问题提前准备好答案效果比临场发挥好得多。“你这个网站的导航吸顶效果是怎么实现的” 回答核心是position: sticky; top: 0;加z-index: 99并解释一下sticky和fixed的区别sticky不会脱离文档流而fixed会。“你的轮播图为什么能自动播放” 回答用setInterval定时器每次让索引加1再通过操作transform属性来移动滑轨容器。“你的CSS为什么要拆成这么多文件” 回答按公共样式和页面样式拆分方便复用和维护同时减少单个文件的冗余。“你的表单验证是前端做还是后端做” 真实答案是前端验证只是用户体验的一部分真正的安全保障必须靠后端。答完这句老师基本就不会再往深的问了因为你已经体现了现代Web开发的全局意识。5. 我踩过的坑与最后几点建议这份厦门旅游网项目从最早只有五六个页面的半成品到后来补全为14个页面的完整作品中间踩过最深刻的坑是“图片不压缩”。那时候图片全都是手机原相机拍出来的大体积照片直接往HTML里一放打开页面要转圈好几秒整体体验非常糟糕。后来又花时间用工具把图片压缩了一遍分辨率控制在1920px以内体积压到200KB以下页面打开速度才恢复正常。这个经历特别想分享给所有用图片堆视觉的同学图片能不能快速加载是老师点击网站后的第一感受如果首页在5秒内都加载不完后面做得再好都很难弥补这个第一印象。还有一件事就是尽量让本地开发环境和最终交付环境保持一致。有些同学平时用http://协议打开本地文件有些直接双击HTML文件导致某些JS功能特别是fetch调本地JSON在双击打开时直接报跨域错。我的建议是尽量在项目的根目录直接打开HTML文件测试所有资源都通过相对路径引用别写以/开头的绝对路径避免发布后路径全部失效。再一个就是把所有页面的标题写清楚——每个HTML的title标签都要改成“厦门景点介绍 - 厦门旅游网”这种格式而不是14个页面全都叫“无标题文档”这个细节虽然不是功能性问题但老师抽查时看到了就会觉得你做事认真。最后再说一个不用花太多时间但很显专业感的小点给详情页的正文图片加一段CSS3的过渡动画鼠标悬浮在图片上时轻微放大用transition: transform 0.4s ease就能做到。这种小粒度交互在期末答辩演示时很讨喜因为它是那种“不看代码就感觉很高级、看了代码才发现其实很简单”的体验你说它难不难不难但别人没有这就是你的辨识度。整份作业的核心逻辑其实就是“把每个基础技术点用到合适的场景里再把每个场景做到风格统一”做到这两点成绩自然差不了。本文还有配套的精品资源点击获取