基本代码结构
一个完整的html代码,必须要包含<html><head><body>三个标签。
<html></html>:表明该对标签之间的代码是html的全部内容。
<head></head>:网页的元信息,不会显示在页面中,包括字符编码、作者、标题等。
<body></body>:网页的页面内容。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title>网页标题</title>
</head>
<body>
<!-- 网页内容 -->
<script src="script.js"></script>
</body>
</html>
<!DOCTYPE html>:DOCTYPE声明,告诉浏览器使用HTML5标准渲染页面。这个声明很重要,不同的DOCTYPE会影响浏览器的渲染模式。可以理解为每个html文件都必须在文件开头加上它。
标签
HTML 标签就是用尖括号 <> 包起来的“指令”,用来告诉浏览器“这里是什么内容”或者“这里有什么东西”。
标签分为两种:容器标签与自闭合标签。
容器标签:特征是必定成对出现,如<html></html>,类似括号,将内容放在两个括号之间。
自闭合标签:特征是单独出现,如<br>(类似C语言的/n,表示换行)不需要包住文字内容,它们只是“到这儿就该有某个东西”或者“在此处执行某个命令”。
另外有两个与标签有关的概念:元素与属性。
元素:从开始标签到结束标签的整个整体,包括里面的内容。例如:
<p>你好</p> //这一行称为一个p元素属性:写在开头标签中,给标签附加额外信息,例如:
<html lang="zh-CN"> //表示该html的文本自然语言是大陆简体中文head标签
title标签
用于定义网页的标题,显示在浏览器窗口的标题栏上,这也意味着<title>标签是head的必写(且唯一必写)项。<title>对搜索引擎优化(以下称为SEO)非常重要,搜索引擎会把 <title> 里的文字直接显示为搜索结果的标题。title标签显然是容器标签。
<head>
<title>网页标题</title>
</head>meta标签
用于描述网页的文档属性,包括但不限于:字符编码,页面描述,作者信息等。它的内容是专门给浏览器和搜索引擎看的“页面说明书”,告诉浏览器如何理解与渲染界面。meta标签是自闭合标签。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="网页描述">
<title>网页标题</title>
</head>charset:字符编码,一般使用UTF-8
viewport:响应式设计必备
description:页面描述,有助于SEO
keywords:关键词
author:作者信息
meta标签展开来比较复杂,后续会更详细地讲述。
文本标签
标题标签
<h1>一级标题</h1><h1>一般只使用一次。
在VScode中如果打出h$*6会直接生成<h1>到<h6>6级标签。
标题默认渲染左对齐,,如果想要将标签渲染居中/右对齐,需要给标签添加align属性(不推荐,更推荐使用CSS方案)。
<h1 align="left">一级标题</h1> //左对齐
<h2 align="right">一级标题</h2> //右对齐
<h3 align="center">一级标题</h3> //居中对齐段落/换行/水平线
段落(<p></p>):最常使用的用于写文本的容器标签。
<p>窗前明月光</p>
<p>疑是地上霜</p>每个 <p> 都独占一行,不会和别的文字挤在一行里,渲染时,文字到屏幕边缘会自动换行。
<p>是一个块级元素(意味着它会撑满整行),不能把其他块级容器(另一个<p>、<h1>、<div>等)放在<p>中嵌套。
换行(<br>)
如果希望两行文字属于同一个段落(<p></p>),那么可以在换行的地方用<br>表示。比起分成两个段落,使用<br>会使两行文字之间的间距更小,而且把两个高度相关的文本划分成两个段落不利于SEO。
<p>窗前明月光<br>疑是地上霜</p>水平线(<hr>)
一共有四个属性:color(颜色)\width(长度)\size(宽度)\align(默认居中,可选left和right)
<hr color="green" width="1000px" size="30px" align="left"/>不要滥用水平线来装饰,它代表段落级元素之间的主题分隔,对SEO有帮助。
文本格式
<strong>加粗且加重语气</strong>
<em>着重文字</em>
<b>粗体</b>
<i>斜体</i>
<span>无含义,一般用于CSS扩展<span>
<mark>标记文本</mark>
<del>删除线</del>
<ins>下划线</ins>
<sub>下标</sub>
<sup>上标</sup>
<small>小号文本</small>
<p>以上标签属于行内元素,可以<strong>嵌套</strong>使用<p>
<p>
<mark>重点:</mark> 这个公式是
<strong>E = mc<sup>2</sup></strong>,
水分子是 H<sub>2</sub>O,
原价 <del>199元</del> <ins>现价99元</ins>。
</p>图片标签
<img src="" alt="" title="" width="" height="">src:图片链接(技术上的必写项)
alt:图片加载失败时的替代文本(工程上的必写项)
title:鼠标悬停在图片上方时的提示文字
三种图片路径:绝对/相对/网络路径
绝对路径:从电脑根目录一直到图片存储地址,如<img src="C:\Users\你的名字\Desktop\my-web\images\cat.jpg" alt="猫">
相对路径:以当前 HTML 文件所在文件夹为起点,描述“怎么走到图片那里”。如<img src="images/cat.jpg" alt="猫">
网络路径:也称绝对 URL。以 http:// 或 https:// 开头,指向互联网上的某个图片。该图片必须放在互联网服务器上且能被访问,同时用户的电脑联网才能显示出来。
超文本链接标签
<a href= "url">链接文本</a>href即为链接地址,这个地址可以是新的网页,也可以是当前网页的某个部分。
链接文本可以是纯文本,也可以是图片(嵌套<img>)。
如果想要跳转到当前网页的某部分,需要对该部分添加一个id属性,作为href的值。
<h2 id="chapter3">第三章</h2>
<a href="#chapter3">跳到第三章</a>跳转一般分为两种:在本页面打开/在新页面打开,方式由属性target的值决定。默认为当前标签页打开。
<!-- 在当前标签页打开(默认行为,不需要写 target) -->
<a href="page.html">默认打开</a>
<!-- 在当前标签页打开 -->
<a href="page.html" target="_self">当前标签页打开</a>
<!-- 在新的浏览器标签页打开 -->
<a href="page.html" target="_blank">新标签页打开</a>默认情况下,链接文本将显示为蓝色且带有下划线,访问过的链接会变成紫色,点击时链接会变成红色,可以通过CSS修改样式。鼠标移动到超链接文本上时光标会变成一只手。
列表标签
有序列表
表现为一列项目,在每行开头默认用数字序号进行标记。有序列表始于<ol>标签,每个项目始于<li>标签。
<ol>
<li>苹果</li>
<li>香蕉</li>
<li>橘子</li>
</ol><ol>可以加属性type,有五个属性值:1(阿拉伯数字标号1/2/3/...),a(小写字母标号a/b/c/...),A(大写字母标号A/B/C/...),i(小写罗马数字标号i/ii/iii/...),I(大写罗马数字标号I/II/III/...)
列表是可以嵌套使用的。
<ol type = "1">
<li>水果
<ol type = "a">
<li>苹果</li>
<li>香蕉</li>
<li>橘子</li>
</ol>
</li>
<li>蔬菜</li>
<li>肉类</li>
</ol>快捷生成方式:
ol>li{项目$}*n无序列表
无序列表前没有表示顺序的序号,默认情况下每项前用粗体实心圆点标记。
<ul>
<li></li>
<li></li>
</ul><ul>也有type属性以及4种属性值,分别为disc(粗体实心圆),circle(空心圆),square(小方块),none(不显示)。
无序列表也可以嵌套使用。
无序列表应用非常广泛,各大网页中的导航页、选项页几乎全是用无序列表实现的。
表格标签
表格是按先行后列的顺序建成的,一个完整的表格有以下三个标签:
<table>:表格
<tr>:行
<td>:列(单元格)
<table>
<tr>
<td>第1行第1列</td>
<td>第1行第2列</td>
<td>第1行第3列</td>
</tr>
<tr>
<td>第2行第1列</td>
<td>第2行第2列</td>
<td>第2行第3列</td>
</tr>
</table>最好是每行中包含的tr数量相等,以保证表格渲染正确、美观,当然这是不强制的。
表格默认是没有边框的,若要添加边框需要给table标签添加属性:
border:设置边框宽度占多少像素。
width:表格宽度。
height:表格高度
<table border = "1", width = "300", height = "300" >
<tr>
<td>第1行第1列</td>
<td>第1行第2列</td>
<td>第1行第3列</td>
</tr>
<tr>
<td>第2行第1列</td>
<td>第2行第2列</td>
<td>第2行第3列</td>
</tr>
</table>表格的快捷生成方式:
table>tr*m>td*n{单元格} //生成m*n大小的、每个单元格内填充“单元格”的表格单元格合并:只有水平合并(从左向右,保留最左边的单元格)和垂直合并(从上到下,保留最上面的单元格)两种方法。
引入td的属性rowspan与colspan,可以理解为该单元格占几列/行。
<table border = "1", width = "300", height = "300" >
<tr>
<td>第1行第1列</td>
<td>第1行第2列</td>
<td>第1行第3列</td>
</tr>
<tr>
<td>第2行第1列</td>
<td>第2行第2列</td>
<td>第2行第3列</td>
</tr>
</table>
<table border = "1", width = "300", height = "300" >
<tr>
<td rowspan = "2" >第1行第1列和第2列</td> //rowspan的值表示该单元格会向右合并几个单元格
//<td>第1行第2列</td> 删除这一单元格
<td colspan ="2" >第1行第3列和第2行第3列</td> //colspan的值表示该单元格会向下合并几个单元格
</tr>
<tr>
<td>第2行第1列</td>
<td>第2行第2列</td>
//<td>第2行第3列</td> 删除这一单元格
</tr>
</table>
<table border = "1", width = "300", height = "300" >
<tr>
<td rowspan = "2" colspan = "2">1-1/1-2/2-1/2-2</td>
//<td>第1行第2列</td>
<td>第1行第3列</td>
</tr>
<tr>
//<td>第2行第1列</td>
//<td>第2行第2列</td>
<td>第2行第3列</td>
</tr>
</table>表单标签
表单是用户与后端交互的重要部件,用户填写表单,由前端交给后端处理,形成交互。搜索框是最基础最常见的表单。

