Old-School Front-End / 2026 ・ No.01

古法前端入门

第1讲 网页是怎样显示出来的,以及报销系统的设计图

发布

报销系统的完成效果图。深蓝色菜单栏上有“报销系统”“申请列表”“审批”“仪表盘”,右上角是“新井 太郎(申请人)”。申请列表页面上有本月申请 4 笔、待审批金额 32,400 日元、被退回 1 笔三张卡片,按状态筛选的按钮,以及列有申请日期、事由、金额、状态(审批中、已批准、已退回、已报销、草稿)的表格
本连载要做的报销系统的完成效果图(申请列表页面)。这是用 Bootstrap 5.3.8 搭的样板,我们会用 15 讲把它一步步做出来(笔者制作的演示页面,用云端的 Chromium 截图。2026 年 10 月 17 日。浏览器边框是为了说明而后加的)

从本期开始,我们连载 Web 系统的页面开发(前端)。题材是每家公司都有的报销系统。
如今只要对 AI 说一句“帮我做个这样的页面”,不读代码也能做出页面——这是氛围编程(Vibe Coding)的时代。
本连载偏要反其道而行:HTML、CSS、JavaScript,一行一行确认含义,亲手写出来。工具也只用到 Bootstrap 和 jQuery。
所以叫“古法”前端入门。全 15 讲,一直做到上图的页面能真正运转起来。第 1 讲是动手之前的热身。

一

何谓“古法”:与氛围编程反着来

先来介绍本连载的两位主角。

登场人物

$ </> ? 古井前辈 经历过 jQuery 鼎盛时代 公司内部系统的守护神 新人 新井太郎 入职第一年的“氛围派”, 以为让 AI 写页面马上就好

古井新井,这次报销系统的页面就交给你了。

新井交给我吧!跟 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%。公司内部的业务系统里就更多了
CORE

这不是一个否定 AI 的连载。能亲手做出来一次之后,你向 AI 提要求会更到位,也能判断它生成的代码是好是坏。亲手写代码的能力,是用好 AI 的基础。本连载的目标是:“不靠 AI,也能把业务系统的页面完整做出来”。

二

要做的东西:报销系统

报销,就是员工把垫付的钱(电车费、出差住宿费等)向公司申请,上司审批,财务再把钱还给员工的机制。下图画出了相关人员和申请的流转过程。

谁在推动哪个状态

草稿 Draft 审批中 等待审批 已批准 等待财务 已报销 结束 申请人(新井) 提交 审批人(科长) 批准 财务 付款 已退回 请修改 退回(审批人) 修改后重新提交 规则示例 ・合计 3 万日元以上必须附收据 ・不能申请未来的日期 ・美元金额换算成日元

一份申请带有“状态”,每当有人操作,它就进入下一个状态。如何在页面上表现这个流程,正是业务系统见功力的地方

本连载要实现的功能大致如下。

使用者能做的事
申请人填写申请(可以增加明细行、上传收据),保存草稿,提交,查看自己的申请列表和状态,被退回时修改后重新提交
审批人查看下属的申请,批准,或写明理由后退回
财务把已批准的申请标为已报销,按月查看金额图表,打印申请单

还有一些必须遵守的规则。和开发指南Playwright 入门与实战里测试过的报销页面一样,比如“合计 3 万日元以上必须附收据”“不能申请未来的日期”“美元明细要换算成日元”等。如何在页面上落实这些规则,第 9 讲会详细讲解。

NOTE

本连载只做页面这一侧(前端)。代替保存数据的服务器,从第 10 讲开始会使用一个“假装是真服务器”的小服务器(模拟 API)。如果用于正式环境,登录和输入校验也必须在服务器端再做一次(因为页面这一侧的校验,在用户的浏览器里很容易被绕过)。

三

网页是怎样显示出来的

新井输入 URL,页面“唰”地就出来了。这简直是魔法吧。

古井看起来像魔法,只是因为背后的工序一眨眼就完成了。我们按顺序看一遍。

浏览器里发生的事

浏览器 你手边的 服务器 存放页面的地方 1 按 URL 下单(Request) 2 返回 HTML・CSS・JS(Response) HTML CSS JavaScript DOM CSSOM 3 渲染树 只含可见部分 布局 位置和大小 绘制 上色 屏幕 终于看见了 4 5 JavaScript 改写 DOM 每改写一次,④⑤ 就要重来。所以繁重的处理会拖慢页面
  1. 下单(请求) ── 浏览器向 URL 指向的服务器说“请给我这个页面”
  2. 送达(响应) ── 服务器返回 HTML。HTML 里写到的 CSS、JavaScript 文件,浏览器也会接着去取
  3. 解读 ── 读取 HTML,生成页面部件的树(DOM)。读取 CSS,生成外观规则的清单(CSSOM)。两者合并成只包含要显示部件的树(渲染树)
  4. 摆放(布局) ── 根据屏幕宽度,计算每个部件的位置和大小
  5. 上色(绘制) ── 把文字和颜色画到屏幕的像素上

