HTML5语义化+CSS3响应式+原生JS实现端午节网页
2026/9/15 15:48:14 网站建设 项目流程

简介:这是一份面向高校计算机与数字媒体专业学生的HTML5期末课程设计作业资源,聚焦传统节日文化主题,助力前端初学者系统实践HTML5语义化结构、CSS3响应式布局与JavaScript交互功能。资源包含61个文件,涵盖3个核心HTML页面、8个GIF动效素材、25张PNG节日图示、13个JS脚本(含jQuery插件、轮播、懒加载、Flash兼容等)、3个CSS样式表及配套JSON配置,整体压缩包仅2.13MB,轻量易部署。已有331人学习下载,适合作为Web前端入门项目参考:不仅提供完整可运行的端午节三页网站(首页、详情页、列表页),还内置Lightbox图集、平滑滚动、Flash按钮动画、IE6兼容处理等典型教学案例,目录结构清晰,各模块职责分明,便于理解页面组织逻辑与前后端协同方式。

1. 用 HTML5+CSS3+JavaScript 做端午节主题网页,不是套模板,而是练透结构语义、响应式布局与交互逻辑

很多大学生交 HTML5 期末作业时,直接复制“端午节网页模板”,结果被老师一眼识破:<div class="box1">堆满页面、所有样式写在<style>标签里、JS 事件全靠onclick="alert('粽子')"硬绑——这根本不是 Web 前端开发,只是文本拼接。真正合格的端午节主题网页作业,必须体现三重能力:HTML5 的语义化标签使用是否合理(比如<article>描述龙舟赛报道、<time>标注屈原生卒年)、CSS3 是否完成自适应断点控制(手机/平板/桌面三端可读)、JavaScript 是否实现可验证的用户交互(如点击粽子图标展开习俗说明,且不依赖全局变量或内联脚本)。它面向的是刚学完 DOM 操作但还没接触框架的大二学生,目标不是炫技,而是让代码经得起审查:打开 Chrome DevTools → Elements 面板能看到清晰的嵌套结构,Network 面板确认 CSS/JS 文件独立加载,Console 里无报错且交互响应有明确日志输出。如果你正为“三个页面怎么组织才不像拼凑”“如何让艾草图片随鼠标悬停旋转”“怎样用纯 JS 实现粽子数量增减计数”发愁,这篇就是为你写的实操指南。

2. 用语义化 HTML5 结构搭建端午节三页骨架:首页、习俗页、诗词页

2.1 为什么必须用<header><main><section>而不是一堆<div>

HTML5 新增的语义化标签不是装饰品,而是浏览器、屏幕阅读器和搜索引擎理解页面意图的依据。例如,首页顶部导航栏若写成<div id="nav">,辅助技术无法识别其功能;而<nav>标签会自动被读屏软件标注为“导航区域”。更关键的是,语义化结构直接影响 CSS 选择器效率——用main > section:nth-of-type(2)定位习俗内容区块,比.content-box .item:nth-child(2)更稳定,因为后者一旦改类名就失效。实际作业中,老师常通过检查<body>下一级子元素是否包含<header><main><footer>来判断是否真学过 HTML5 规范。

2.2 三页的 HTML5 结构设计与文件组织

每个页面都以标准 HTML5 文档类型开头,强制启用严格模式,避免 IE 兼容问题:

<!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> <h1>粽叶飘香·端午溯源</h1> <nav> <ul> <li><a href="index.html" aria-current="page">首页</a></li> <li><a href="customs.html">习俗传承</a></li> <li><a href="poems.html">诗韵端午</a></li> </ul> </nav> </header> <main> <section id="hero"> <h2>五月五日午,赠我一枝艾</h2> <p>端午节,又称端阳节、龙舟节,是集拜神祭祖、祈福辟邪、欢庆娱乐为一体的民俗大节。</p> <img src="images/duanwu-hero.jpg" alt="手绘风格龙舟竞渡场景" width="800" height="400"> </section> <section id="introduction"> <h2>节日由来</h2> <article> <h3>纪念屈原</h3> <p>战国时期楚国诗人屈原于农历五月初五投汨罗江自尽……</p> </article> <article> <h3>驱邪避疫</h3> <p>古人认为五月是“毒月”,需挂艾草、佩香囊、饮雄黄酒以祛病防疫。</p> </article> </section> </main> <footer> <p>© 2024 传统文化数字展 · 计算机学院 Web 前端课程作业</p> </footer> <script src="js/index.js"></script> </body> </html>