表单的最外层为<form>,有三个基本属性:action(服务器地址)、method(数据提交方式)、name(表单名称,可以省略)。这里涉及一些后端知识,在后端篇章会展开。
<form action="/submit-form" method="post">
<!-- 各种输入控件放这里 -->
</form>表单里的输入框由<input>标签表示,它本身是一个空标签,但是可以通过更改type属性的值来表示不同的输入工具。
<!-- 文本输入 -->
<input type="text" placeholder="请输入用户名">
<!-- 密码输入(字符会被隐藏) -->
<input type="password" placeholder="请输入密码">
<!-- 邮箱 -->
<input type="email" placeholder="you@example.com">
<!-- 数字 -->
<input type="number" min="1" max="100">
<!-- 单选框(同一组 name 相同,只能选一个) -->
<input type="radio" name="gender" value="male"> 男
<input type="radio" name="gender" value="female"> 女
<!-- 多选框 -->
<input type="checkbox" name="hobby" value="coding"> 写代码
<input type="checkbox" name="hobby" value="reading"> 读书
<!-- 日期选择 -->
<input type="date">
<!-- 文件上传 -->
<input type="file">
<!-- 提交按钮 -->
<input type="submit" value="注册">
<!-- 普通按钮(以后用 JS 控制) -->
<input type="button" value="点我">需要注意的是,单选框/多选框的name必须一致,这样浏览器才知道选项是一组的。
如果想要用户输入一大段文字,如留言板功能,则需要用<textarea>标签。
<textarea rows="5" cols="30" placeholder="请输入您的留言..."></textarea>表单还可以做成下拉菜单的形式,需要用到<select> + <option>。
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen" selected>深圳</option>
</select>输入后用户需要点击按钮上传表单,这时需要<button>标签,除了上传,它还可以清空表单。如果type的值设为"button",那么该按钮无默认行为,用于JavaScript控制。
<button type="submit">提交</button>
<button type="reset">重置</button>
<button type="button" onclick="alert('你好')">普通按钮</button><label>标签用于给表单控件(<input>、<textarea>、<select> 等)提供文字说明。单纯在输入框前面写“用户名:”这三个字,浏览器只知道那是文字,不知道它们和输入框有关系。只有用 <label> 把它们关联起来,浏览器才明白:“这段文字是在描述这个输入框。”
有文字说明与控件两种关联方式:
<!-- 显式 -->
<label for="user-email">邮箱地址:</label>
<input type="email" id="user-email" name="email">
//label的for属性值必须与input的id属性值一致
<!-- 隐式 -->
<label>
邮箱地址:
<input type="email" name="email">
</label>完整表单示例:
<form action="#" method="post">
<p>
<label for="name">姓名:</label>
<input type="text" id="name" name="name" required>
</p>
<p>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" placeholder="you@example.com" required>
</p>
<p>
<label for="password">密码:</label>
<input type="password" id="password" name="password" minlength="6" required>
</p>
<p>
性别:
<label><input type="radio" name="gender" value="male"> 男</label>
<label><input type="radio" name="gender" value="female"> 女</label>
</p>
<p>
<label for="city">城市:</label>
<select id="city" name="city">
<option value="">请选择</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
</select>
</p>
<p>
<label for="message">留言:</label>
<textarea id="message" name="message" rows="4" cols="40"></textarea>
</p>
<p>
<button type="submit">提交</button>
<button type="reset">重填</button>
</p>
</form>块级元素与内联元素