这里的关键是 DOM。JavaScript 改变页面时,改写的不是 HTML 文件本身,而是浏览器内部的 DOM。每改写一次,④⑤ 就要重来,所以随意改写会让页面变卡。这一点在第 8 讲还会再提到。

四

HTML・CSS・JavaScript 的分工

前端的三种语言,用身体来比喻最好懂。

三种语言的分工

HTML 骨架 有什么 <h1> <table> <button> CSS 衣服 看起来怎样 color: #c0392b; margin: 16px; JavaScript 神经和肌肉 怎么动 addEventListener textContent = 缺了哪一个,都成不了业务系统

百闻不如一见。我们在同一个申请表单上,依次加上这三样。

把同一个申请表单分三个阶段比较的截图。1 只有 HTML:朴素的默认样式,合计一直是 0。2 加上 CSS:有了深蓝色标题、圆角输入框和红色按钮,但合计还是 0。3 加上 JavaScript:合计变成 3,830,点击提交按钮后显示“已提交!(※其实还没发送到任何地方)”
同一个页面分三步:① 只有 HTML,② 加上 CSS,③ 加上 JavaScript。外观在 ② 发生变化,而合计被算出来、按钮有回应,要到 ③ 才实现(笔者制作的演示页面,用云端的 Chromium 截图。2026 年 10 月 17 日。浏览器边框是为了说明而后加的)

只有 ① 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 讲,我们会一样一样地学会读写。

POINT

基本做法是把三者分开写在不同的文件里(HTML 用 .html,CSS 用 .css,JavaScript 用 .js)。按职责分开后,“只想改外观”“只想改动作”时,只需要动一个地方。

五

一点点历史

既然叫“古法”,就稍微讲点往事。

前端年表(主要事件)

1990 2000 2010 2020 1991 Web 公开 第一个网站是 info.cern.ch 1995 JavaScript 原型只用了 10 天 1994 CSS 被提出 把外观从 HTML 中分离 1996 CSS1 成为推荐标准 W3C 的正式规范 2006 jQuery 抹平浏览器的差异 2011 Bootstrap 由 Twitter 公司公开 2021 Bootstrap 5 不再需要 jQuery 2026 jQuery 4.0 Bootstrap 6 也有了 α 版 ※ 本连载主要讲 2006〜2026 年的“古法工具”,以及至今未变的基础
  • 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 系列。

六

页面的设计图

就像盖房子之前要画户型图,做页面之前也要先画设计图。首先是页面清单和页面之间的跳转关系。下面的小字是主要制作该页面的讲次。

报销系统的页面

登录 第 11 讲 申请列表 第 2・6 讲 申请表单 第 3・8・9 讲 仪表盘 第 13 讲 详情与审批 第 12 讲 打印用申请单 第 13 讲

接着,把最重要的申请表单画得细一点。这种省略颜色和装饰、只画“什么东西放在哪里”的图,叫作线框图。

申请表单的线框图

报销系统 费用申请 事由 日期 内容 金额 收据 10/14 电车费 1,480 — 10/15 会议茶水费 2,350 已上传 + 添加一行 合计 ¥3,830 保存草稿 提交申请 1 2 3 4 5 6 7 1 标题 2 事由 3 明细表(可以加行) 4 添加行的按钮 5 合计(自动计算) 6 上传收据 7 保存草稿・提交

纸和铅笔就够了。比起好看,更重要的是先确认“有没有漏掉的部件”

画了设计图,很多问题在动手前就能发现。比如“明细超过 10 行时怎么显示?”“收据只能是图片吗?PDF 呢?”“会有人用手机提交申请吗?”。先把这些问题列出来,就能减少返工。

七

准备工具

需要的工具只有三样,而且都免费。

工具用途要点
浏览器显示并检查做好的页面本连载以 Google Chrome 讲解,Edge 也基本相同
编辑器写代码Visual Studio Code(VS Code)。语法高亮和自动补全能帮上大忙
Live Preview每次保存都自动刷新页面微软出品的 VS Code 扩展,会在本机启动一个小型 Web 服务器

还有一样重要的工具,就是浏览器自带的开发者工具(DevTools)。它相当于页面的“X 光片”,本连载几乎每一讲都会用到。

开发者工具的看点

费用申请 Elements Console Network Sources <html lang="zh-CN"> <head>…</head> <body> <h1>费用申请</h1> <form>…</form> </body> </html> Elements 查看 HTML 和 CSS 当场改写试试 Console 试运行 JavaScript 查看报错 Network 查看通信内容 (第 10 讲大显身手) 打开方式:F12 或 Ctrl + Shift + I(Windows),Cmd + Option + I(Mac)

文件按职责放进不同的文件夹(本讲只做 index.html)。

keihi/项目文件夹 ├─ index.html入口页面(本讲制作,第 2 讲起变成申请列表) ├─ form.html申请表单(第 3 讲起) ├─ css/style.css外观(第 4 讲起) ├─ js/app.js动作(第 7 讲起) └─ data/临时数据(第 10 讲起)
八

做出第一个页面

