Old-School Front-End / 2026 ・ No.01
古法前端入门
第1讲 网页是怎样显示出来的,以及报销系统的设计图
发布
从本期开始,我们连载 Web 系统的页面开发(前端)。题材是每家公司都有的报销系统。
如今只要对 AI 说一句“帮我做个这样的页面”,不读代码也能做出页面——这是氛围编程(Vibe Coding)的时代。
本连载偏要反其道而行:HTML、CSS、JavaScript,一行一行确认含义,亲手写出来。工具也只用到 Bootstrap 和 jQuery。
所以叫“古法”前端入门。全 15 讲,一直做到上图的页面能真正运转起来。第 1 讲是动手之前的热身。
何谓“古法”:与氛围编程反着来
先来介绍本连载的两位主角。
登场人物
古井新井,这次报销系统的页面就交给你了。
新井交给我吧!跟 AI 说一句“帮我做个报销页面”,一下子就好了。这就是所谓的氛围编程。
古井哦?那生成出来的代码你看得懂吗?合计差了 1 日元,你改哪里?
新井……这个嘛,凭感觉。
古井这就叫“氛围”。这次你要一行一行亲手写,用古法。
新井亲手写?那不是石器时代的做法吗……
古井石器时代说得太夸张了。顶多算是“上个时代”。
氛围编程(Vibe Coding)是 OpenAI 创始成员之一安德烈・卡帕西在 2025 年 2 月起的名字。它指用自然语言请 AI 写代码,对生成的代码不细看,凭“氛围”(Vibe)接受并往下推进的做法。这个词流行到被英国柯林斯词典评为 2025 年度词汇。本博客也在开发指南Vibe Coding 札记中写过它。本连载的“古法”,指的就是它的反面。
| 氛围编程 | 古法(本连载) | |
|---|---|---|
| 谁写代码 | AI(人只负责提要求) | 自己 |
| 代码 | 不细看 | 一行一行确认含义 |
| 做出第一个页面 | 非常快 | 要花些时间 |
| 出问题时 | 再让 AI 改一次(祈祷它能改好) | 能自己找出哪里有问题 |
| 适合 | 原型、用完即弃的工具 | 长期使用的业务系统、检查 AI 写的代码 |
让 AI 写确实快。但本连载仍然坚持亲手写,理由有三。
- AI 写的代码,负责的仍然是人 ── 报销系统处理的是钱。合计差 1 日元、输入校验有漏洞,都得有人读代码才能发现。看不懂的代码,既没法检查,也没法修改
- 基础不会变 ── 不管是 AI 写的,还是用 React、Vue 做的,最终交给浏览器的都是 HTML、CSS 和 JavaScript。打好基础,不管拿到什么代码都能看清里面
- 古法工具至今仍在服役 ── 据调查公司 W3Techs 统计,截至 2026 年 10 月,jQuery 被约 64.5% 的受调查网站使用,Bootstrap 在 CSS 框架中约占 75%。公司内部的业务系统里就更多了
这不是一个否定 AI 的连载。能亲手做出来一次之后,你向 AI 提要求会更到位,也能判断它生成的代码是好是坏。亲手写代码的能力,是用好 AI 的基础。本连载的目标是:“不靠 AI,也能把业务系统的页面完整做出来”。
要做的东西:报销系统
报销,就是员工把垫付的钱(电车费、出差住宿费等)向公司申请,上司审批,财务再把钱还给员工的机制。下图画出了相关人员和申请的流转过程。
谁在推动哪个状态
一份申请带有“状态”,每当有人操作,它就进入下一个状态。如何在页面上表现这个流程,正是业务系统见功力的地方
本连载要实现的功能大致如下。
| 使用者 | 能做的事 |
|---|---|
| 申请人 | 填写申请(可以增加明细行、上传收据),保存草稿,提交,查看自己的申请列表和状态,被退回时修改后重新提交 |
| 审批人 | 查看下属的申请,批准,或写明理由后退回 |
| 财务 | 把已批准的申请标为已报销,按月查看金额图表,打印申请单 |
还有一些必须遵守的规则。和开发指南Playwright 入门与实战里测试过的报销页面一样,比如“合计 3 万日元以上必须附收据”“不能申请未来的日期”“美元明细要换算成日元”等。如何在页面上落实这些规则,第 9 讲会详细讲解。
本连载只做页面这一侧(前端)。代替保存数据的服务器,从第 10 讲开始会使用一个“假装是真服务器”的小服务器(模拟 API)。如果用于正式环境,登录和输入校验也必须在服务器端再做一次(因为页面这一侧的校验,在用户的浏览器里很容易被绕过)。
网页是怎样显示出来的
新井输入 URL,页面“唰”地就出来了。这简直是魔法吧。
古井看起来像魔法,只是因为背后的工序一眨眼就完成了。我们按顺序看一遍。
浏览器里发生的事
- 下单(请求) ── 浏览器向 URL 指向的服务器说“请给我这个页面”
- 送达(响应) ── 服务器返回 HTML。HTML 里写到的 CSS、JavaScript 文件,浏览器也会接着去取
- 解读 ── 读取 HTML,生成页面部件的树(DOM)。读取 CSS,生成外观规则的清单(CSSOM)。两者合并成只包含要显示部件的树(渲染树)
- 摆放(布局) ── 根据屏幕宽度,计算每个部件的位置和大小
- 上色(绘制) ── 把文字和颜色画到屏幕的像素上
这里的关键是 DOM。JavaScript 改变页面时,改写的不是 HTML 文件本身,而是浏览器内部的 DOM。每改写一次,④⑤ 就要重来,所以随意改写会让页面变卡。这一点在第 8 讲还会再提到。
HTML・CSS・JavaScript 的分工
前端的三种语言,用身体来比喻最好懂。
三种语言的分工
百闻不如一见。我们在同一个申请表单上,依次加上这三样。
只有 ① HTML 时,输入框和按钮其实也能用:能打字,也能点按钮。只是外观朴素,合计一直是 0。② 加上 CSS 后,有了业务系统的样子,但它不会帮你计算。计算和点击后的反应,是 JavaScript 的工作。各自加的代码如下(节选)。
<!-- ① HTML:有什么 -->
<p>合计: <output id="total">0</output> 日元</p>
<button type="button" id="send">提交申请</button>
/* ② CSS:看起来怎样 */
button { background: #c0392b; color: #fff; border-radius: 8px; }
// ③ JavaScript:怎么动
document.querySelector('#send').addEventListener('click', () => {
document.querySelector('#toast').hidden = false;
});
现在看不懂也没关系。HTML 在第 2〜3 讲,CSS 在第 4〜6 讲,JavaScript 在第 7〜10 讲,我们会一样一样地学会读写。
基本做法是把三者分开写在不同的文件里(HTML 用 .html,CSS 用 .css,JavaScript 用 .js)。按职责分开后,“只想改外观”“只想改动作”时,只需要动一个地方。
一点点历史
既然叫“古法”,就稍微讲点往事。
前端年表(主要事件)
- 1991 年 ── CERN(欧洲核子研究组织)的蒂姆・伯纳斯-李把 Web 在互联网上向公众公开。第一台 Web 服务器是 info.cern.ch
- 1994〜96 年 ── 哈肯・维姆・莱提出 CSS(1994 年 10 月)。1996 年 12 月 CSS1 成为 W3C 推荐标准,“外观与 HTML 分开写”的理念从此确立
- 1995 年 ── 网景公司的布兰登・艾克在 5 月仅用 10 天做出了 JavaScript 的第一个原型,并于 12 月正式发布
- 2006 年 ── 约翰・雷西格发布 jQuery。它抹平了各浏览器之间五花八门的写法差异,迅速流行开来
- 2011 年 ── Twitter 公司的两位工程师(马克・奥托和雅各布・桑顿)公开了 Bootstrap
- 2021 年 ── Bootstrap 5 不再需要原先必须搭配的 jQuery
- 2026 年 ── 1 月,jQuery 4.0 作为时隔约 10 年的大版本发布(停止支持 IE 10 及更早版本)。10 月,Bootstrap 6 的第一个 Alpha 版也已公开
新井JavaScript 只用 10 天就做出来了?那这个连载也 10 天搞定……
古井10 天做出来的只是原型,之后又改了 30 年。我们这边 15 讲,欲速则不达。
本连载计划使用写作时的稳定版 Bootstrap 5.3 系列和 jQuery 4.0 系列。
页面的设计图
就像盖房子之前要画户型图,做页面之前也要先画设计图。首先是页面清单和页面之间的跳转关系。下面的小字是主要制作该页面的讲次。
报销系统的页面
接着,把最重要的申请表单画得细一点。这种省略颜色和装饰、只画“什么东西放在哪里”的图,叫作线框图。
申请表单的线框图
纸和铅笔就够了。比起好看,更重要的是先确认“有没有漏掉的部件”
画了设计图,很多问题在动手前就能发现。比如“明细超过 10 行时怎么显示?”“收据只能是图片吗?PDF 呢?”“会有人用手机提交申请吗?”。先把这些问题列出来,就能减少返工。
准备工具
需要的工具只有三样,而且都免费。
| 工具 | 用途 | 要点 |
|---|---|---|
| 浏览器 | 显示并检查做好的页面 | 本连载以 Google Chrome 讲解,Edge 也基本相同 |
| 编辑器 | 写代码 | Visual Studio Code(VS Code)。语法高亮和自动补全能帮上大忙 |
| Live Preview | 每次保存都自动刷新页面 | 微软出品的 VS Code 扩展,会在本机启动一个小型 Web 服务器 |
还有一样重要的工具,就是浏览器自带的开发者工具(DevTools)。它相当于页面的“X 光片”,本连载几乎每一讲都会用到。
开发者工具的看点
文件按职责放进不同的文件夹(本讲只做 index.html)。
做出第一个页面
准备好之后,来做第一个页面。一共 5 步。
- 在电脑上新建一个名为 keihi 的文件夹,在 VS Code 里用“打开文件夹”打开它
- 新建 index.html,写入下面的代码并保存(在空文件里输入 ! 再按 Tab 键,模板会一下子出来)
- 安装 Live Preview 扩展,点击编辑器右上角的预览按钮(或用右键菜单)打开预览
- 改一改文字再保存,确认预览会自动跟着变化
- 在浏览器中打开后,按 F12(Mac 按 Cmd + Option + I)打开开发者工具,在 Elements 标签页里找找 h1
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>报销系统</title> </head> <body> <h1>报销系统</h1> <p>这里目前是一块工地。</p> <p>第2讲开始动工。</p> </body> </html>
| 写的内容 | 含义 |
|---|---|
| <!DOCTYPE html> | 声明“这是现代的 HTML”。第 1 行的固定写法 |
| <html lang="zh-CN"> | 包住整个页面的盒子。lang 表示语言,读屏软件和翻译功能会参考它 |
| <head> | 写不显示在屏幕上的“页面信息”的地方 |
| <meta charset="UTF-8"> | 字符编码的种类。没有它,中文有时会变成乱码 |
| <title> | 显示在浏览器标签页上的标题 |
| <body> | 写显示在屏幕上的内容的地方 |
| <h1>・<p> | 大标题和段落 |
现在,我们故意犯个错。删掉 </h1>(标题的结束标签)再保存……
新井哇,全都变成标题了!可是也没报错啊。
古井浏览器很宽容。就算有错,也会默默地“尽量”显示出来。要是依赖这份宽容,以后找原因可就辛苦了。
在开发者工具的 Elements 标签页里一看,就会发现两个段落跑进了 h1 里面。“外观不对劲时,先到 Elements 里确认树的形状”,这是本连载会反复用到的调试第一步。
全 15 讲的路线图
最后来看看接下来的路程。我们坐慢车,一站一站往前走。
古法前端入门 路线图
| 讲 | 主题 | 在报销系统里做的东西 |
|---|---|---|
| 1 | 全貌与准备 | 设计图和第一个页面(本讲) |
| 2 | HTML①:文档的骨架 | 申请列表的骨架(标题、表格、链接) |
| 3 | HTML②:表单 | 申请表单(输入框、选项、上传文件) |
| 4 | CSS①:选择器与盒子 | 用自己写的 CSS 整理列表 |
| 5 | CSS②:布局 | 页头、菜单、正文的排布,以及手机适配 |
| 6 | CSS③:Bootstrap | 用 Bootstrap 重做整个页面 |
| 7 | JavaScript①:语言基础 | 计算合计的函数 |
| 8 | JavaScript②:DOM 与事件 | 增删明细行,自动更新合计 |
| 9 | JavaScript③:输入校验 | “3 万日元以上必须附收据”等规则 |
| 10 | JavaScript④:异步与通信 | 读取列表、提交申请(模拟 API) |
| 11 | 登录与页面切换 | 申请人、审批人、财务看到不同的页面 |
| 12 | 审批流程 | 草稿→审批中→批准/退回→已报销的状态管理 |
| 13 | 统计与打印 | 带图表的仪表盘和打印用申请单 |
| 14 | jQuery | 用 jQuery 重写第 8〜10 讲的处理并比较 |
| 15 | 收尾 | 检查质量、安全与发布,然后走到框架的门口 |
前半段(第 2〜10 讲)逐一掌握三种语言,后半段(第 11〜15 讲)把它们组合起来,完成业务系统该有的功能。之所以在第 14 讲才讲 jQuery,是因为先用原生 JavaScript 亲手写一遍,才能真正体会 jQuery 帮你省了哪些事。
结 — 一页总结与下期预告
- 本连载与让 AI 凭感觉写代码的氛围编程反着来,用 HTML、CSS、JavaScript 加上 Bootstrap、jQuery 亲手写出报销系统,是全 15 讲的“古法”前端入门。亲手写的能力,也是用好 AI 的基础。
- 浏览器按照下单 → 送达 → 解读(DOM 和 CSSOM)→ 布局 → 绘制的顺序显示页面。JavaScript 通过改写 DOM 来改变页面。
- 三者分工是:HTML = 骨架(有什么),CSS = 衣服(看起来怎样),JavaScript = 神经和肌肉(怎么动)。文件也按职责分开。
- 动手之前先画出使用者、流程、规则、页面清单和线框图,可以减少返工。
- 工具是浏览器、VS Code、Live Preview,再加上开发者工具。外观不对劲时,先到 Elements 里看树的形状。
新井下一讲终于要学 HTML 了。工地上要立起柱子了!
古井没错,从申请列表的骨架开始。作业是:把今天的 index.html 弄坏,再把它修好。问 AI 之前,先自己试试。
参考资料
- Shropshire Star (PA) — Collins’ Word of the Year for 2025 revealed
- CERN — Web@30: Web history
- W3C — Cascading Style Sheets, designing for the Web: The CSS saga
- Wirfs-Brock & Eich — JavaScript: The First 20 Years (HOPL IV, 2020)
- jQuery Blog — jQuery 4.0.0
- Bootstrap
- npm — bootstrap
- W3Techs — Usage statistics and market share of jQuery
- W3Techs — Usage statistics of CSS frameworks
- web.dev — Render-tree construction, layout, and paint
- Chrome for Developers — Chrome DevTools
- Visual Studio Code
- GitHub — microsoft/vscode-livepreview (Live Preview)
使用率来自 W3Techs 的统计(jQuery 为 2026 年 10 月 17 日、CSS 框架为 2026 年 10 月 16 日的数据),是在该公司调查对象网站中的占比。版本与发布日期依据 jQuery 官方博客和 npm 的发布记录(Bootstrap 最新稳定版为 5.3.8,6.0.0-alpha.1 于 2026 年 10 月 8 日发布)。JavaScript 的“10 天”出自艾克等人的论文(HOPL IV,2020 年)。页面截图是笔者制作的演示页面,于 2026 年 10 月 17 日用云端的 Chromium(Playwright)拍摄;封面的完成效果图是用 Bootstrap 5.3.8 搭建的样板。登场人物均为虚构。
古法前端入门 第1讲 — 网页是怎样显示出来的,以及报销系统的设计图 / 2026.10