一张网页表单按结构、字段、校验、提交、反馈五步做完:先把 HTML 的结构和控件写对,再用 CSS 和 JavaScript 去增强。顺序反过来,后面每一步都在给前面打补丁。MDN 把底线写得很清楚,客户端校验只是初步检查,不能当安全措施,服务端必须再校验一遍。
对做英文独立站的人来说,表单是访客第一次主动留下东西的地方:注册、留邮箱、发询盘、下单,都从这一屏开始。页面做得再顺,这一屏填不下去,前面全白费。
- 定位:页面上负责收集用户数据、让用户控制界面的那一块,注册登录、发反馈、买东西都靠它。
- 官方口径:客户端校验只是初步检查,太容易被绕过,服务端必须再校验,客户端传来的数据一律不当可信。
- 做法顺序:先写 HTML 结构,再上 CSS 和 JavaScript,校验优先用原生属性。
- 三个要避开的做法:placeholder 当 label、GET 传密码、只做客户端校验。
这篇讲一张网页表单从结构写到提交、工具怎么挑。站里工具类的稿子都归在其他工具里,想先看看别人的页面整体怎么排,可以翻网页设计欣赏。
本文目录
网页设计表单是什么,为什么不能只当成几个输入框
表单本质是把用户输入配置成一次 HTTP 请求
官方给它的定义落在两件事上:收集数据,让用户控制界面。落到页面上,注册登录、发反馈、买产品,都由它撑着。但只看外观会看偏,它在页面里真正的身份是一次请求的配置面板。
用户在框里填的东西,最后要变成一对对的 name=value,跟着 HTTP 请求发到服务器。MDN 的说法是,网页上的表单就是「把用户输入配置成一次 HTTP 请求」的方便做法。所以写 form 的时候,写的不是几个框的排列,是这条请求长什么样。
这也解释了 action 和 method 为什么这么要紧:一个决定数据往哪去,一个决定以什么方式去。外观可以后面慢慢调,这两处写错,数据就发丢了或者发到了不该去的地方。
它比多数 HTML 元素都难,CSS 和 JavaScript 要一起上
表单元素比多数 HTML 元素复杂,这是官方自己下的判断。复杂在哪:它要求 CSS 和 JavaScript 配合得很紧,才能把体验做顺。同样是输入框,样式要管,键盘要管,出错要管,提交要管,四件事分开做,最后还得拼回一起。
官方把这块拆成四部分:HTML 结构标记、控件样式、数据校验、提交到服务器。这四块正好对应做法上的先后。结构没定型就去调样式,等于在流沙上刷墙。
官方定的底线:客户端校验不能当安全措施
体验这一层,客户端校验是好事。数据在浏览器里就被拦住,用户当场能改,不用等一次往返。但它的作用就到这儿。
再往下一层,官方说得很硬:客户端校验不能当成安全措施,因为它太容易被绕过,恶意用户照样能把坏数据送进服务器。还有一句更重的,永远不要信任客户端传上来的数据,哪怕你的表单在浏览器里校验得好好的,请求本身还是可能被改。
所以服务端那一遍校验不能省,包括安全检查。这条不是建议,是底线。具体到各家表单工具的产品形态,站里那篇表单工具拆解可以对照着看。
网页设计表单怎么做:五步从 HTML 结构做到提交反馈
这五步是踩着前一步走的。结构没写对,后面加多少 CSS 和 JavaScript 都在补结构。

第一步 先把结构搭出来:form、fieldset、legend
动作:整张表单包在 form 里;需要分组的部分用 fieldset 包住,组名写在 legend 里。联系方式和收货地址这种成块的字段,各占一个 fieldset,各部分就有了结构和含义。