提示<meta name="viewport">是响应式的基石,缺了它移动端会显示缩放后的桌面版;aria-current="page"让无障碍工具知道当前激活页,比单纯加class="active"更规范;所有<img>必须含alt属性,描述性文字而非“图片1”,这是 WCAG 2.1 AA 级可访问性要求。

2.3 三页内容分工与语义化要点

页面核心语义标签使用重点教师审查关注点
index.html(首页)<header>包含网站标识与主导航;<main>内用<section>划分“导语区”“由来区”;每个<article>独立成块,含<h3>作为子标题是否滥用<div>替代语义标签;<nav>是否包裹全部导航链接;<footer>是否仅含版权信息而非页面底部广告
customs.html(习俗页)<section id="dragon-boat">描述龙舟赛;<figure>+<figcaption>展示粽子制作步骤图;<time datetime="2024-06-10">六月十日</time>标注端午日期<figure>是否正确包裹图片与说明;<time>datetime属性值是否符合 ISO 8601 格式(如2024-06-10);列表是否用<ol>(有序)表示步骤、<ul>(无序)表示习俗类别
poems.html(诗词页)<blockquote>引用《离骚》选段;<cite>标注作者;<aside>放置屈原生平简介;<q>标记诗句中的直接引语<blockquote>是否嵌套<cite><aside>内容是否与主文相关但非必需(如生平简介确属补充信息);<q>是否用于短句引用而非整段

3. 用 CSS3 实现响应式布局与端午主题视觉:从字体渐变到艾草悬停动画

3.1 三行模式 CSS 文件结构:重置、基础、组件

不要把所有样式写进一个style.css。按功能分层管理,既方便调试也体现工程思维:

  • reset.css:用 modern-normalize 重置默认样式,消除浏览器差异(如<button>在 Chrome 和 Firefox 中的 padding 不同);
  • base.css:定义根字体大小、颜色变量、排版基准(line-height: 1.6)、全局过渡效果(transition: all 0.3s ease);
  • components.css:按模块写样式,如header,nav,hero-section,poem-card—— 每个模块用 BEM 命名法,如.customs__boat-image,.poems__author-name

这样组织后,修改导航栏背景色只需改components.css中的.nav规则,不影响其他模块。

3.2 移动端优先的断点设置与媒体查询

min-width断点而非max-width,符合渐进增强逻辑:

