1. 为什么从txt开始写网页是最快的学习路径
很多人学前端,第一反应是去装一堆工具:编辑器、脚手架、构建工具、包管理器,环境还没配好,热情先耗掉一半。我带过不少新人,发现一个规律——越是把起步门槛压到最低的人,越容易坚持下来。而"从txt开始写网页"这个思路,恰恰是把门槛压到了地板上:你电脑里一定有个记事本,不需要装任何东西,就能写出一个能在浏览器里跑起来的页面。
这个专题叫"HTML5基础篇",核心就是讲清楚一件事:网页的本质是什么,以及如何用最朴素的方式把它造出来。HTML5不是什么高深的技术,它是浏览器能读懂的一套标记规则。你写的东西,浏览器负责翻译成看得见的文字、图片、按钮。txt文件里敲进去的字符,只要符合这套规则,改个后缀名,双击就能在浏览器里打开——这个过程本身就是理解前端最直观的入口。
适合谁来参考?三类人最合适。第一类是完全零基础、想试试自己能不能学编程的人,用txt起步不会有任何心理负担;第二类是半路出家、之前靠拖拽工具做页面的人,需要补上"手写代码"这一课,把底层逻辑打通;第三类是做后端或者做设计、想了解前端怎么回事的人,不需要学多深,但得知道一个页面从字符到画面的完整链路。这篇文章我会把HTML5基础里最核心的东西拆开讲,包括文档结构、常用标签、语义化、表单、多媒体,以及那些新手最容易踩的坑。全程用记事本就能跟着做,不需要任何额外软件。
我个人的观点是:工具是放大器,不是入场券。你连HTML标签都没写熟,上来就用重型编辑器,只会被各种提示和报错搞得晕头转向。先用txt把基础打牢,后面换什么工具都是水到渠成的事。
2. 网页的本质与HTML5的角色定位
2.1 一个网页到底是怎么"变"出来的
先把这个最根本的问题讲透。你在浏览器地址栏输入一个网址,按下回车,浏览器做的事情大致是:向服务器要一个文件,拿到文件后从头到尾读一遍,按照文件里写的规则,把内容一块一块画到屏幕上。这个文件,通常就是HTML文件。它本身是纯文本,跟你用记事本写的日记没有本质区别,区别只在于它用了浏览器认识的"暗号"。
这些暗号就是标签。比如你写<h1>你好</h1>,浏览器看到<h1>就知道"这是一个大标题",于是用大号加粗的字显示"你好"。你写<p>这是一段话</p>,浏览器就知道这是一段正文,会单独占一行。标签的作用就是给内容贴上"身份标签",告诉浏览器这块内容是什么、该怎么展示。
所以网页的本质可以概括成一句话:用标签描述内容结构,浏览器负责渲染呈现。你负责"说清楚这是什么",浏览器负责"决定长什么样"。这个分工非常重要,后面讲语义化的时候还会反复提到。
2.2 HTML5相比老版本到底新在哪
HTML5是HTML的第五个大版本。很多人以为它是个全新的东西,其实它更像是一次"大补丁",把过去十几年网页开发中大家一直在用的、但没写进标准的东西,正式收编了。具体来说,它主要带来这几块变化:
- 语义化标签:以前满屏都是
<div>,谁也看不出哪块是导航、哪块是页脚。HTML5新增了<header>、<nav>、<main>、<article>、<section>、<footer>这些标签,让结构一眼就能看懂。 - 原生多媒体:以前网页放视频要靠第三方插件,HTML5直接给了
<video>和<audio>标签,浏览器自己就能播。 - 更强的表单:新增了
email、date、number、range等输入类型,还有placeholder、required这些属性,很多校验浏览器直接帮你做了。 - 本地存储与画布:
localStorage、sessionStorage让浏览器能存数据,<canvas>让网页能画图、做动画。
对新手来说,最该先掌握的是语义化标签和表单增强这两块,因为它们直接影响你写的页面"规不规范"。多媒体和存储可以后面再深入。
2.3 为什么建议用txt而不是直接上编辑器
这里我要专门解释一下这个选择背后的逻辑,因为很多人会觉得"用记事本写代码"很土。其实不是土,是刻意为之。
第一,记事本没有任何自动补全和语法高亮。你写<h1>就得老老实实敲完整,写</h1>也得自己补上闭合标签。这个过程会强迫你记住标签的写法,形成肌肉记忆。用重型编辑器,你敲个<h它就自动补全了,你根本没记住完整标签长什么样。
第二,记事本不会帮你纠错。标签写错了、属性拼错了,它一声不吭。你只能靠浏览器打开后"效果不对"来反推问题。这个"自己找错"的过程,恰恰是培养调试能力的关键。我见过太多依赖编辑器提示的人,一旦提示失效就完全懵了。
第三,记事本让你聚焦在"内容"本身。没有花哨的界面,没有侧边栏,没有插件弹窗,你面对的只有一片空白和光标。这种纯粹感,对建立"我在写内容"的认知很有帮助。
提示:用记事本保存文件时,编码一定要选UTF-8,否则中文会变成乱码。这是新手第一个大坑,后面会详细讲怎么处理。
当然,等你把基础标签写熟了,该换编辑器还是要换的,那是效率问题。但起步阶段,txt就是最好的老师。
3. 从零手写第一个HTML5页面
3.1 文档骨架:每个页面都必须有的结构
打开记事本,先别急着写内容,把骨架搭起来。一个标准的HTML5页面骨架长这样:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>我的第一个网页</title> </head> <body> 这里写页面内容 </body> </html>逐行拆解一下,每一行都有它的道理,不是随便写的。
<!DOCTYPE html>放在第一行,作用是告诉浏览器"这是一个HTML5文档,请用HTML5的标准来解析我"。如果不写这一行,浏览器可能会进入"怪异模式",用老标准渲染,导致各种奇怪的显示问题。这行不是标签,是声明,所以没有闭合。
<html lang="zh-CN">是整个文档的根标签,所有内容都包在里面。lang="zh-CN"声明这个页面的主要语言是简体中文,这对搜索引擎、屏幕阅读器、浏览器翻译功能都有帮助。别小看这个属性,它属于"写了不亏、不写吃亏"的典型。
<head>里放的是"给浏览器看的信息",不直接显示在页面上。<meta charset="UTF-8">声明字符编码,这是中文不乱码的关键。<meta name="viewport" ...>是移动端适配的核心,没有它,手机打开网页会按桌面宽度缩放,字小得看不清。<title>是显示在浏览器标签页上的标题,也是收藏网页时的默认名称。
<body>里放的才是"给用户看的内容"。你后面写的所有文字、图片、按钮,都放在这里。
3.2 保存与打开:后缀名和编码两个关键点
骨架写完了,接下来是保存。这一步有两个坑,几乎每个新手都会踩。
第一个坑是后缀名。记事本默认保存成.txt,你得手动改成.html。具体操作是:点"文件"→"另存为",在文件名那一栏输入index.html,注意保存类型要选"所有文件",否则记事本会偷偷给你加上.txt,变成index.html.txt,双击打开还是记事本,不是浏览器。
第二个坑是编码。另存为对话框底部有个"编码"下拉框,一定要选UTF-8。如果选了默认的ANSI,你写的中文在浏览器里就会变成一堆问号或者方块。这个问题的根源是:ANSI在不同系统下对应的编码不一样,而UTF-8是通用的。你已经在<meta charset="UTF-8">里声明了用UTF-8,文件本身也必须用UTF-8保存,两边要一致。
保存好之后,找到那个.html文件,双击,它就会用默认浏览器打开。如果打开后显示的是代码本身而不是渲染后的页面,说明后缀名还是没改对,回去检查。
注意:如果你改了文件内容,浏览器不会自动刷新,得手动按F5或者Ctrl+R刷新页面才能看到最新效果。这个习惯要早点养成。
3.3 用最少的标签做出一个完整页面
现在往<body>里填内容,做一个最简单的个人介绍页。代码如下:
<body> <h1>你好,我是一个前端新手</h1> <p>这是我用记事本写出来的第一个网页,没有用任何编辑器。</p> <h2>我在学什么</h2> <ul> <li>HTML5基础标签</li> <li>页面结构搭建</li> <li>表单与多媒体</li> </ul> <p>我的目标是:<strong>能独立手写一个完整的静态页面</strong>。</p> </body>这里用到了<h1>、<p>、<h2>、<ul>、<li>、<strong>六个标签。<h1>是一级标题,一个页面通常只用一个,代表最重要的标题。<h2>是二级标题,可以有多个。<ul>是无序列表,<li>是列表项,它们必须成对出现,<li>要包在<ul>里面。<strong>表示重要内容,浏览器默认加粗显示。
保存、刷新,你就能看到一个有标题、有段落、有列表的页面了。虽然丑,但结构是完整的。这就是从txt到网页的完整闭环——你写的每一个字符,浏览器都忠实地翻译成了画面。
4. 常用标签的分类与实战用法
4.1 文本类标签:把内容组织清楚
文本是网页的主体,文本类标签用得好不好,直接决定页面的可读性。除了前面用的<h1>到<h6>、<p>、<strong>,还有几个必须掌握。
<em>表示强调,浏览器默认显示为斜体。它和<strong>的区别在于:<strong>是"重要性"强调,<em>是"语气"强调。比如"我必须今天完成"用<strong>,"我真的很想去"用<em>。虽然视觉上一个粗一个斜,但语义不同,屏幕阅读器读出来的语气也不一样。
<br>是换行,<hr>是水平分割线。这两个是"空标签",没有闭合标签,直接写就行。但要注意,<br>只用于文本内部的强制换行,比如诗歌、地址,不要用它来制造段落间距,段落间距应该用<p>或者CSS的margin来控制。
<span>是个通用行内容器,本身没有任何默认样式,纯粹用来给一小段文字"套个壳",方便后面用CSS单独控制。比如你想把某几个字变红,就可以用<span>包起来再加样式。
<blockquote>表示引用块,浏览器默认会缩进显示。<code>表示代码片段,默认等宽字体。这两个在写技术文章时特别有用。
我个人的经验是:新手最容易犯的错是滥用<br>和<div>。看到要换行就<br>,看到要分块就<div>,结果代码里全是这两个标签,结构一塌糊涂。正确的做法是:先想清楚这块内容"是什么",再选对应的语义标签。
4.2 链接与图片:让页面连起来、活起来
<a>标签用来做超链接,核心属性是href,指向目标地址。写法是<a href="https://example.com">点我跳转</a>。如果指向的是外部网站,建议加上target="_blank"让它在新标签页打开,同时加上rel="noopener"提升安全性。如果指向的是本地的另一个页面,直接写文件名就行,比如<a href="about.html">关于我</a>。
<img>标签用来插入图片,核心属性是src(图片地址)和alt(替代文字)。alt非常重要,图片加载失败时它会显示出来,屏幕阅读器也会读它。写法是<img src="photo.jpg" alt="一张风景照">。<img>也是空标签,不需要闭合。
这里有个新手常问的问题:图片路径怎么写?如果图片和HTML文件在同一个文件夹,直接写文件名;如果在子文件夹里,写images/photo.jpg;如果在上一级,写../photo.jpg。路径写错是图片显示不出来的头号原因,遇到问题先检查路径。
提示:
alt属性不是可选项,是必选项。它既是无障碍访问的要求,也是图片加载失败时的兜底。养成"每张图都写alt"的习惯。
4.3 列表与表格:结构化展示数据
列表分三种:无序列表<ul>、有序列表<ol>、定义列表<dl>。无序列表前面是小圆点,有序列表前面是数字,定义列表用于"术语-解释"这种配对结构,由<dt>(术语)和<dd>(解释)组成。
表格用<table>、<tr>(行)、<th>(表头单元格)、<td>(数据单元格)来构建。一个标准表格长这样:
<table> <tr> <th>标签</th> <th>作用</th> </tr> <tr> <td>h1</td> <td>一级标题</td> </tr> <tr> <td>p</td> <td>段落</td> </tr> </table>表格在HTML5里只应该用来展示"表格型数据",比如成绩单、价格表。以前有人用表格来排版整个页面,那是老做法,现在绝对不推荐,因为结构混乱、不利于响应式。排版的事交给CSS。
4.4 语义化标签:让结构自己会说话
这是HTML5最值得花时间学的部分。以前写页面,导航栏是<div class="nav">,页脚是<div class="footer">,全靠class名来区分。问题是class名是随便起的,别人看你的代码,得一个个去猜。HTML5的语义化标签直接解决了这个问题:
<header>:页头,通常放logo、标题、导航<nav>:导航区域<main>:页面主体内容,一个页面只用一个<article>:独立的文章内容,比如一篇博客、一条新闻<section>:主题性的区块,通常带标题<aside>:侧边栏,和主内容相关但非核心的内容<footer>:页脚,放版权、联系方式
用这些标签重写之前的个人介绍页,结构会清晰很多:
<body> <header> <h1>我的个人主页</h1> <nav> <a href="#about">关于我</a> <a href="#skills">技能</a> </nav> </header> <main> <section id="about"> <h2>关于我</h2> <p>我是一个正在学前端的新手。</p> </section> <section id="skills"> <h2>技能</h2> <ul> <li>HTML5</li> <li>CSS基础</li> </ul> </section> </main> <footer> <p>版权所有,随便用</p> </footer> </body>对比一下,是不是一眼就能看出哪块是导航、哪块是主体、哪块是页脚?这就是语义化的价值。它不光对人友好,对搜索引擎、屏幕阅读器也友好,属于"一次投入、长期受益"的事。
5. 表单与多媒体:让页面能交互
5.1 表单标签的完整结构
表单是网页和用户交互的核心。一个完整的表单由<form>包裹,里面放各种输入控件。<form>有两个关键属性:action指定提交到哪个地址,method指定提交方式(get或post)。
常用的输入控件有:
<input type="text">:单行文本<input type="password">:密码,输入内容显示为圆点<input type="email">:邮箱,浏览器会自动校验格式<input type="number">:数字,可以设min、max、step<input type="radio">:单选,同一组要设相同的name<input type="checkbox">:多选<input type="submit">:提交按钮<textarea>:多行文本<select>配合<option>:下拉选择
每个输入控件都应该配一个<label>,用for属性关联到控件的id。这样做的好处是:点label的文字也能聚焦到输入框,对手机用户特别友好,屏幕阅读器也能正确朗读。
<form action="/submit" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> <label for="email">邮箱:</label> <input type="email" id="email" name="email" placeholder="请输入邮箱"> <label for="bio">简介:</label> <textarea id="bio" name="bio" rows="4"></textarea> <input type="submit" value="提交"> </form>required属性表示必填,placeholder是占位提示文字。这两个属性浏览器原生支持,不用写一行JavaScript就能做基础校验,非常省事。
5.2 多媒体标签:视频和音频原生播放
HTML5之前,网页放视频要靠Flash之类的插件,又卡又不安全。HTML5直接给了<video>和<audio>:
<video src="movie.mp4" controls width="640" poster="cover.jpg"> 你的浏览器不支持视频标签。 </video> <audio src="music.mp3" controls> 你的浏览器不支持音频标签。 </audio>controls属性会显示播放、暂停、音量等控件。poster是视频加载前显示的封面图。标签中间的文字是"降级内容",浏览器不支持时会显示。
<video>还支持<source>子标签,用来提供多种格式,浏览器会挑它能播的那个:
<video controls> <source src="movie.mp4" type="video/mp4"> <source src="movie.webm" type="video/webm"> 你的浏览器不支持视频标签。 </video>注意:视频文件通常很大,直接放本地文件测试没问题,但正式上线要考虑加载速度和流量成本。另外,自动播放
autoplay在多数浏览器里被限制,必须配合muted静音才能生效,这是浏览器的策略,不是bug。
5.3 表单校验的浏览器原生能力
HTML5给表单加了一堆校验属性,用好了能省掉大量JavaScript代码。常用的有:
| 属性 | 作用 | 适用控件 |
|---|---|---|
| required | 必填 | 大部分输入控件 |
| minlength / maxlength | 最小/最大字符数 | text、password、textarea |
| min / max | 最小/最大值 | number、date、range |
| pattern | 正则校验 | text、email、tel |
| type="email" | 邮箱格式校验 | input |
比如手机号校验,可以用pattern="1[3-9]\d{9}"。这些校验在提交时自动触发,不通过会弹出提示,且阻止提交。虽然不能完全替代后端校验(因为前端校验可以被绕过),但能大幅提升用户体验,减少无效请求。
我个人的建议是:能用原生属性解决的,就别写JavaScript。原生校验的性能和兼容性都比自己写的好,而且代码量少,维护成本低。
6. 新手最容易踩的坑与排查技巧
6.1 中文乱码的三种成因与解决
中文乱码是新手遇到的第一大问题,成因主要有三种。
第一种是文件编码和meta声明不一致。文件用ANSI保存,meta里写UTF-8,必然乱码。解决办法是重新用UTF-8保存文件,确保两边一致。
第二种是meta标签位置不对。<meta charset="UTF-8">必须放在<head>的最前面,最好紧跟在<head>开标签之后。如果放在<title>后面,浏览器可能已经用默认编码解析了一部分内容,导致乱码。
第三种是服务器返回的编码和页面声明不一致。这种情况本地测试遇不到,上线后才出现。解决办法是让服务器返回的Content-Type头里的charset和页面meta保持一致。
排查顺序建议是:先看文件保存编码,再看meta位置,最后看服务器配置。九成以上的乱码问题在前两步就能解决。
6.2 标签不闭合引发的连锁反应
HTML对标签闭合比较宽容,但宽容不代表可以乱写。一个没闭合的<div>,可能导致后面所有内容都跑到它里面去,布局全乱。常见的不闭合情况有:
<p>忘了写</p>,浏览器会自动补,但补的位置可能不是你想要的<li>忘了闭合,后面的内容可能被当成新的列表项<div>嵌套层级太多,数不清哪个对应哪个
排查技巧是:用缩进把嵌套关系写清楚。每进一层就缩进一次,闭合标签和开标签对齐。这样一眼就能看出哪个标签没闭合。虽然记事本不会自动缩进,但你可以手动敲空格,养成习惯。
6.3 路径写错的典型表现
图片不显示、链接点不开、样式不生效,八成是路径问题。路径分三种:
- 绝对路径:以
/或http://开头,指向固定位置 - 相对路径:相对于当前文件的位置,比如
images/a.jpg - 根相对路径:以
/开头,相对于网站根目录
新手最容易错的是相对路径的层级。../表示上一级,./表示当前级(通常省略)。如果图片在上一级的images文件夹里,要写../images/a.jpg。建议把图片统一放在images文件夹,HTML放在根目录,这样路径规则简单,不容易错。
6.4 常见问题速查表
| 现象 | 最可能的原因 | 排查方法 |
|---|---|---|
| 中文显示为乱码 | 编码不一致 | 检查文件保存编码和meta声明 |
| 图片不显示 | 路径错误或文件名大小写不符 | 检查src路径,注意大小写 |
| 页面显示为代码 | 后缀名不是.html | 确认文件后缀,保存类型选"所有文件" |
| 标签样式不对 | 标签没闭合或嵌套错误 | 检查缩进和闭合标签 |
| 表单提交没反应 | action或method写错 | 检查form属性,看控制台报错 |
| 视频不能自动播放 | 浏览器策略限制 | 加muted属性,或改为用户点击播放 |
提示:遇到问题先按F12打开浏览器开发者工具,看Console面板有没有红色报错,看Elements面板里实际渲染出来的结构和你写的是不是一样。这两个面板能解决八成以上的问题。
7. 从静态页面到完整项目的进阶思路
7.1 把零散标签串成一个完整页面
学完单个标签后,最重要的是把它们组合成一个完整的、有意义的页面。我建议的练习路径是:先做一个个人介绍页,包含页头、导航、主体、页脚;再做一个产品展示页,包含图片、列表、表格;最后做一个带表单的注册页。每做一个,都强迫自己用语义化标签,不用<div>凑数。
做完之后,用浏览器的开发者工具检查结构,看看有没有嵌套错误、有没有该用语义标签却用了<div>的地方。这个"自查"的过程,比看十篇教程都管用。
7.2 什么时候该引入CSS和JavaScript
HTML负责结构,CSS负责样式,JavaScript负责行为。三者分工明确。新手常见的误区是:用HTML标签去实现样式效果,比如用<br>调间距、用<h1>当大号文字用。这是典型的"用错工具"。
正确的引入时机是:当你发现"我想让这个标题变红"、"我想让这个按钮有圆角"的时候,就该引入CSS了。当你发现"我想让点击按钮弹出提示"、"我想校验两次密码是否一致"的时候,就该引入JavaScript了。HTML本身只解决"是什么",不解决"长什么样"和"能做什么"。
7.3 手写代码到使用工具的自然过渡
等你手写标签写熟了,会发现两个效率瓶颈:一是重复代码太多,二是没有语法检查容易写错。这时候就该换编辑器了。推荐从轻量的开始,比如VS Code,装上HTML相关的插件,有自动补全、语法高亮、实时预览。但要注意:工具是来放大你能力的,不是来替你思考的。如果你连标签都写不利索,工具只会让你更依赖提示,基础更不牢。
我个人的节奏建议是:纯txt写两周,把常用标签写熟;然后换编辑器,把效率提上来;再往后学CSS和JavaScript,逐步构建完整项目。这个节奏不快,但每一步都踩得实。
最后分享一个我自己的小习惯:每次学完一个新标签,就立刻在记事本里写一个最小示例,保存成html打开看效果。这个"学一个、写一个、看一个"的循环,比一次性看一堆教程然后忘光要有效得多。HTML5基础篇的内容其实不多,真正难的是把每个标签的语义和适用场景刻进脑子里,而这只能靠反复手写来达成。