理由不是为了整齐。读屏用户进入一个组的时候,会把 legend 里的组名念出来,他就知道接下来这几个框是填什么的。没有 legend,一组复选框在耳朵里就是一串没有名字的选项。
回查:开着读屏用 Tab 键走进一个 fieldset,听组名有没有被念出来。念不出来,多半是 legend 漏了,或者放的位置不对。手头没有本地文件环境,可以直接在 CodePen 或 JSFiddle 这类在线编辑器里改一次看一眼。
第二步 每个控件都要有 label,for 要对上 id
动作:给每个 input、select、textarea 配一个 label,label 的 for 值等于控件的 id 值。id 在一个页面里必须唯一,所以一个控件只能有一个关联的 label,多写的那个是废的。type 不写的时候默认按 text 处理,别指望浏览器自己猜出这是邮箱还是手机号。
理由不是为了好看。每个控件都正确关联 label,键盘用户和读屏用户才能把整张表单走完。鼠标用户也沾光,点 label 就能把焦点送到对应控件上,手机上框太小不好点,点文字更省事。
回查:逐个点 label,看焦点有没有跳过去。点不动的那个,就是 for 和 id 没对上,或者干脆漏写了 label。
视觉这一层在第二步一起做掉:控件边框、按钮、间距、图标,改样式用的软件站里那篇设计软件免费下载里有得挑;按钮和表单的现成图形素材,可以去PSD素材免费网站找。
第三步 校验先用 HTML 原生属性,不够再上 JavaScript
动作:能交给 HTML 的全交出去。必填加 required;长度用 minlength 和 maxlength;数字范围用 min 和 max,配 step 控制步长;格式先用 type,邮箱写 type="email";更细的规则用 pattern 写正则,规定输入必须符合的模式。
理由:HTML 校验比 JavaScript 校验快,代价是可定制性差一些。官方推荐的顺序是先用健壮的 HTML 特性把表单立起来,再按需用 JavaScript 增强体验。反过来先写一大段脚本,改一个字段就要动一次脚本。
回查:故意填错一个,点提交,看浏览器有没有把提交拦下来并且给出报错。报错内容会随错误类型变,必填没填和格式不对,说的话不一样。这一步能过,说明原生属性挂上了。
第四步 提交:action 定发往哪里,method 定怎么发
form 上最要紧的两个属性就是 action 和 method。action 不写,数据会发到包含这张表单的页面地址,也就是当前页;写了,就发到你写的那个地址。
method 常用两种。GET 会把数据以 name=value 的形式拼在网址后面,从问号开始,每对之间用 & 分隔,密码这类东西绝不能走 GET,否则直接显示在地址栏。POST 把数据放在请求体里,网址后面什么都不加。数据量大也优先 POST,因为有些浏览器会限制网址长度,不少服务器也限制它接受的网址长度。
还有一个容易漏的点:页面本身是安全地址,action 却写成了 http 的地址,浏览器每次提交都会弹安全警告,因为数据没有加密。
回查:提交一次,打开开发者工具,选 Network,选 All,点开那条请求,再选 Request(Firefox)或 Payload(Chrome/Edge),看方法对不对,看字段名和值有没有丢。
第五步 反馈:错误提示要说清怎么改
WebAIM 给错误恢复列了三步:先让用户明显知道出错了,而且读屏能读到;再让用户方便地走到要改的那个控件;最后允许他重新提交、重新校验一次。三步少一步,用户就卡在那儿。
文案上的差别很实在。只说「课程编号无效」,用户不知道该填什么;说「课程编号必须是三位数字」,他立刻知道改哪儿。凡是能用具体格式讲清楚的,就别用「无效」「不正确」这种词打发。
回查:把所有必填项留空提交一次,看每条提示是不是都指出了具体怎么改;按提示改完再提交,看能不能正常发出去。只能改一次、第二次就报别的错,说明校验和提示没接上。
做表单要盯住的数字:缺标签这件事有多普遍
WebAIM 每年对 100 万个首页做一次无障碍检测,2026 年这份报告里有几组数,做表单的人应该看一眼。
| 数字 | 含义 | 对做表单的人意味着什么 |
|---|---|---|
| 平均每页 56.1 个无障碍错误 | 100 万个首页共检出 56,114,377 个 | 表单是无障碍错误的高发区,别默认自己这页没问题 |
| 比 2025 年增加 10.1%,2025 年是每页 51 个 | 同一份报告的前后对比 | 问题在变多,不是变少 |
| 95.9% 的首页检出 WCAG 2 失败项,2025 年是 94.8% | 同一份报告 | 绝大多数页面都不过关 |
| 51% 的首页存在表单输入缺标签 | 同一份报告 | 缺 label 不是个别现象 |
| 首页平均 6.9 个表单输入,三年增加 36%,其中 33.1% 没正确标注 | 同一份报告 | 大约每 3 个输入就有 1 个缺标签 |
| input 元素自 2015 年 7 月起在所有浏览器可用 | MDN | 原生控件直接能用,不必先上框架 |
这些数只用来说明缺 label 有多普遍,不是排名,也不是效果承诺。看到 33.1% 那一格,最直接的反应是回头数一遍自己页面上有几个控件没写 label。
表单输入的数量三年涨了 36%,说明页面越来越靠表单收东西,标注却没跟上。收得越多,漏标的概率越高,这就是为什么它值得当成一个固定动作来查,而不是上线前顺手看一眼。
表单设计里要避开的做法,和一套从键盘开始的排查顺序
这几条做法,看见就改
- 只做客户端校验。官方给的理由很直白,客户端校验「太容易被绕过」,服务端那一遍不做,等于把门开着。
- 用 GET 传密码。GET 把数据拼在网址后面,密码会直接出现在地址栏里。
- 用 placeholder 当标签。placeholder 在用户开始输入之后就消失了,回头改错的时候看不到提示,改起来更难。
- 隐藏 label 再补一个重复的 title。隐藏 label、title、aria-label 这三种做法只该挑一种,两种一起用,读屏会把同一件事重复念两遍。
- 用跳转菜单做选择。键盘用户只用方向键浏览选项,就会触发跳转,人被带到别处。该换成标准的 select 配一个按钮,由按钮触发跳转。多选菜单也尽量别用,不是所有浏览器都给它做了顺手的键盘导航。
- 只靠脚本函数或事件处理器提交。脚本不可用的时候表单就发不出去,表单必须在没有客户端脚本的情况下也能提交到服务器。
标签文字和按钮上的字形如果要换,站里那篇创意字体设计可以顺着看下去。

