简介:大学生Web期末作业可参考的完整个人主页设计包,面向网页设计课程学员与需要快速完成静态站点作业的入门开发者。资源包含首页、关于我们、作品展示、新闻动态、视频展示与联系我们共6个功能页面,覆盖个人网站常用信息结构,可借鉴导航栏、图文排版、视频嵌入与表单布局等设计,帮助学习者理解多页面站点如何组织内容与用户交互。压缩包共49个文件,以HTML页面和JPG图片为主,另含SWF动画、FLV视频、JS脚本及DWT模板;视频与脚本用于页面动态效果,DWT模板便于统一全站风格,整体约21MB,可直接用于HTML/CSS/JavaScript课程成果提交或二次学习。包内Templates、Scripts、images、video等目录将页面模板、交互脚本与媒体素材独立存放,便于替换与维护。目前已有2352人学习下载,适合作为期末大作业的参考模板,也可用于拆解页面布局、媒体元素集成、脚本调用等基础实现思路。
1. 期末网页作业设计的本质:它不是“写页面”,是“搭一套可答辩的小项目”
很多人搜“html css网页制作成品”,以为期末作业就是找到一个能打开的网页交上去。实际上老师评估的是“你会做”而不是“你能打开”:页面结构是否清晰,语义化标签有没有用对,CSS是不是照搬的,JavaScript 交互能不能讲出执行顺序。标题里的“web期末作业设计网页”也暗示了这不是一个 html 文件的事,而是要把结构、样式、脚本、资源整合成一套完整的小项目。这篇博文就按“骨架 → 视觉 → 交互 → 验收”的顺序,把一套能复现、能解释、能拿得出手的做法讲清楚,适合想快速产出第一个像样作品的人。
2. 先搭工程骨架:HTML5语义化、文件目录与DOCTYPE的细节
2.1 目录结构:一个能直接放进“web期末作业设计网页”的文件夹约定
期末作业最常见的翻车点不是页面丑,而是所有代码堆在一个 index.html 里,CSS 用<style>塞在 head 中,JS 用<script>写在 body 底部。功能勉强能跑,但答辩时一问“你的工程结构是什么”就卡住。我一般会先按下面这样建目录:
project-root/ ├── index.html ├── about.html ├── css/ │ ├── reset.css │ └── style.css ├── js/ │ ├── main.js │ └── scroll.js ├── images/ │ ├── banner.jpg │ └── logo.png └── assets/ └── font/这个结构的核心是“按类型拆分,按页面命名”。css 里把 reset 和业务样式分开,是因为 reset 负责清浏览器默认边距,style.css 才是你真正写的页面样式,两者混在一起时,调样式、换主题、排查浏览器差异都会很痛苦。js 按功能拆成 main.js 和 scroll.js,是为了在答辩时说清楚“哪个脚本负责哪块交互”。
目录建好后,资源引用也必须是相对路径,不能写C://xxxx这种绝对路径。否则换一台机器展示就直接失效。下面这张表是常见资源的存放位置和引用方式:
| 资源类型 | 存放位置 | 引用方式 | 说明 |
|---|---|---|---|
| 页面样式 | css/style.css | css/style.css | 通过<link>加载 |
| 全站公共脚本 | js/main.js | js/main.js | 通过<script src>加载 |
| 页面配图 | images/ | images/banner.jpg | 图片路径必须用相对路径 |
| 字体文件 | assets/font/ | 在 CSS 里用@font-face声明 | 避免使用未授权字体 |
提示:交作业时不要把整个项目压缩成乱糟糟的一堆文件,应该保留目录结构再打包。很多老师会直接在地址栏输入
file:///...打开,路径乱了马上就能发现。
2.2 页面骨架:DOCTYPE 与 lang="zh-CN" 到底影响什么
好的页面骨架不只是“能显示”而已,它还决定了浏览器用哪种模式解析、中文会不会变乱码、移动端打开是否自动缩放。下面是一个标准入口页模板:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>网页设计期末作业</title> <link rel="stylesheet" href="css/style.css"> </head> <body> <header> <nav id="mainNav"></nav> </header> <main> <h1>这是首页标题</h1> </main> <footer> <p>版权信息</p> </footer> <script src="js/main.js" defer></script> </body> </html><!DOCTYPE html>是让浏览器进入标准模式的关键。没有它,部分浏览器会退回怪异模式(Quirks Mode),盒模型、百分比高度、margin的表现都会古怪到你无法解释。lang="zh-CN"不是摆设,屏幕阅读器依赖它决定用什么语音朗读,也方便搜索引擎理解页面语言。charset="UTF-8"必须放在 head 最前面,一旦浏览器先按系统默认编码解析了一部分中文内容,就可能出现标题乱码,这时再改 meta 已经来不及。
脚本放在 body 末尾,同时加上defer属性。defer的意思是“等 HTML 解析完再执行”,这样即使脚本写在head里也不会阻塞渲染,但为了符合多数人的阅读习惯,我仍然习惯把<script>放在 footer 之后。
2.3 用 HBuilder 或 VS Code 起项目:别在浏览器里直接拖文件
做“web期末作业设计网页”,开发环境越简单越好。HBuilderX 自带内置浏览器,新建 Web 项目会自动生成index.html、css、js目录,适合完全不清楚“怎么把站点跑起来”的同学。VS Code 则需要装 Live Server 插件,装好后右键index.html→ “Open with Live Server”,它会启动一个本地端口并自动刷新,调试 CSS 或 JS 时能省掉无数手动按 F5 的时间。
如果电脑上什么都没装,也可以用 Python 内置的 HTTP 服务:
cd project-root python3 -m http.server 8080然后访问http://localhost:8080。这个命令本质是把这个目录变成一个静态资源服务器,比直接用file://打开更接近真实部署环境,也方便用手机在同一局域网下预览。直接双击 html 文件有两个问题:一是某些浏览器会限制本地脚本和字体加载,二是页面里如果有fetch请求,本地文件协议下会直接报 CORS 错误。
3. HTML+CSS 核心视觉落地:布局、选择器、样式细节
3.1 布局选型:Flex 还是 Grid?期末作业里的选择标准
布局是“html css网页制作成品”里最容易拉开差距的部分。很多同学仍然在用float写导航栏,然后又因为浮动塌陷清不干净加一堆 hack。我现在的原则是:一维排列用 Flexbox,二维排列用 Grid,float只在做文字环绕图片时使用。
页头导航用 Flexbox 是最稳的写法:
.nav { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding: 0 32px; }justify-content控制主轴排列,space-between让两侧元素贴边,中间自动留白;align-items控制交叉轴居中。gap是给子元素之间加间距的最直接方式,不用再给每个li写margin-right。
卡片列表这种二维场景更适合 Grid。比如作品集页面:
.card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 20px; }minmax(240px, 1fr)的意思是每列至少 240px,如果容器够宽就平分剩余空间;auto-fill会让浏览器自动计算列数。这样无论屏幕多窄,卡片都不会挤成一团,也天然具备一定响应式能力。
| 布局方式 | 适合场景 | 期末作业中的使用频率 |
|---|---|---|
| Flexbox | 导航、按钮组、单行卡片 | 最高 |
| Grid | 卡片墙、商品列表、页面骨架 | 高 |
| Float | 文字环绕图片 | 低,除非课程明确要求 |
| 绝对定位 | 角标、浮层、返回顶部按钮 | 中 |
提示:答辩时如果被问“为什么用 Grid”,标准回答是“因为我们需要同时控制行和列,而 Flexbox 更适合只控制单轴”。这是最直接的价值点。
3.2 常用的 CSS 伪类选择器怎么用:从 :hover 到 :not(:last-child)
CSS 选择器决定了你写的样式能命中哪些元素。很多“问题样式”不是属性写错,而是选择器没有选中目标。“css 伪类选择器怎么用”是前端入门最高频的问题之一,这里列几个期末作业立刻能用的写法。
.menu li:not(:last-child) { border-right: 1px solid #eee; }:not(:last-child)表示“除了倒数第一个 li 之外的所有 li”,这比单独给最后一个元素补一个无边框类更简洁。热词里“css 除了倒数二个元素”的做法,可以用:nth-last-child(-n+2)表示选择倒数两组元素。
.card:nth-child(3n+1) { grid-column: span 2; }:nth-child(3n+1)是“每 3 个一组,取每组第 1 个”的意思。这个选择器用来做杂志式错落布局很有效,比如 9 张图片中第 1、4、7 张占两列,其余占一列。参数an+b的写法里,n从 0 开始计数,3n+1得到的是 1、4、7、10。
交互反馈也离不开伪类。比如输入框聚焦时高亮边框:
.search-input { border: 1px solid #ddd; transition: border-color 0.2s ease; } .search-input:focus { border-color: #4f46e5; outline: none; }:focus是比mouseenter更可靠的交互入口,因为键盘 Tab 也能触发。用鼠标点击时它照样生效,又不依赖 JavaScript,页面可用性会明显提升。
3.3 几个低成本但很出效果的小样式:渐变、圆角、鼠标移入事件
期末作品想看起来“像那么回事”,不需要会复杂的视觉设计,只要用对几个现代 CSS 特性。“css 字体渐变”是其中一个,常见做法是背景裁剪到文字上:
.gradient-title { background: linear-gradient(90deg, #4f46e5, #06b6d4); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }关键词是background-clip: text,它让背景只在文字区域内可见;后面的-webkit-text-fill-color: transparent把文字填充色变成透明,背景才透出来。注意,-webkit-前缀仍然是必须保留的,Safari 和旧版 Chrome 不支持无前缀写法。这个技巧不适合大面积正文,只建议用在一级标题或 Logo 上。
“css 优惠券圆切”是另一个容易被问到的点。优惠券两侧那个半圆缺口,不是真正“切掉”,而是用一个和背景同色的圆形遮挡:
.coupon { position: relative; width: 280px; padding: 24px; background: #fff; border-radius: 12px; } .coupon::before, .coupon::after { content: ""; position: absolute; top: 50%; width: 18px; height: 18px; border-radius: 50%; background: #f5f5f5; transform: translateY(-50%); } .coupon::before { left: -9px; } .coupon::after { right: -9px; }这里把伪元素的背景色设成页面背景色#f5f5f5,而不是透明,视觉上就产生了“缺口”。真正的透明缺口需要用mask属性或径向渐变,伪元素方案代码更简单,且兼容性更好。
卡片在鼠标移入时的反馈,也就是热词里的“css 鼠标移入事件”,其实是指:hover配合transition:
.card { transition: transform 0.3s ease, box-shadow 0.3s ease; } .card:hover { transform: translateY(-8px); box-shadow: 0 12px 24px rgba(0, 0, 0, 0.12); }transform负责让卡片上移,box-shadow负责产生浮起阴影。transition里的0.3s ease表示 0.3 秒的缓动动画,太快显得生硬,太慢显得拖沓,0.25s 到 0.35s 是安全范围。这里不需要 JavaScript,因为它是纯展示层面的反馈。
3.4 变量与媒体查询:让样式可维护、可响应
期末作业如果能顺手用上 CSS 变量,评委印象分会高很多。CSS 变量用--变量名定义,用var()读取:
:root { --primary: #4f46e5; --text-main: #333; --gap: 20px; } .nav a { color: var(--primary); }:root相当于<html>,在这里定义全局变量,之后换主题色只需要改一处。媒体查询则决定了页面在手机宽度下的表现:
@media (max-width: 768px) { .nav { flex-direction: column; gap: 12px; } .card-grid { grid-template-columns: 1fr; } }max-width: 768px的意思是“当视口宽度小于等于 768px 时应用里面这些样式”。这部分几乎是现代网页设计的默认要求,哪怕你的页面是给电脑展示的,写上媒体查询也能在老师用笔记本外接投影时避免布局错乱。
4. JS 交互:从“看得见”到“用得了”
4.1 JS 判断字符串是否包含与搜索过滤的实战
JavaScript 在期末作业里最常见的任务之一是搜索过滤。比如你有一个作品集卡片列表,希望用户在搜索框输入文字时,卡片实时筛选。“js判断字符串是否包含”的标准做法是String.prototype.includes():
const cards = document.querySelectorAll(".card"); const searchInput = document.querySelector("#searchInput"); searchInput.addEventListener("input", () => { const keyword = searchInput.value.trim().toLowerCase(); cards.forEach(card => { const title = card.dataset.title.toLowerCase(); if (title.includes(keyword)) { card.style.display = ""; } else { card.style.display = "none"; } }); });trim()去掉用户误输入的首尾空格,toLowerCase()让搜索不区分大小写,否则用户输入HTML就搜不到html。includes(keyword)判断字符串是否包含,包含就返回true。注意,keyword为空字符串时includes("")永远为true,所以输入被清空后所有卡片都会回来,这符合预期。
如果兼容性要求极高,可以用indexOf(keyword) > -1代替includes。两者唯一的区别是indexOf返回位置下标,找不到时返回-1。现在的浏览器基本都支持includes,不用特意做降级。
4.2 鼠标移入事件与导航状态切换
导航高亮是另一个高频需求。很多人第一反应是写 CSS:hover,但:hover只在鼠标悬停时生效,移开后立刻消失。如果你希望某个导航项被点击后保持高亮状态,就需要用 JavaScript 管理一个类名。“鼠标移入事件”的正确事件是mouseenter,而不是mouseover,原因是mouseenter不会在进入子元素时不断冒泡触发。
const navItems = document.querySelectorAll(".nav li"); navItems.forEach(item => { item.addEventListener("mouseenter", function () { navItems.forEach(i => i.classList.remove("active")); this.classList.add("active"); }); });这段代码的意思是:鼠标进入某个li时,先把所有导航项的高亮状态清掉,再给当前项加上active。用classList.add/remove修改样式,不要直接改style.backgroundColor,因为类名是唯一可以同时被 CSS 和 JS 控制的入口,改独立样式属性会让后续维护者抓狂。
如果导航项是数组元素,可以通过e.target.closest("li")做事件委托:
document.querySelector(".nav").addEventListener("mouseover", e => { const li = e.target.closest("li"); if (!li) return; li.parentElement.querySelectorAll("li").forEach(i => i.classList.remove("active")); li.classList.add("active"); });closest("li")会从当前事件目标向上查找最近的 li,如果点到的是<a>,也能正确拿到它所在的 li。
4.3 一键返回顶部算法:从 scrollTo 到缓动
“html一键返回顶部算法”几乎是期末作业必点技能。最简单的方案是直接让页面瞬间回到顶部:
window.scrollTo(0, 0);但这看起来很粗暴。更好的做法是写一个缓动动画,让页面滚动的速度越来越慢,形成“卷回去”的感觉。核心思路是每一帧都滚动到“当前距离顶部的 80%”:
const backTop = document.getElementById("backTop"); window.addEventListener("scroll", () => { backTop.style.display = window.scrollY > 300 ? "block" : "none"; }); backTop.addEventListener("click", () => { const step = () => { const currentY = window.scrollY; const nextY = Math.floor(currentY * 0.75); if (nextY > 0) { window.scrollTo(0, nextY); requestAnimationFrame(step); } else { window.scrollTo(0, 0); } }; requestAnimationFrame(step); });window.scrollY是当前滚动距离顶部的位置。currentY * 0.75每次减少 25%,数值越小滚动越慢,永远不会一下子到 0,所以要加一个nextY > 0的判断,最后直接归零。requestAnimationFrame(step)是浏览器在下一帧渲染前调用 step,正常情况下每秒执行 60 次,比setTimeout定时器更平滑。
其实还有个不用算法实现的方案,写在 CSS 里:
html { scroll-behavior: smooth; }有了这一行,window.scrollTo(0, 0)也会产生平滑滚动。但记住“html 一键返回顶部算法”这个需求,它考核的是理解动画帧和距离递减的过程。答辩时能把这套数学逻辑讲清楚,比单纯说“我用了 window.scrollTo”有价值得多。
5. 提交前检查与常见坑:让“成品网页”可展示、可答辩
5.1 “HTML 文件无法预览”通常是路径或编码问题
期末作品没法打开,十有八九是路径问题。css/style.css表示“当前目录下的 css 文件夹里的 style.css”;../css/style.css才是上一级目录的 css 文件夹。如果你在pages/about.html里引用了css/style.css,浏览器会去pages/css/style.css找,结果自然是 404。
打开浏览器开发者工具,切到 Console 和 Network 面板,看到红色Failed to load resource或404,就能定位是哪个文件找不到。中文乱码则是编码问题,检查charset是否写在 head 里的第一个 meta。如果你用记事本另存过 html 文件,保存时编码选择“带 BOM 的 UTF-8”,否则部分 Windows 机器上会出现首行幽灵字符。
5.2 3D 立方体相册这类花活:preserve-3d 的兼容坑
想给作品加一个“3d立方体相册css”效果,代码本身不复杂,最常踩的坑是父级没有开启三维空间:
.cube { width: 200px; height: 200px; position: relative; transform-style: preserve-3d; animation: cubeRotate 12s linear infinite; } .cube .face { position: absolute; width: 200px; height: 200px; background: rgba(79, 70, 229, 0.7); display: flex; align-items: center; justify-content: center; } .face:nth-child(1) { transform: rotateY(0deg) translateZ(100px); } .face:nth-child(2) { transform: rotateY(90deg) translateZ(100px); }transform-style: preserve-3d是核心,它告诉浏览器子元素的 3D 变换要保留空间位置关系。如果不写,子元素会被强制平铺到父元素的二维平面上,旋转立方体就变成变性图片。translateZ(100px)里的 100px 是立方体边长的一半,边长为 200px 时就该偏移 100px,这是数学决定的,改错参数立方体就会散架。
提示:这种 3D 效果不要放在首屏,因为部分教室投影仪的分辨率和刷新率会让动画掉帧。放在“作品展示”或“更多内容”区,既保住亮点又不会干扰主内容阅读。
5.3 提交前的 5 步检查清单
| 检查项 | 怎么检查 | 常见结果 |
|---|---|---|
| 控制台报错 | F12 打开 Console | Uncaught TypeError、404 |
| 图片加载 | Network 面板看红色条目 | 路径错误、图片体积过大 |
| 中文字体 | 浏览器放大 200% 看是否溢出 | 字体栈没写中文候选字体 |
| 外链可访问 | 检查友情链接、CDN 资源 | 换了网络环境后加载失败 |
| 注释是否完整 | 代码里是否有功能注释 | 答辩时无话可讲 |
还有一个容易被忽略的点:<img>的alt属性一定要写。老师问语义化的时候,alt 是最直观的证据;图片加载失败时,alt 也能让用户知道这里曾经计划放什么。这个属性加不加不影响视觉,但展示时随口讲一句“我给每张图都写了替代文字”,效果比解释十行 CSS 都实用。
本文还有配套的精品资源,点击获取