准备好之后,来做第一个页面。一共 5 步。

  1. 在电脑上新建一个名为 keihi 的文件夹,在 VS Code 里用“打开文件夹”打开它
  2. 新建 index.html,写入下面的代码并保存(在空文件里输入 ! 再按 Tab 键,模板会一下子出来)
  3. 安装 Live Preview 扩展,点击编辑器右上角的预览按钮(或用右键菜单)打开预览
  4. 改一改文字再保存,确认预览会自动跟着变化
  5. 在浏览器中打开后,按 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>
第一个页面在浏览器中打开的样子。大标题“报销系统”,下面两行“这里目前是一块工地。”“第2讲开始动工。”
第八章做的第一个页面。没有 CSS 也没有 JavaScript,只有 HTML 的朴素模样(笔者制作的演示页面,用云端的 Chromium 截图。2026 年 10 月 17 日。浏览器边框是为了说明而后加的)
写的内容含义
<!DOCTYPE html>声明“这是现代的 HTML”。第 1 行的固定写法
<html lang="zh-CN">包住整个页面的盒子。lang 表示语言,读屏软件和翻译功能会参考它
<head>写不显示在屏幕上的“页面信息”的地方
<meta charset="UTF-8">字符编码的种类。没有它,中文有时会变成乱码
<title>显示在浏览器标签页上的标题
<body>写显示在屏幕上的内容的地方
<h1>・<p>大标题和段落

现在,我们故意犯个错。删掉 </h1>(标题的结束标签)再保存……

忘记写标题结束标签的页面。本该是普通大小的两行文字,也变成了和标题一样的大号粗体
只删掉一个 </h1>,后面的段落就都跑进了标题里,全部变成大号粗体。浏览器不报错,而是默默地“尽量”显示出来(笔者制作的演示页面,用云端的 Chromium 截图。2026 年 10 月 17 日。浏览器边框是为了说明而后加的)

新井哇,全都变成标题了!可是也没报错啊。

古井浏览器很宽容。就算有错,也会默默地“尽量”显示出来。要是依赖这份宽容,以后找原因可就辛苦了。

在开发者工具的 Elements 标签页里一看,就会发现两个段落跑进了 h1 里面。“外观不对劲时,先到 Elements 里确认树的形状”,这是本连载会反复用到的调试第一步。

九

全 15 讲的路线图

最后来看看接下来的路程。我们坐慢车,一站一站往前走。

古法前端入门 路线图

1 准备 2 HTML 骨架 3 表单 4 CSS 基础 5 布局 6 Bootstrap 7 JS 基础 8 DOM 与事件 9 输入校验 10 通信 11 登录 12 审批流程 13 统计与打印 14 jQuery 15 收尾 当前位置 准备 HTML CSS JavaScript 实战 收尾
讲主题在报销系统里做的东西
1全貌与准备设计图和第一个页面(本讲)
2HTML①:文档的骨架申请列表的骨架(标题、表格、链接)
3HTML②:表单申请表单(输入框、选项、上传文件)
4CSS①:选择器与盒子用自己写的 CSS 整理列表
5CSS②:布局页头、菜单、正文的排布,以及手机适配
6CSS③:Bootstrap用 Bootstrap 重做整个页面
7JavaScript①:语言基础计算合计的函数
8JavaScript②:DOM 与事件增删明细行,自动更新合计
9JavaScript③:输入校验“3 万日元以上必须附收据”等规则
10JavaScript④:异步与通信读取列表、提交申请(模拟 API)
11登录与页面切换申请人、审批人、财务看到不同的页面
12审批流程草稿→审批中→批准/退回→已报销的状态管理
13统计与打印带图表的仪表盘和打印用申请单
14jQuery用 jQuery 重写第 8〜10 讲的处理并比较
15收尾检查质量、安全与发布,然后走到框架的门口

前半段(第 2〜10 讲)逐一掌握三种语言,后半段(第 11〜15 讲)把它们组合起来,完成业务系统该有的功能。之所以在第 14 讲才讲 jQuery,是因为先用原生 JavaScript 亲手写一遍,才能真正体会 jQuery 帮你省了哪些事。

结 — 一页总结与下期预告

  1. 本连载与让 AI 凭感觉写代码的氛围编程反着来,用 HTML、CSS、JavaScript 加上 Bootstrap、jQuery 亲手写出报销系统,是全 15 讲的“古法”前端入门。亲手写的能力,也是用好 AI 的基础。
  2. 浏览器按照下单 → 送达 → 解读(DOM 和 CSSOM)→ 布局 → 绘制的顺序显示页面。JavaScript 通过改写 DOM 来改变页面。
  3. 三者分工是:HTML = 骨架(有什么),CSS = 衣服(看起来怎样),JavaScript = 神经和肌肉(怎么动)。文件也按职责分开。
  4. 动手之前先画出使用者、流程、规则、页面清单和线框图,可以减少返工。
  5. 工具是浏览器、VS Code、Live Preview,再加上开发者工具。外观不对劲时,先到 Elements 里看树的形状。

新井下一讲终于要学 HTML 了。工地上要立起柱子了!

古井没错,从申请列表的骨架开始。作业是:把今天的 index.html 弄坏,再把它修好。问 AI 之前,先自己试试。

参考资料

使用率来自 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

← 返回文章列表