要是让我给刚接触前端的同学推荐一个必须吃透的知识点我大概率会选HTML常用标签。这东西看起来简单无非是些尖括号和英文单词但实际写起页面来你会发现里面藏着不少门道。我见过太多人把div从头用到尾也见过不少项目里满屏的font和center看得人头皮发麻。这篇文章不打算搞成什么“XX个标签大全”式的字典而是想把我这些年实际写页面、改页面、带新人过程中沉淀下来的经验按“怎么用、为什么这么用、容易踩什么坑”的思路捋一遍。不管你是在补基础还是想系统梳理一遍这篇文章应该都能给你一些参考。先放个底HTML全称是HyperText Markup Language超文本标记语言。它不是编程语言而是负责给网页内容“排兵布阵”的结构语言。浏览器拿到HTML之后会按照标签的语义把文字、图片、表格、表单等内容渲染成你看到的页面。所以HTML标签学得好不好直接决定了你写出来的页面是“草稿”还是“作品”。1. 整体设计思路先把标签家族谱理顺1.1 为什么要给HTML标签分类我刚开始学HTML的时候也走过弯路。那时候看到什么标签就记什么结果记了一堆生僻的、废弃的标签真正写页面时反而卡壳。后来我才意识到HTML标签不是用来“背”的而是用来“选”的——你面对一个内容能快速判断用哪个标签最合适这就是掌握好了。给标签分类的核心思路是从页面结构出发。一个页面拆开来看无非就这几块文档信息告诉浏览器“我是谁”、内容结构标题、段落、列表、表格、交互入口链接、表单、媒体资源图片、音频、视频、功能区域头部、导航、主体、底部。你按这个维度去梳理会发现原本散乱的标签突然就串成了一条线。另一种更符合实际开发的分类法是按“文本级”和“块级”区分。文本级标签比如span、a、strong它们在一行里排列用来修饰句子中的局部内容块级标签比如div、p、h1它们独占一行用来搭建页面的大块结构。这个区分直接影响你对CSS布局的理解所以建议一开始就建立这个意识。我建议你手里始终放一份“常用标签清单”不是让你死记而是让你在写页面时有个参照。当你写多了之后这个清单会自动长在你脑子里。下面这张表是我在实际项目中出场率最高的标签按功能分类列出来你可以照着这个框架去理解后面展开的每个小节。分类代表性标签核心职责文档结构!DOCTYPE html、html、head、body定义页面类型和整体骨架元信息meta、title、link给浏览器和搜索引擎提供页面说明文本内容h1~h6、p、span、strong、em组织页面中的文字层级与样式链接与导航a、nav实现页面跳转和站内导航列表ul、ol、li、dl展示并列、顺序、定义型内容表格table、tr、td、th、colspan展示二维结构化数据表单form、input、textarea、select、button收集用户输入并提交到后端媒体img、audio、video嵌入图片、音频、视频资源语义化布局header、footer、main、section、article让页面结构有明确含义利于SEO和可访问性1.2 现阶段最实用的分类方法我自己的经验是把标签分成“结构标签、文本标签、表单标签、媒体标签、语义化标签”这五类最实用后面讲解也按这个顺序走。结构标签就四个html、head、body加上!DOCTYPE html声明。别小看这四个很多页面出问题根子就在它们身上。文本标签是日常写页面用得最多的包括标题h1到h6、段落p、链接a、强调strong和em、代码展示pre和code。这些标签使用频率高但恰恰因为太常用很多人反而没细想过它们的正确用法。比如strong和b的区别是什么pre和普通div到底差在哪这些问题如果不搞清楚写出来的页面会“看起来能用细看全是毛病”。表单标签是前后端交互的核心。form、input、textarea、select、button这组标签直接决定了用户能不能顺利把数据交给你。我在带新人时发现表单是出错率最高的区域——name属性不写导致后端收不到数据、type用错导致手机上弹出数字键盘还是全键盘、label没绑定导致点击区域太小……这些问题都特别典型。媒体标签和语义化标签是实现“图片显示正常、页面结构清晰”的关键。img的alt、loading、srcsetheader、nav、main这些标签怎么用我会在对应小节展开。理清这个框架之后就进入正题了。1.3 一个页面从零到一的骨架长什么样先看一个最基础的HTML文档结构。你需要记清楚每一个部分是在做什么因为这几乎是每次新建页面都要重复写的东西。!DOCTYPE html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title页面标题/title /head body !-- 页面可见内容写在这里 -- /body /html这段代码几乎是我写任何页面的起点。!DOCTYPE html声明文档类型告诉浏览器按标准模式解析html是根标签langzh-cn告诉浏览器页面主语言是中文head里放的是页面的“配置信息”body里才是用户能看到的正文内容。后面每一节的细节都是在这段骨架上填充。2. 文档骨架每个页面都离不开的那几行2.1 DOCTYPE 与 html 根标签为什么第一行不能省很多人写页面喜欢偷懒第一行直接写html把!DOCTYPE html省了。我刚开始也这么干过直到后来在老旧项目里看到一个诡异问题页面所有样式都正常唯独宽度始终比预期宽一截怎么调都不对。最后查下来罪魁祸首就是缺了DOCTYPE声明浏览器自动切到了Quirks Mode怪异模式盒模型计算方式跟标准模式完全不同。从那以后我再也没省过这一行。!DOCTYPE html是HTML5的标准声明它本身不是标签而是给浏览器看的一个“协议说明”。它的作用很简单让浏览器以最标准的方式渲染页面避免做那些为了兼容老网页而保留的怪异行为。你可以理解成烧菜之前先跟智能灶确认“我要用标准火力模式”而不是让灶默认去模拟二十年前的老灶台。html标签是页面的根元素所有其他标签都得放在它里面。lang属性建议不要省它不只是给翻译工具用的还关系到屏幕阅读器发音、浏览器翻译提示和搜索引擎的语言识别。我之前给一个英文网站做开发时页面内容明明是英文lang却漏写了结果谷歌浏览器每隔几天就弹出“是否翻译此页面”体验非常差。写langzh-cn对中文页面来说是标配。2.2 head 里的关键配置meta、title 与 faviconhead区域是与用户“隔着一层纱”的配置中心里面的东西虽然不在页面上直接显示但缺了任何一个都可能出问题。meta charsetutf-8必须放在head最前面。这行是告诉浏览器“用UTF-8编码解析我的文字”。如果你不写浏览器可能会用系统默认编码去解析中文内容就成了乱码。实战中我见过不止一次页面打开全是“锟斤拷”一看charset那行要么没写要么被写成了gb2312而文件保存格式却是UTF-8。记住一个原则文件保存格式、HTML声明的charset、服务器返回的Content-Type响应头这三者要保持一致才不会乱码。meta nameviewport是移动端适配的命门。它的标准写法是contentwidthdevice-width, initial-scale1.0含义是让页面宽度等于设备宽度初始缩放比例为1。不写这行手机打开你的页面时会按桌面的1080px宽度渲染然后整体缩小字体和点击区域都会变得非常小用户必须要双指放大才能看清。这行也是我写每个页面必加的。title是页面标题它有两个作用一是显示在浏览器标签页上二是作为搜索引擎结果页的标题。title写得好不好直接影响SEO点击率。我的经验是标题里放核心关键词字数控制在30字以内别跟写作文似的铺一大段。如果页面需要小图标那就在head里加一行link relicon hreffavicon.ico typeimage/x-icon这个不是必须的但没有它浏览器标签页上就会显示一个默认的地球图标看起来不够专业。用在线工具把一个png转成ico或者直接用svg格式的favicon都可以。2.3 骨架标签的常见坑从“编码混乱”到“title 失效”先说编码混乱。这个问题多半发生在团队协作时有人习惯用GBK有人用UTF-8文件合并之后就乱套了。我踩过的坑是这样的本地用VS Code写得好好的部署到服务器之后中文全部变乱码。查了半天才发现服务器上的nginx配置了charset gb2312强制覆盖了HTML里的charsetutf-8。所以说编码问题不只是HTML自己的事服务器响应头也可能插手。再一个坑是title放在body里面。严格按规范title只能出现在head中但有些新手因为顺手把它写到了body里浏览器虽然宽容地显示出来了但有些规范和SEO工具不会识别结果是标签页能看到标题搜索引擎却抓不到。这种问题在代码审查时很容易漏掉因为它们不影响肉眼可见的效果影响的是搜索引擎排名和页面可访问性。还有一个容易被忽视的坑meta标签的name和http-equiv互混。比如有人写meta namerefresh content30其实正确的做法是meta http-equivrefresh content30。前者是无效的不会产生任何自动刷新效果。这类描述页面行为的行为表单属性里的http-equiv才是正主。3. 文本类标签写着写着就会用错的那几个3.1 标题与段落不只是“字大一点”h1到h6是标题标签从大到小一共六级。很多新手觉得它们就是“调节字号用的”这个理解需要纠正一下。标题标签的核心价值是语义层级不是视觉效果。搜索引擎在理解页面时会优先把h1里的内容当成页面的主题h2当成章节h3当成小节。如果你的页面只用div加CSS去模拟大字号那就等于给搜索引擎看了一篇没有大纲的文章很难判断你写的重点是什么。一个页面建议只保留一个h1用来放页面主标题。h2可以是多个对应各个主要模块。我见过有些页面为了视觉效果一屏里放了五六个h1这在SEO层面是减分项还可能被搜索引擎判定为关键词堆砌。想调字号就交给CSS的font-size别用标题级别硬撑。p是段落标签它是浏览器默认会加上下边距的块级元素。这里有一个我经常提醒新人的点段落之间不要用多个br去撑间距应该用CSS的margin控制。多个br会让代码变得很啰嗦而且屏幕阅读器会把这些换行当成连续空白读出来对无障碍访问很不友好。3.2 链接标签 a新窗口、锚点与伪链接a标签是我眼里“属性最丰富”的文本标签之一。最基础的用法是a hrefhttps://example.com链接文字/a。href是hypertext reference的缩写表示目标地址。这里有几个实际开发中经常用的点。第一打开新窗口。在不加任何额外属性时链接默认在当前标签页打开。想要在新标签页打开需要加target_blank。这里有个细节当你用target_blank时强烈建议同时加上relnoopener noreferrer。原因是新页面可以通过window.opener反向操作你的原页面留下安全风险。noopener可以切断这层关系noreferrer则是不让新页面知道流量来源。第二锚点跳转。a href#section2跳转到第二部分/a搭配页面里div idsection2点击链接就能让页面滚动到指定位置。这个技巧在做“目录导航”“回到顶部”时非常实用。回到顶部的经典写法就是a href#返回顶部/a但直接用#会导致URL后面多一个#并且页面会跳到最顶部体验稍糙。更好的做法是用a href#top配合body idtop或者直接用JavaScript的window.scrollTo。第三伪链接和占位链接。在开发阶段经常需要先放一个“还没做好”的按钮但又不想让它真正跳转可以用hrefjavascript:;或者href#加onclick处理。我个人的习惯是尽量不用javascript:;因为它在某些安全策略下会被拦截而且不利于代码审查。用button标签配合点击事件反而更符合语义——按钮就是按钮链接就是链接。a标签还有一点值得展开download属性可以让浏览器直接下载链接资源而不是打开预览。比如a hreffile.pdf download下载PDF/a这在做文件下载时很方便省掉了后端接口的重定向处理。不过download属性对跨域地址是失效的需要后端配合设置响应头。3.3 pre 与 code展示代码的正确姿势在网页上展示代码是技术类网站绕不开的需求。pre标签的作用是保留空格和换行它会把你写在标签之间的东西原样呈现。很多人写HTML时一个空格一个换行都会被浏览器折叠掉但在pre里不会。code标签是行内元素用来标记“代码片段”配合pre可以实现代码块的效果。一个常见的组合是precodefunction hello() { console.log(Hello World); }/code/pre我踩过的坑是这样的code标签内部如果有或者必须转义成lt;和gt;否则浏览器会当成标签解析。比如你想展示if (a b)这段代码直接写在code里浏览器会把 b)当标签处理导致页面错乱。解决方案是写if (a lt; b)。很多编辑器都有“转义HTML实体”的功能格式化之后再粘贴进来就不会出问题。以前老网站喜欢用xmp标签来展示原样HTML这个标签在HTML5里已经废弃了不要再用了。你可能会在一些老旧教程里看到它遇到时直接忽略优先用precode的组合即可。3.4 别再用的文本旧标签font 与 center 为何被废弃font和center这两个标签在HTML5标准里已经被标注为废弃deprecated。按照规范页面结构和页面表现要分离——结构用HTML负责表现用CSS负责。font colorred这种写法把表现混进了结构里到了后期维护时改一个全局颜色需要翻遍整个项目效率极低。center同理它的作用是让内容居中但现在用text-align: center或flex就能实现还更灵活。我在代码审查时看到最多的是老项目里的历史遗留代码满屏font color#333。改这类代码时如果没有全局替换的把握不建议手动一个一个删容易漏。用编辑器全局搜索加上正则批量处理更稳妥。新写的代码里请坚持零font、零center。4. 列表与表格数据呈现的两大基石4.1 列表标签ul、ol、li 与自定义列表列表在页面里的作用被很多人低估了。导航菜单、文章目录、商品参数、评论区楼层用列表结构来写是最合理的。无序列表ul适合不分先后顺序的内容有序列表ol适合有先后顺序的内容。我在写导航时经常这么处理ul classnav-list lia href/首页/a/li lia href/blog博客/a/li /ul这样写的好处是屏幕阅读器能识别出这是一个包含多个条目的列表读起来更友好搜索引擎也能更清楚地理解导航结构。有些同学喜欢直接用div加a排成一行功能上没问题但语义上丢失了“这是一组项目”的信息。ol的start属性可以指定从几开始编号type属性可以切换罗马数字、字母等编号样式。但日常开发中这些编号样式通常用CSS的list-style-type控制更灵活。dl是自定义列表由dt标题和dd描述组成很适合做“名词解释”类的内容比如商品详情页的参数表。4.2 表格标签table 家族与 colspan 合并表格是HTML里“功能最完整但坑也最多”的模块。标准结构是table→tr行→td单元格表头用th。还有两个容易被热搜词带出问题的属性colspan和rowspan。colspan是“横向合并单元格”的属性td colspan2表示这个单元格横跨两列。对应的rowspan2是“纵向合并”让一个单元格占两行。我记得有个同学做课程表时动态数据怎么都对不齐最后发现是一个colspan少写了1。合并之后表格的总列数是每行td和th的colspan加起来的和每行都要相等否则表格就会“错位”。这个规则听起来很简单但实际写的时候特别容易出现“这行3列那行4列”的情况。表格还有一个隐蔽的坑表格默认宽度是自动的如果单元格内容多可能会被撑开。想要固定布局可以在CSS里设置table-layout: fixed这样表格列宽就会按照第一行或colgroup的设定来分配不会因为内容长度而变形。4.3 表格实战中的对齐与边框问题以前做网页喜欢用表格来布局整个页面现在已经不推荐了因为表格的语义是“数据”用来做布局会导致代码嵌套过深维护困难响应式适配也麻烦。但表格在展示报表、账单、日历、课程表这些结构化数据时仍然是不二之选。实际做表格时有两个高频问题需要处理边框合并。表格的border默认是每条边分开画的单元格之间会有双线。想要细边框用CSS的border-collapse: collapse让相邻边框合并成单线视觉干净很多。单元格对齐。默认情况下td里的文字是垂直居中的但这跟预期不符——通常在财务表格里数字应该右对齐文字左对齐表头居中。千万别在HTML里写一堆aligncenter而是应该用CSS类统一控制style .price-table td { text-align: right; } .price-table th { text-align: center; } /style这样写的好处是后续数据内容变化时样式保持稳定不会因为HTML里残留的align属性导致覆盖顺序混乱。5. 表单标签前后端交互的入口5.1 form 与 input 的基础结构表单是整个HTML里“属性最密集”的地方也是最值得下功夫的一块。form标签是表单容器action属性写提交地址method属性写提交方式。我常跟新人说action和method就像寄快递时填的“收件地址和邮寄方式”——地址不能错方式也不能选错。method主要有两种GET和POST。GET会把表单参数拼在URL后面POST会把参数放在请求体里。搜索框适合用GET因为搜索条件适合分享给别人登录、注册这些涉及数据修改的必须用POST否则密码会明文出现在浏览器历史记录里。input标签是表单里的绝对主力。它的type属性决定控件长什么样name属性是提交给后端的字段名。这里有一个经常踩的坑name不写或者两个输入框用了同一个name导致后端只能收到最后一个值。我排查过不止一次这类问题前端看着一切正常后端收到的数据却缺字段。所以每次写input都要习惯性问自己一句“name写了吗”5.2 常用 input 类型与选择思路input的type类型选择直接决定了移动端的弹窗键盘也决定了浏览器的校验行为。我根据自己的使用频率列了一个常用类型速查type属性适用场景注意事项text单行文本最基础几乎所有场景兜底password密码输入输入内容会被掩码不会明文显示email邮箱手机上弹出的是键盘浏览器会做格式校验number数字手机上弹出数字键盘但别用它做手机号tel电话手机上弹出数字键盘但不会强制校验格式date日期移动端会唤起原生日期选择器checkbox多选同一组选项的name保持一致值为valueradio单选同一组选项的name必须一致否则无法单选file文件上传配合accept控制可选文件类型hidden隐藏字段常用于传用户ID等不显示但需要提交的数据我特别想提醒的是number和tel的区别。有人为了限制用户只能输入数字就用了typenumber结果发现用户在电脑端可以输入e、、-这些字符而且如果输入负数或小数也没反应。对于手机号这类场景用typetel更合适它在手机上弹数字键盘但又不强制你做数值校验配合pattern属性就能限制长度和格式。required属性可以让浏览器在提交时自动检查必填项不通过就阻止提交并给出提示。placeholder是输入框的灰色提示文字。要注意placeholder不能完全替代label它只是提示用户开始输入就消失了不利于无障碍访问。真正的字段说明还是得靠label。5.3 select、textarea 与 label 的配合select是下拉选择框内部用option表示选项。它默认是单选模式加multiple属性可以支持多选但多选下拉的交互体验很差移动端尤其别扭所以我在项目中极少用multiple。需要多选时更推荐用一组checkbox来替代。textarea是多行文本输入框常用于留言、评论、个人简介这类文本较长场景。它的尺寸由rows和cols初始决定但实际布局时通常用CSS的width和height控制。resize属性默认是both用户可以自由拉伸这个输入框但有些产品为了界面美观会设置resize: vertical只允许竖直方向拉伸。label标签是容易被新手忽略的一个。它的作用是把一段文字和一个表单控件关联起来用户点击文字时等同于点击控件本身。关联方式有两种一种是label forusername用户名/label配input idusername另一种是把input直接嵌在label内部label 用户名 input typetext nameusername /label第一种方式更常见因为结构清晰for和id的对应关系一眼就能看清。label还有一个隐藏优点点击区域变大了在移动端尤其好用用户不用精确点到小输入框点到旁边的文字也能聚焦。5.4 表单提交与校验排查表单提交不上是后端联调时最常遇到的一类问题。我总结了一套排查顺序可以帮你少走很多弯路先看button的type。在form里button的默认type是submit会触发表单提交如果按钮的typebutton它只是一个普通按钮不提交数据。很多人把type漏写成button结果点击之后页面一点反应都没有。再核对form的action和method。用浏览器的开发者工具切到Network面板看提交时有没有发出请求请求地址对不对请求方式是GET还是POST。接着确认表单控件的name。如果后端拿不到参数多半是某个name没写或者拼错了。前端报错时只看得到“参数缺失”但具体缺哪个得靠你在浏览器Network里看请求Payload逐项核对。最后检查required约束。如果某个必填项没填浏览器会拦截本次提交并给用户一个气泡提示。但要注意required在typehidden的输入框上不生效隐藏字段没法触发这个约束。我实际遇到过一个特别经典的坑表单里放着一个typesubmit的按钮点击本来应该提交但因为按钮没写type而项目里又引入了一个全局JS去拦截所有button的默认行为结果所有表单都“提交不了”。这类问题排查起来最费时间因为你看到的表象是JS报错实际根子是按钮类型和事件委托的冲突。后来我的经验是在form里写button时永远显式写明typesubmit或typebutton不依赖默认值这样代码自解释性更强也不容易受外部脚本影响。6. 图片与多媒体标签让页面真正“活了”6.1 img 标签的黄金三件套img标签是日常开发中出镜率最高的媒体标签。它的黄金三件套是src、alt、loading。src是图片地址相对路径和绝对路径都支持。alt是图片加载失败时显示的替代文本同时也是屏幕阅读器朗读图片内容的依据。这个属性在SEO和无障碍上都很关键。我见过有些同学嫌麻烦不写alt结果图片挂了以后页面上出现一个破图图标完全不知道原本想放什么。写alt时描述要精准类似“产品主图-红色款”不要堆砌关键词。loadinglazy是懒加载属性可以让页面滚动到图片附近时才加载图片而不是一打开页面就全部加载。首屏图片不要用lazy会影响用户体验但首屏以下的图片建议都加上能明显提升首屏加载速度。这个属性是HTML5原生支持的不需要额外引入JS库很多项目却还在用老掉牙的lazysizes库其实完全没有必要。srcset属性是实现响应式图片的进阶方案可以针对不同屏幕宽度提供不同分辨率的图片img srcsmall.jpg srcsetsmall.jpg 480w, large.jpg 1080w alt示例图片浏览器会根据设备的实际宽度选一张最合适的加载。需要说明的是这个功能的调试有一定门槛因为浏览器会“自作主张”地选图你用开发者工具模拟时可能看不出效果。如果你的项目暂时不需要适配多尺寸图片先忽略srcset也不影响但要认识它等你需要时能想起来。6.2 audio 与 video 的基础用法在页面里嵌入音频和视频audio和video标签是标准方案不需要再依赖Flash了。基础写法非常直接video controls width640 source srcmovie.mp4 typevideo/mp4 /video audio controls source srcmusic.mp3 typeaudio/mpeg /audiocontrols属性会让浏览器显示播放控件没有它就只有一个看不见的播放器。autoplay属性在移动端通常会被浏览器忽略因为用户体验策略不允许自动播放带声音的视频这个要注意别指望靠autoplay实现“打开页面就自动播放”的效果除非你额外处理静音或者等待用户手势。source标签允许你列出多个不同格式的视频源浏览器会按顺序挑第一个能播放的。比如MP4不行就换WebM这是兼容老旧浏览器的一种实用手段。如果你的项目对兼容性要求高建议写上两三个格式。7. 语义化与布局标签现代页面的骨架7.1 div 和 span 的定位div和span是无语义的容器标签一个块级一个行内。它们是“万能兜底”的存在——当一个内容找不到更合适的标签时就用它们。但我不推荐把整个页面全部用div堆出来因为那样等于你给页面的每个模块都没有标注“这是什么”。一顿饭如果用塑料袋装菜确实能装但摆到桌上没有碗没盘子看起来就不太讲究。div就是塑料袋偶尔装东西没问题但全桌都是塑料袋就夸张了。div的典型用途是做“布局分组”把一组相关的内容包起来方便用CSS整体控制。比如div classproduct-card h3商品名称/h3 p商品描述/p /divspan的典型用途是给行内文字加钩子让CSS或JS能单独选中某一段文字。比如p现在特价span classprice99元/span/p通过class控制价格的颜色和字号。span本身不改变页面结构只是给文字留了一个可以操作的“把手”。7.2 语义化标签header、nav、main、section、article语义化标签是HTML5带来的一大进步。它让页面结构从“一堆div套div”进化为“头部是头部、导航是导航、主体是主体”。这套标签不只是好看它能让搜索引擎更好地理解页面结构也能让屏幕阅读器跳转导航时更顺畅。我常用的语义化布局结构header网站头部区域/header nav导航菜单区域/nav main article h2文章标题/h2 p正文内容/p /article section h2评论区/h2 /section /main aside侧边栏/aside footer版权信息、底部链接/footerheader是页眉footer是页脚nav是导航main是主导内容区域。一个页面建议只保留一个main因为它语义上是“页面核心内容”多个main会造成语义混乱。article适合放独立成篇的内容比如博客文章、新闻条目、产品卡片section适合放一个主题相关的分组比如“商品详情”“用户评价”。aside放侧边栏或与主体关系不大的辅助信息。在选标签时我的简单判断规则是如果一段内容离开当前页面单独展示仍有完整意义就用article如果它只是页面里的一个模块划分就用section如果纯粹是样式布局需要包一层就用div。这个规则传递很直接也能让团队代码保持较高的一致性。8. 常见问题与排查技巧实录8.1 高频踩坑问题速查表我把做HTML相关开发时遇到的典型问题整理成一张速查表方便你直接照着排查。现象可能原因解决方案中文显示为乱码charset声明缺失或与文件保存编码不一致统一使用UTF-8检查meta charsetutf-8页面宽度在手机上很大meta nameviewport缺失或写错补上标准viewport写法按钮点击无反应按钮type被写成button而不是submit显式设置按钮的type表单提交后后端收不到参数控件缺少name属性给每个提交控件补上name图片加载后下方多出几像素空白img是行内元素受line-height影响给图片加display: block表格列错位colspan合并后各行列数不一致核算每行列数总和保持一致代码块里显示不出符号未转义HTML实体写lt;替代新页面被旧页面“操控”target_blank没有加relnoopener补上relnoopener noreferrer页面打开自动播放不出声音移动端策略限制带声播放设置静音播放等用户手势后再开声音8.2 几个开发时容易忽略的细节除了上面那张表还有几个细节我每次写页面都会留意。图片下方空白。这是img标签最经典的问题原因是图片默认按行内元素展示底边会和文字的基线baseline对齐而基线下方还有一部分行高空间所以看起来就多了一条缝。解决方法是给图片加display: block或者设置vertical-align: middle。我一般优先用display: block因为它语义上也更符合“图片是一个独立块”的直觉。label 的 for 与 id 匹配。这是表单里最有意思的一个“隐性bug”类型。标签文字写了forname输入框的id却写成了user_name点击标签完全聚焦不到输入框用户只能小心翼翼地点击那个细窄的输入框。开发时也许觉得无所谓但到了移动端这种差距很容易被用户感知。写完后养成习惯扫一眼for和id的位置是否一致。语义化标签并非越多越好。section和article虽然语义好但也不是说整页塞满就一定对。如果语义标签里全是空的、或者只有一个标题反而会让代码累赘。合理的做法是页面骨架用语义化标签局部的小块用div兜底。追求“全部语义化”和“全部div化”都不算成熟方案。响应式页面中的br滥用。有同学为了让文字在特定宽度换行写了一堆br。但换行位置一多代码就很难维护而且不同屏宽下表现不可控。换行逻辑应该由CSS的flex-wrap、text-align和宽度约束控制br只适合在“无论什么屏幕都必须换行”的场景比如诗句或地址里某个特定的断行位置。8.3 代码规范与团队协作建议HTML的代码规范不像JavaScript那么严格但团队项目里还是建议大家形成统一约定。我参与过的项目里比较实用的规范有这几个标签一律小写。HTML标签对大小写不敏感但不代表你可以随意混用。统一小写能让代码风格一致也方便全局搜索。属性值建议统一用双引号特殊情况比如外联框架里用了单引号也尽量保持统一。属性顺序排列。比如class、id、name、type这些属性每个类都按这个顺序写审查时扫一眼就能定位。我自己习惯把class放最前id其次数据属性>const TurndownService require(turndown); const turndownService new TurndownService(); const markdown turndownService.turndown(h1标题/h1p正文/p);这个库对常见的标题、段落、列表、链接、图片等标签都有默认规则还支持自定义规则。比如你想让aside里的内容也转成引用块就可以自定义TurndownService的规则。这种批量转换思路比逐篇手动复制粘贴要省太多时间。9.2 网页实现“返回顶部”的几种方式“HTML一键返回顶部”在热搜词里出现过这也是新手经常问的场景。页面较长时提供一个“返回顶部”的按钮能明显改善浏览体验。最原始的HTML写法是a href#返回顶部/a优点是零依赖缺点是会改变URL多了个#而且没有平滑滚动效果。更现代一点的做法是给按钮绑定JS实现平滑滚动button onclickwindow.scrollTo({top: 0, behavior: smooth})返回顶部/buttonwindow.scrollTo配behavior: smooth是原生支持的平滑滚动方式不需要引入库兼容性也不错。如果你要兼容老浏览器可以退一步用document.documentElement.scrollTop 0。实际做项目时通常是把按钮固定到页面右下角默认隐藏滚动超过一定距离后再显示出来这需要用JS监听scroll事件来做。这段逻辑不复杂自己写也简单不需要为一个按钮专门引一个插件库。9.3 图片点击弹出大图的轻量实现搜“img标签点击跳出图层”的同学其实想要的是一个“点击图片放大预览”的功能。现在主流方案是a标签配合target_blank在新标签页打开原图或者用lightbox库做弹窗预览。如果不想引入重库一个轻量方案是用原生dialog元素配合JS实现dialog idpreviewDialog img idpreviewImg src alt大图预览 /dialog script function showPreview(src) { document.getElementById(previewImg).src src; document.getElementById(previewDialog).showModal(); } /scriptdialog是HTML原生提供的对话框元素不需要任何依赖就能打开一个模态层。在移动端适配时记得给dialog设置合适的宽度和边距否则大图会超出屏幕。如果你想做更复杂的画廊效果再考虑上lightbox类库也来得及。10. 我最后再想多说几句HTML标签的掌握程度并不体现在你背了多少标签名而在于你拿到一个需求能不能选对标签。我见过有的同学写窗口弹出层只用div嵌套也见过一个段落加粗要绕很远用CSS写半天——这些都是基础不牢的表现。把常用标签的语义、属性、坑都过一遍手脚之后再去看框架React、Vue的模板语法你会觉得它们本质上还是在写HTML只是加了些动态绑定和插件机制。我个人在实际开发中的一个体会是HTML的“返工率”极高就是因为前期标签选择不对。比如用一堆div实现了语义本该是table的报表结构后期加响应式样式时发现无从下手。反过来说如果一开始就选对了标签后面不管换框架还是做SEO调整都能轻松很多。如果你正在刷这个标题建议给自己留两个星期的实操时间每天写一个不带任何CSS的小页面只专注用标签搭结构。我试过用商品列表、个人简历、食堂菜单、课程表这四类页面来练手基本能把文本、列表、表格、表单、图片这五大类标签全部覆盖一遍。练完之后你会发现再去看框架模板里的“标签写法”会有一种豁然开朗的感觉因为底层的HTML你已经通了。