/* base.css */ :root { --font-main: "Noto Sans SC", "Microsoft YaHei", sans-serif; --color-primary: #8B4513; /* 棕色,象征粽叶 */ --color-secondary: #228B22; /* 深绿,象征艾草 */ } /* components.css */ .hero-section { padding: 2rem 1rem; text-align: center; } /* 平板断点:768px */ @media (min-width: 768px) { .hero-section { padding: 3rem 2rem; max-width: 800px; margin: 0 auto; } } /* 桌面断点:1024px */ @media (min-width: 1024px) { .hero-section { display: flex; align-items: center; justify-content: space-between; } .hero-section img { width: 40%; height: auto; } }

注意<meta name="viewport">必须存在,否则媒体查询在移动端无效;rem单位基于html { font-size: 16px },确保缩放时文字比例一致;max-width限制内容宽度防止单行过长影响阅读,这是 WCAG 1.4.8 文本行宽要求。

3.3 端午主题 CSS 特效:字体渐变、艾草悬停旋转、粽子计数器

字体渐变标题(替代图片)
.hero-section h2 { background: linear-gradient(90deg, var(--color-primary), var(--color-secondary)); -webkit-background-clip: text; background-clip: text; color: transparent; font-size: 2.5rem; }

逻辑说明:linear-gradient创建棕→绿渐变;background-clip: text将渐变裁剪为文字形状;color: transparent让文字本身透明,只显示背景色。参数说明:90deg表示水平渐变,若改为45deg则斜向渐变;var(--color-primary)复用 CSS 变量,便于统一调整主题色。

艾草图标悬停旋转(CSS 伪类 + transform)
.customs__herb-icon { width: 60px; height: 60px; transition: transform 0.5s ease; } .customs__herb-icon:hover { transform: rotate(360deg) scale(1.1); }

关键点:transition必须写在常态规则中(.customs__herb-icon),而非:hover中,否则首次悬停无动画;scale(1.1)在旋转同时轻微放大,增强反馈感;图标用 SVG 格式(非 PNG),保证任意缩放不失真。

粽子数量增减计数器(纯 CSS 实现)
<div class="counter"> <button class="counter__btn">.counter { display: flex; align-items: center; gap: 0.5rem; } .counter__btn { width: 36px; height: 36px; border: 2px solid var(--color-primary); background: white; cursor: pointer; font-size: 1.2rem; transition: all 0.2s; } .counter__btn:hover { background: var(--color-primary); color: white; }

注意:此为 UI 结构,实际计数逻辑由 JS 实现(见第4章),CSS 只负责视觉反馈。按钮border使用var(--color-primary)保持主题色统一;gap替代margin控制间距,更符合 Flexbox 规范。

4. 用原生 JavaScript 实现可验证交互:粽子计数、诗词切换、表单提交

4.1 粽子计数器:DOM 操作 + 事件委托

不要给每个按钮单独绑定事件,用事件委托提升性能:

// js/index.js document.addEventListener('DOMContentLoaded', () => { const countElement = document.getElementById('zongzi-count'); let count = 0; // 事件委托:监听整个 .counter 容器 document.querySelector('.counter').addEventListener('click', (e) => { if (e.target.classList.contains('counter__btn')) { const action = e.target.dataset.action; if (action === 'increase') { count++; } else if (action === 'decrease' && count > 0) { count--; } countElement.textContent = count; // 添加视觉反馈 countElement.style.animation = 'none'; setTimeout(() => { countElement.style.animation = 'pulse 0.3s'; }, 10); } }); });

逻辑说明:DOMContentLoaded确保 DOM 加载完成再执行;dataset.action获取>// js/poems.js document.addEventListener('DOMContentLoaded', () => { const poemContainer = document.querySelector('.poems__container'); const poemList = [ { title: '《离骚》节选', author: '屈原', content: '路漫漫其修远兮,吾将上下而求索。' }, { title: '《端午》', author: '文秀', content: '节分端午自谁言,万古传闻为屈原。' }, { title: '《乙卯重五诗》', author: '陆游', content: '旧俗方储药,羸躯亦点丹。' } ]; // 从 localStorage 读取上次查看的索引 const lastIndex = localStorage.getItem('lastPoemIndex') || 0; showPoem(poemList[lastIndex]); // 绑定切换按钮 document.querySelectorAll('.poems__nav-btn').forEach((btn, index) => { btn.addEventListener('click', () => { showPoem(poemList[index]); localStorage.setItem('lastPoemIndex', index); }); }); function showPoem(poem) { poemContainer.innerHTML = ` <h2>${poem.title}</h2> <p class="poems__author">—— ${poem.author}</p> <blockquote>${poem.content}</blockquote> `; } });

关键点:localStorage持久化用户偏好,关闭页面再打开仍显示上次诗词;innerHTML直接插入 HTML,比创建多个document.createElement更高效;poems__nav-btn类名确保按钮与 JS 选择器匹配,避免因 ID 变更导致失效。

4.3 表单提交验证:阻止默认行为 + 正则校验

首页的“端午知识小问卷”需真实校验:

<form id="quiz-form" novalidate> <label>您的姓名:<input type="text" name="name" required></label> <label>邮箱:<input type="email" name="email" required></label> <label>您知道端午节吃粽子是为了纪念谁吗? <select name="answer" required> <option value="">请选择</option> <option value="quyuan">屈原</option> <option value="wuze">伍子胥</option> <option value="cao">曹娥</option> </select> </label> <button type="submit">提交答案</button> </form>
// js/index.js(续) document.getElementById('quiz-form').addEventListener('submit', (e) => { e.preventDefault(); // 阻止默认提交 const formData = new FormData(e.target); const name = formData.get('name').trim(); const email = formData.get('email'); const answer = formData.get('answer'); // 姓名至少2字 if (name.length < 2) { alert('姓名至少输入2个汉字'); return; } // 邮箱正则校验(简化版) const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { alert('请输入有效的邮箱地址'); return; } if (!answer) { alert('请选择正确答案'); return; } // 提交成功反馈 document.querySelector('.quiz-result').textContent = `感谢 ${name}!您答对了:${answer === 'quyuan' ? '✓' : '✗'} 屈原`; });

逻辑说明:e.preventDefault()是核心,防止页面跳转;FormData对象自动解析表单字段,比手动getElementById更健壮;emailRegex用正则校验邮箱格式,比type="email"的浏览器默认校验更严格(后者允许a@b这类无效地址);trim()去除姓名首尾空格,避免用户输空格提交。

5. 调试与交付技巧:用 Chrome DevTools 验证语义、用 Lighthouse 测分、用 GitHub Pages 部署

5.1 用 Chrome DevTools 三步验证语义化质量

  1. Elements 面板检查结构:右键页面任意元素 → “检查”,观察<header><nav><main>是否正确包裹对应内容,<img>是否都有alt属性;
  2. Accessibility 面板查可访问性:在 Elements 面板右侧切换到 “Accessibility”,查看aria-current是否被识别,<nav>的 role 是否为navigation
  3. Console 面板运行验证脚本:粘贴以下代码,检查是否所有<article>都含<h3>子标题:
const articles = document.querySelectorAll('article'); articles.forEach((a, i) => { if (!a.querySelector('h3')) { console.warn(`第 ${i+1} 个 article 缺少 h3 标题`); } });

5.2 用 Lighthouse 生成可交付报告

在 Chrome 中打开网页 → F12 → 点击右上角 “⋯” → “More tools” → “Lighthouse” → 勾选 “Performance” “Accessibility” “Best Practices” “SEO” → 点击 “Generate report”。重点关注:

  • Accessibility 分数 ≥ 90:确保所有<img>alt、表单有<label>、颜色对比度达标(用 WebAIM Contrast Checker 验证#8B4513与白色文字对比度为 4.6:1,满足 AA 级);
  • SEO 分数 ≥ 85:确认<title>含关键词“端午节”,<meta name="description">描述准确(如“展示端午节起源、习俗与经典诗词的 HTML5 响应式网页”);
  • Best Practices 分数 ≥ 95:检查是否无内联脚本(所有 JS 外链)、无控制台错误、<link>标签含rel="stylesheet"

5.3 用 GitHub Pages 零配置部署,生成永久链接

  1. 将项目文件夹(含index.html,css/,js/,images/)推送到 GitHub 仓库;
  2. 仓库 Settings → Pages → Source 选 “Deploy from a branch” → Branch 选main→ Folder 选/ (root)→ Save;
  3. 几秒后生成链接如https://yourname.github.io/duanwu/,可直接提交给老师。

提示:GitHub Pages 默认支持 HTML/CSS/JS,无需服务器配置;链接永久有效,即使本地删除项目也不影响访问;在index.html中所有资源路径用相对路径(如css/style.css),避免绝对路径导致线上 404。

document.querySelector('header nav ul li a[href="' + window.location.pathname + '"]')获取当前页导航高亮,再添加classList.add('active'),比写死class="active"更可靠——这才是大学生该交的 HTML5 作业:代码可查、交互可验、部署可链。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询