
简介面向网页设计初学者的HTML系列编程示例内容覆盖文档基础结构、文本与段落格式化、超链接、图片、列表、表格、表单、框架以及块级引用等网页开发核心知识点适合零基础入门自学也可作为课堂教学或实验环节的配套练习素材。压缩包内共14个文件主体为12个HTML页面示例另含1张JPG图片和1张BMP图片作为演示素材整体压缩包仅52KB下载与本地打开都非常轻量。目前已有155人学习浏览这些示例从简单页面到完整表单逐步递进每个案例都围绕真实页面编写场景展开直接在浏览器中打开即可查看运行效果。通过逐个仿写、修改测试读者可以直观理解标签如何嵌套、属性如何控制显示以及常见页面模块的搭建思路从而为后续衔接CSS样式、响应式布局等内容打下扎实基础。1. 别人在看 HTML 示例你在看什么这套示例真正能帮你解决的问题你搜「html系列编程示例」这个标题大概率不是想背标签而是想把 html 网页制作这条路走通照着示例能写出能跑、能改、能交给老师或客户的东西而不是复制完连哪句控制哪里都不知道。HTML 不是编程语言所以这类示例真正要解决的问题是把 HTML、CSS 和 JavaScript 三样东西串起来——从一张静态页面到一个能响应点击、输入、滚动的网页作品。这套示例适合三类人刚认识标签但组合不好页面的新手、要交网页制作作业的学生、想把常用页面组件攒成模板库的从业者。接下来的内容按“结构—样式—交互—排错”推进每段代码都给了参数说明和坑点。2. 从骨架到页面HTML 文档结构和常用标签的组合套路你写示例时最容易忽略的不是某个冷门标签而是最前面那几行骨架。很多“页面显示不正常”的问题根本不是 CSS 写错是 HTML 结构不合法浏览器按自己的理解补全了解析结果最后呈现的样子和你预想的两模两样。这一章先把骨架和常用标签的组合套路立住后面所有示例都复用这层基础。2.1 每个示例都要写对的最小骨架doctype、html lang 和 meta charset一个 HTML 示例可以很小但骨架必须完整。初学者最容易图省事从body开始写结果浏览器自动补了一堆标签补出来的结果和你预想的不一样这就为后面的翻车埋了雷。我写任何示例都会先敲一遍完整骨架再往里填内容。最简骨架长这样!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title第一个示例/title /head body !-- 页面内容写在这里 -- /body /html这个骨架不是摆设每一行都有明确职责。!doctype html写在第一行浏览器才会进入标准模式不写或写错浏览器进入怪异模式盒模型的计算、垂直方向的排版都会不同同一套 CSS 在两个模式下显示效果不一样。html langzh-cn声明文档语言是简体中文浏览器翻译、无障碍朗读会依据它选择规则搜索引擎也拿它判断页面内容语言。meta charsetutf-8要放在 head 最前面确保整个文档按 UTF-8 解码中文不会变成乱码。参数说明viewport不是 HTML 标准里必须的但只要你的示例可能被手机打开就要写。widthdevice-width让视口宽度等于设备宽度initial-scale1.0是初始缩放比例不写的话手机浏览器会按一个较宽的默认视口渲染字小得看不清。title元素也别空着浏览器标签页、搜索引擎结果标题都依赖它示例页面里顺手写一个具体标题比“无标题文档”好用得多。2.2 标题、列表、图片和链接示例里最常用的内容标签怎么配合骨架有了页面里装什么最常用的是标题、段落、列表、图片和链接这五类。它们单独看都没难度组合起来的层级关系才是重点header h1在售商品/h1 /header main ul li编号A001/li li上架日期2025-06-01/li /ul img srccover.jpg alt商品封面图 a hrefdetail.html查看详情/a /main这段代码里藏了两个新手常忽略的规则。第一h1在一个页面里只出现一次其余标题按h2到h6的层级往下走不能跳级这和字号无关是文档结构的问题搜索引擎和读屏软件都靠这个层级理解页面重点。第二li里可以继续嵌套标签列表不只是文字它能装图片、链接甚至整个卡片电商里的商品列表绝大多数就是ul li这个结构。img的alt属性不能省。图片加载失败时浏览器显示的是 alt 文字读屏软件朗读的也是 alt 文字它同时承担“加载失败占位”和“无障碍描述”两个职责。a的href也值得多说一句除了指向detail.html这样的相对路径写mailto:helloexample.com就能变成发邮件的入口这是做 html 邮件示例时最原始也最稳定的方案不需要任何后端参与。标签作用使用位置div块级容器本身无语义布局分区span行内容器不换行包裹一小段文字做样式header页头区顶部导航、标题main页面主内容每个页面建议只有一个footer页脚版权、联系方式语义化标签的价值在于让页面结构能被程序理解。div套div不是不行但读屏软件听到的是一堆“图层”听到header、main、footer才能判断区块意义。做示例时养成用语义标签的习惯后面学前端框架会轻松很多。2.3 表单是“交互型示例”的高频主角form、input、label 和 button需要用户输入的场景表单是一定绕不过去的。登录、注册、搜索、留言全是表单。表单示例很容易写错一个细节label 和 input 的绑定。form action/submit methodpost label forusername用户名/label input typetext idusername nameusername required label fornote备注/label textarea idnote namenote rows3/textarea button typesubmit提交/button /form逻辑说明label的for属性要和input的id保持一致点击“用户名”这三个字输入框会获得焦点这是移动端用户体验的关键细节也是新手最容易漏掉的连接。id是页面内的唯一标识name才是表单提交给后端时的字段名二者不要混用。required让空值在浏览器这一层就被拦截不需要等后端返回错误。参数说明input的type可以换成email、password、checkbox不同 type 会启用不同的浏览器校验规则和移动端键盘类型比如typeemail在手机上会调出带 的键盘。textarea的rows3是可见行数内容多了会自动滚动。最需要注意的是button在form里不写type默认就是submit点击后页面会刷新如果你想让按钮在前端做处理必须写成typebutton。这个坑几乎每个写表单示例的人都会踩一次。3. 给示例加上交互CSS 和 JavaScript 在 HTML 示例里各管什么HTML 管结构CSS 管样式JavaScript 管行为。写示例时先想清楚一个问题属于哪一层内容不对改 HTML位置不对改 CSS点击没反应改 JS。很多“玄学 bug”都是因为用错了层比如拿 JS 去改样式拿 CSS 去隐藏不该隐藏的内容越改越乱。3.1 CSS 选择器与盒模型布局计算先过关CSS 有三种写法内联style属性、style标签、外链样式表。示例为了复制方便常用style标签项目里我一般用外链link relstylesheet hrefstyles.css.card { width: 300px; padding: 16px; border: 1px solid #e0e0e0; border-radius: 8px; margin: 0 auto; }逻辑说明默认盒模型下width是内容区的宽度。一个声明width: 300px的元素左右各加16pxpadding 和1pxborder实际占用宽度是 334px。你在页面上看到两个元素没有对齐很多时候不是数学算错是这个“宽度包含关系”没搞清楚。解决方式是给全局加box-sizing: border-box让width直接包含 padding 和 border计算和理解都省事。参数说明border-radius: 8px控制圆角大小想更圆就调大数值。margin: 0 auto是块级元素水平居中的经典写法0是上下外边距auto让左右外边距自动平分前提是元素有确定宽度。CSS 优先级按“来源”和“选择器”两个维度判断内联样式最高id高于classclass高于标签。样式不生效时先看是不是被更高优先级覆盖了再去找拼写错误。现代示例的主力布局是 flex容器加一句display: flex子元素就默认横向排列间距用gap控制比 float 那套直观太多。做多栏卡片、按钮组、导航条flex 都够用。更复杂的 grid 布局示例里用得少先不必深究。3.2 JavaScript 最小事件示例点击、输入和动态改 DOMHTML 和 CSS 都是声明式的JavaScript 才是让页面“动起来”的那一层。最小的事件示例是点击按钮改文字button idcountBtn点击次数0/button script let count 0; const btn document.getElementById(countBtn); btn.addEventListener(click, function () { count 1; btn.textContent 点击次数 count; }); /script逻辑说明addEventListener是绑定事件的标准写法第一个参数是事件名第二个参数是回调函数。点击发生时回调执行count这个变量加 1再用textContent把按钮文字改掉。为什么用textContent而不是innerHTML因为textContent只把内容当纯文本处理不解析 HTML如果内容来自用户输入用innerHTML会引入安全风险甚至被注入一段恶意脚本。这属于血泪经验示例练习时就要养成习惯。script标签放在/body之前的含义脚本执行时前面的 DOM 已经解析完成。如果放在head里执行时getElementById会找不到countBtn返回null后续代码静默失败按钮点击没反应。另一个方案是给script标签加defer属性让脚本等 DOM 解析完再执行两种做法选一种固定下来。3.3 用开发者工具验证示例先看 Elements 再看 Console改了代码没有效果先别急着刷新猜原因。浏览器按 F12 打开开发者工具Elements 面板看当前 DOM 结构Console 面板看报错信息。我排查示例的顺序固定先看 Console 有没有红字有红字先解决红字没红字回 Elements 确认元素是否存在、样式是否命中再看 Network 面板里外部文件是不是 404。网络面板里凡是加载失败的文件都会标红CSS、JS 没有效果先检查这一列。手机模拟在开发者工具左上角的设备图标里切过去能看移动端布局viewport写没写对一眼就能分辨。4. 三个能直接抄的 HTML 示例从静态页面到简单交互前面几章讲的是零件这一章把它们组装起来。三个示例难度递增纯 HTML 加 CSS 的卡片、HTML 加 JS 的待办清单、带滚动控制的返回顶部。每个都能直接复制跑通跑通之后再改参数改完你就知道这个示例的边界在哪。4.1 示例一个人信息卡片纯 HTML CSS!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title个人信息卡片/title style .card { max-width: 320px; margin: 40px auto; padding: 24px; border: 1px solid #eee; border-radius: 12px; text-align: center; } .card h1 { margin: 0 0 8px; } .card a { color: #0366d6; } /style /head body div classcard h1林一/h1 p前端示例整理中/p a hrefmailto:helloexample.com给我发邮件/a /div /body /html代码里的几个参数可以直接调max-width让卡片在大屏幕上不会无限拉宽小屏手机上宽度又不会超过视口比固定width稳定margin: 40px auto里的auto负责水平居中40px控制离顶部距离text-align: center让卡片内部文字居中。想改间距动padding想改圆角动border-radius想改卡片整体宽度动max-width。这个卡片的变体很多把内容换成一张图片和一段表白文字就是网上流传的那类 html 爱心代码的起点可见示例背后的套路是通用的。4.2 示例二待办清单HTML JS 事件!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title待办清单/title /head body h1待办清单/h1 input idtaskInput typetext placeholder输入待办内容 button idaddBtn typebutton添加/button ul idlist/ul script const input document.getElementById(taskInput); const addBtn document.getElementById(addBtn); const list document.getElementById(list); addBtn.addEventListener(click, function () { const text input.value.trim(); if (!text) return; const li document.createElement(li); li.textContent text; list.appendChild(li); input.value ; }); /script /body /html这个示例已经具备“编程”的完整链条定义变量、绑定事件、读取输入、操作 DOM。trim()去掉首尾空格空字符串直接return这是最常见的输入保护createElement创建li节点textContent赋文本appendChild挂到列表末尾。三行代码对应“创建—赋值—挂载”三步任何动态增删 DOM 的场景都是这个套路。参数说明placeholder只是灰色提示文字不是输入框的值提交时读的是value。按钮的typebutton很关键少了它点击会触发表单默认行为页面刷新。想按回车提交可以给input加keydown事件判断event.key Enter时调用同一个添加逻辑做示例练习时把逻辑抽成函数比复制粘贴两遍好维护太多。4.3 示例三带一键返回顶部的滚动控制!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title返回顶部示例/title style #backTop { display: none; position: fixed; right: 24px; bottom: 24px; padding: 8px 14px; border: 1px solid #ddd; border-radius: 6px; background: #fff; cursor: pointer; } /style /head body p styleheight: 1200px;向下滚动看效果/p button idbackTop typebutton返回顶部/button script const backTop document.getElementById(backTop); window.addEventListener(scroll, function () { backTop.style.display window.scrollY 300 ? block : none; }); backTop.addEventListener(click, function () { window.scrollTo({ top: 0, behavior: smooth }); }); /script /body /htmlwindow.scrollY是当前页面滚动的像素距离超过 300 就显示按钮否则隐藏。这就是 html 一键返回顶部算法的核心滚动事件加条件判断。scrollTo的top: 0表示回到文档顶部behavior: smooth启用平滑滚动老浏览器不支持这个参数时会退化成瞬间跳转功能不受影响。参数说明按钮用position: fixed定位参照对象是视口页面滚到哪里按钮都固定在右下角。如果页面底部还有固定工具栏bottom要相应调大否则会被挡住。滚动事件在内容多的页面上触发很频繁生产环境要加节流或passive: true优化示例页无所谓但你需要知道这个边界在哪。5. HTML 示例在浏览器里翻车的 5 个常见问题和排查方法这一章写的是我实际踩过的坑每个都按现象、原因、解决三步拆开。示例代码本身不难难的是出了问题不知道从哪查起。这五条覆盖了绝大多数入门示例的高频故障。5.1 中文乱码页面上全是“锟斤拷”现象页面内容里的中文变成一串看不懂的替换字符英文和数字正常。原因大多数情况是meta charsetutf-8没写或写在了title后面也有情况是编辑器保存时用了 GBK 编码文件本身不是 UTF-8浏览器按 UTF-8 解码自然对不上。解决把meta charsetutf-8放到 head 第一行位置越靠前越安全然后检查编辑器右下角的编码设置统一改成 UTF-8。改完保存刷新页面再看。这个坑的诡异之处在于本地预览可能正常部署到服务器才乱码所以写示例时就固定骨架别给乱码留机会。5.2 样式写了但页面纹丝不动现象CSS 里改了颜色、间距刷新页面没有任何变化。原因最常见的是外部样式表路径写错文件 404其次是选择器拼写错误样式规则没有命中任何元素还有一种是被更高优先级的样式覆盖内联样式压过 classid 压过 class。解决打开开发者工具Elements 面板选中目标元素看右侧 Styles 区命中的规则会列出来被划掉的就是被覆盖的再看 Network 面板里 CSS 文件的加载状态404 就改路径。不要靠肉眼刷新猜浏览器已经把你需要的证据摆在面板里了。5.3 按钮点击没反应而且 Console 没有任何报错现象点击按钮页面无变化Console 一片干净无从下手。原因脚本放在head里执行执行时 DOM 还没解析完getElementById拿到null或者id拼写不一致绑定的元素根本不是你以为的那个回调函数里如果抛错某些浏览器版本下错误信息会丢被静默吞掉。解决脚本放到/body前或加defer属性。排查时在回调第一行写console.log(clicked)刷新后点按钮Console 有输出说明事件绑上了没输出就去查id和脚本位置。先用日志把问题范围缩小再动手改。5.4 form 一提交就刷新刚填的表单内容马上消失现象输入框填了内容点提交按钮页面跳转或刷新刚填的东西全没了。原因button没写type时默认是submit它会触发表单提交行为即使form没有action浏览器也会提交到当前地址表现为页面刷新。解决前端处理的示例里给按钮加typebutton切断默认提交行为如果希望用 JS 统一拦截表单提交就监听submit事件并调用event.preventDefault()。第二种方式适合表单里多个按钮都要走同一个校验逻辑的场景。5.5 外部 JS 没跑Network 面板显示 404现象功能完全没实现控制台报加载失败Network 里文件标红 404。原因相对路径写错了。src./js/app.js是相对当前页面的路径src/js/app.js是相对站点根目录的路径把两者搞混文件就找不到了Windows 和服务器对文件名大小写的敏感度也不同本地能跑部署后文件名大小写对不上就 404。解决右键页面查看源代码点脚本路径看浏览器实际请求的完整地址核对目录层级同时确认文件名大小写。一个稳定习惯是示例项目里把js、css文件夹和html放同级用相对路径引用层级简单才能少出错。6. 把示例系列沉淀成自己的工具箱验证方法与进阶方向示例写得再多散落一地就是废文件。我做完一批示例后会按固定结构整理下次做新页面直接复制底稿而不是翻旧文件到处找。目录结构长这样html-series/ ├── base/ │ ├── skeleton.html │ └── styles.css ├── examples/ │ ├── card/ │ ├── todos/ │ └── backtop/ └── README.mdbase/skeleton.html是带完整骨架和基础样式的底稿新示例从它复制examples下每个示例独立目录html、css、js 尽量分成三份文件别全塞一个文件里README.md记录每个示例解决了什么问题、坑在哪。我每写完一个示例都会顺手写两行“翻车记录”过一个月再回看全是提取物。验证项做法通过标准多浏览器打开Chrome、Edge、Firefox 各开一遍布局和功能一致窄窗口测试拖窄浏览器窗口到手机宽度内容不横向溢出移动模拟F12 设备图标切换点击区域够大、字号可读跳转检查点击所有链接和按钮没有 404行为符合预期进阶方向有两件值得做。第一把语义化补完整alt、label for、header/main/footer这些细节全都做到位页面不仅自己能看懂程序也能看懂这是从“能跑”到“能用”的分界线。第二用 AI 编程提示词生成页面时拿自己的base/skeleton.html当底稿让 AI 在骨架里填内容而不是从零生成一张结构未知的页面生成的页面排错成本会低很多。在这个 AI 编程助手越来越普及的时代骨架、语义和验证清单始终握在自己手里比什么都强。我这些年写 HTML 示例最大的一个习惯就是先把骨架写对再谈样式和脚本。很多花一晚上查不出的“玄学”问题最后都回到第一行代码doctype 没写、charset 位置不对、script 放早了。HTML 是最没门槛的技术也是最容易因为忽略基础而翻车的技术把骨架、事件、验证三件事养成肌肉记忆后面学什么框架都不慌。希望帮到你。本文还有配套的精品资源点击获取