排查顺序:Tab 键、点 label、跑一次 WAVE
第一遍只用 Tab 键走完整张表单。看进得去、出得来,看顺序跟你眼睛看到的一致,看有没有哪个控件被跳过去。有,就说明结构或者 tabindex 出了问题。
第二遍逐个点 label。点一下,焦点跳到对应控件或者把选项激活了,说明标签是程序上关联好的;点不动,就是没关联上。这一遍最快,也最容易抓到东西。
第三遍把页面地址填进 WAVE 在线工具跑一次,它也能装成 Chrome、Firefox、Edge 的扩展,在浏览器里直接看。但 WAVE 只能当辅助,它自己的说明里写着,检测不到错误不代表页面就合格,人工评估还得做。
表单工具怎么选:移动端、无障碍、数据合规、导出集成四个避坑点
用表单生成器搭在线表单,能省掉手写 HTML 的功夫,但选工具时有四件事得自己盯,工具不会替你操心。这里只给自查点。
移动端:不只手指能点,键盘也得能用
一张表单要撑住多种输入方式,鼠标、键盘、手指触摸都算。手机上点得到,不代表桌面上 Tab 得过去,很多人是在笔记本上不开鼠标填完一整张表的。键盘可访问性要一直留意,把只用键盘的人挡在功能外面,等于白做。
无障碍:label、键盘、按钮文字、图片按钮
四条硬要求:每个控件有正确关联的 label;键盘能走到每一个控件;按钮不能是空的,上面必须写字;图片按钮必须有等效的 alt 文字,不然读屏用户只会听到一个「按钮」,不知道点下去会怎样。
还有一条容易被忽略:重置按钮除非确有必要,不要放。它太好误点,用户把填了一半的内容清空,多半就直接走了。
数据合规:只收你真正要用的数据
先问一句这个字段有没有必要。官方举的例子很直接:你真需要知道一个人的性别或者称谓吗。收得越少,后面要保管、要删除、要跟人解释的就越少。具体条款以官方隐私政策和 GDPR、《个人信息保护法》的官方文本为准。
密码和敏感信息一律不走 GET,别让它出现在网址里。网址会被记进浏览器历史,也会进服务器日志,这两处都不是你能控制的。
导出集成:数据要能落到你已经在用的地方
表单收上来的数据,最后要进到你手上的表格、邮箱或者系统里。能不能导出、导成什么格式、能不能接到已有的工具上,各家在官方文档页里会写清楚。选之前先翻那一页,别等上线了才发现导不出来,几十条数据只能一条条复制。
表单页旁边要配图的话,去Pexels免费图库找,别随手抓一张来源不明的图放上去。
用 AI 做网页设计表单,能帮哪几步、人要核什么
AI 在这件事上省的是打字和过一遍清单的功夫,省不掉判断。下面四步可以让它先出草稿。
AI 能接手的四步
- 按字段清单生成 HTML 骨架,包括 form、label 的 for 和 input 的 id 对上,复选框和单选按钮组用 fieldset 加 legend 分组。
- 按字段类型给校验属性组合:邮箱配 type="email",必填加 required,长度用 minlength 和 maxlength。
- 生成一份无障碍检查清单,逐条对着 label 关联、Tab 顺序、错误提示文案看。
- 把错误提示改写成说清怎么改的句子,比如把「无效」改成「必须是 3 位数字」。
三条可以直接复制的提示词
下面三条是本文给的示例,不是官方模板,字段名和业务规则按你自己的改。
- 「按以下字段生成一张网页表单的 HTML:姓名、邮箱、手机号、留言。每个控件都要有 label,label 的 for 对应 input 的 id,必填项加 required,邮箱用 type="email",不要用 placeholder 代替 label。」
- 「检查这段表单 HTML 的无障碍问题:label 是否与控件关联、复选框组是否用了 fieldset 和 legend、按钮是否有文字。逐条列出问题和改法,不要改我的业务字段。」
- 「把这些表单错误提示改写成能告诉用户怎么改的句子,每条不超过 20 字,保留原有字段名。」
必须你自己动手的三件事
第一,在浏览器里只用 Tab 键走一遍,确认能走到每个控件,顺序合乎逻辑。第二,逐个点 label,看它是不是聚焦或激活了对应控件,点不动的那几个就是没关联上。第三,把页面地址填进 WAVE 在线工具跑一次,看它报出的表单标签问题,再决定先改哪几处。
这三件事 AI 替不了。它只能对着代码看,看不到你的焦点落在哪一格,也听不到读屏念出来是什么。生成的骨架也只是草稿,字段留几个、哪个必填、提示语用什么口气,还是你定。
把 MDN 和 WebAIM 那几页的规则整理成一张对照表,这种活可以让猎者出海的AI Agent 先跑一遍,它擅长整理资料和对照官方原文,跑完你照着表核自己页面上的字段。
常见问题
为什么一定要校验表单
为了拿到正确格式的数据,格式错、缺项、存错地方,应用就跑不对。同时这也是在保护用户的数据,保护你自己的服务不被坏数据灌进来。
客户端校验有哪两种
HTML 表单校验和 JavaScript 表单校验。前者靠属性,快,定制性弱一些;后者灵活,写起来费时间。先上前者,不够再补后者。
required 加在单选组里怎么算
同名的单选组里,只要有一个按钮带了 required,整组必须选中一个才算有效。被选中的那个不一定是带 required 属性的那个。
GET 和 POST 有什么区别
GET 把数据拼在网址后面,POST 把数据放在请求体里,网址上不追加内容。密码和大量数据都该走 POST。
服务端和客户端校验各有什么好处
服务端更难被绕过和改动,安全性更高,也不依赖浏览器脚本。客户端能当场校验、当场提示,体验好。两边一起做才够用。
错误提示放在哪里比较好
有三种做法:弹窗提示后把焦点送到出错的控件、把错误集中列在表单顶部、每条错误写在对应字段旁边。各有短板,挑一种做到底,别三种混着上。
表单这一屏的功夫,都在看不见的地方:for 有没有对上 id,服务端有没有再校验一次,提示有没有说清怎么改。这些做到了,好看才有意义。

发表评论