常见块级元素:div/form/h1/hr/p/table/ul等
常见内联元素:a/b/em/i/span/strong等
行内块级元素(不换行,可以设置宽高):img/input/button等
<div>容器元素与语义标签
div就是division的缩写,<div>并无实际意义,就是一个纯粹的块级容器,用于将各个部分装在一起,形成一个整体。比如一个网页可以分为页眉、导航、主体、侧边栏、页脚等部分,每一部分下又有各种各样的标签构成,但是如果不用div将它们分别囊括起来,这些标签就是散乱的,虽然渲染出来并没有区别,但是在开发阶段代码很乱,SEO也比较麻烦,JavaScript和CSS想要同时控制多个模块也不好处理,于是有了<div>标签。
<div>有id属性,其值表示了该组件属于网站结构的哪个部分。最常使用的有header(头部)、nav(导航)、article与section(内容)、sidebar(侧边栏)、footer(页脚)几个值。
<div id="header">
<h1>我的博客</h1>
<p>这是网站标语</p>
</div>
<div id="main-content">
<div class="article">
<h2>文章标题</h2>
<p>文章正文……</p>
</div>
<div class="article">
<h2>另一篇文章</h2>
<p>另一篇正文……</p>
</div>
</div>
<div id="sidebar">
<h3>关于我</h3>
<p>个人简介</p>
</div>
<div id="footer">
<p>© 2026 我的博客</p>
</div><div>当然可以嵌套,在容器中划分小容器。
<div class="card">
<div class="card-header">
<h3>产品名称</h3>
</div>
<div class="card-body">
<img src="product.jpg" alt="产品图">
<p>产品描述。</p>
</div>
<div class="card-footer">
<button>购买</button>
</div>
</div>由于header、nav、article与section、sidebar、footer几个值过于常用,所以单独给这几个值定义了标签:<header>、<nav>、<article>、<section>、<aside>、<footer>。另外还有一个非常常用的<main>标签,整个网页只能有一个<main></main>,其表示该网页最核心内容。
<div id="header"></div>
<div id="nav"></div>
<div id="article">
<div id="section"></div>
</div>
<div id="silder"></div>
<div id="footer"></div>
<header></header>
<nav></nav>
<article>
<section></section>
</article>
<aside></aside>
<footer></footer>具体含义如下:
1. <header></header> 头部
2. <nav></nav> 导航
3. <section></section> 定义文档中的节,比如章节、页眉、页脚
4. <aside></aside> 侧边栏
5. <footer></footer> 脚部
6. <article></article> 代表一个独立的、完整的相关内容块,例如一篇完整的论坛帖子,一篇博客文章,一个用户评论等