2.0 HTML
Purpose of HTML
HTML(Hyper Text Markup Language)描述了网页的 semantic content(语义内容)以及内容之间的 logical relationships(逻辑关系)。它最初由 Tim Berners-Lee 于 1990 年定义为 SGML 的一种类型。Hypertext(超文本)是 Web 的一个关键卖点。
HTML philosophy
HTML5 于 2008 年发布,是一次重大的修订。HTML5 的哲学包括:
- Interoperability(互操作性):应能在多种浏览器上呈现。
- Graceful error recovery(优雅的错误恢复):小错误不应阻止页面渲染。
- Backwards compatible(向后兼容):新特性不应破坏现有网页。
- Prioritise users(用户优先):用户 > 网页设计者 > 浏览器实现者 > 理论家。
- Separation of concerns(关注点分离):描述信息的类型,而不是其显示方式。
值得注意的是,为了符合 HTML5 哲学,网页浏览器渲染器非常宽松。浏览器会忽略未识别的标签、换行符、制表符、多个空格。甚至可以不需要 <htm>
, <head>
, <body>
等关键文档标签,以及匹配的开闭标签(尽管强烈建议匹配,因为这是 bugs 的简单来源)。标签更像是对浏览器的建议,甚至可能被忽略。
HTML Document Structure Mapping
一个 HTML 文档由 elements(元素)组成。一个元素通常由 opening and closing tags(开闭标签)及其之间的 content(内容)构成。元素的内容可以包含其他元素。因此,HTML 文档是一个 tree data structure(树形数据结构)。
HTML5 文档通常以 <!DOCTYPE html>
声明开始。文档的 root(根)是 <html>
标签。文档包含 <head>
和 <body>
。<title>
标签用于为文档设置标题,通常显示在浏览器窗口的标题栏中。Visible elements(可见元素)位于 <body>
分支上。
例如:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<h1>Main Heading</h1>
<p>Some content.</p>
</body>
</html>
Common HTML Elements and Attributes
以下是一些常见的 HTML 元素及其目的和属性:
- Text Elements
(文本元素):
- Headings:
<h1>
,<h2>
,<h3>
,<h4>
等用于定义不同级别的标题。 - Paragraphs:
<p>
用于定义段落。 - Code:
<code>
用于表示代码片段。 - Emphasis:
<em>
用于表示强调文本。 这些元素可以嵌套。特殊字符使用&…;
表示。
- Attributes(属性):所有 HTML 标签都可以有一系列属性,它们出现在开闭标签的名称和右括号之间。
- Images(图像):使用
<img/>
标签插入图像,需要src
属性指定图像源。alt
属性提供替代文本,用于图像无法显示或屏幕阅读器。 例如:<img src="logo.png" alt="Company Logo"/>
- Lists
(列表):
- Ordered List(有序列表):使用
<ol>
标签。type
属性可以改变列表标记(如字母)。 - Unordered List(无序列表):使用
<ul>
标签。type
属性可以改变列表标记(如方形)。 - List Items: 列表项使用
<li>
标签作为<ol>
或<ul>
的内容。 例如:
<ol type="A">
<li>First item</li>
<li>Second item</li>
</ol>
<ul>
<li>Item A</li>
<li>Item B</li>
</ul>
- Tables
(表格):使用
标签定义表格。每行使用
。行标题使用
。数据单元格使用
。 例如:
<table>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</table>
表格属性包括
(设置单元格间距)、
(设置单元格内容与内壁的间距)和
(设置单元格边框宽度,没有则无可见边框)。
重要提示
非常不建议使用无边框表格进行网页布局,因为它违反语义意图(屏幕阅读器会将其读作表格)、浏览器可能仍然将其渲染为表格、难以维护且渲染速度慢。
- Hypertext Links(超文本链接):使用
<a>
(anchor) 标签创建链接,需要href
(hypertext reference) 属性指定链接目标。<a>
标签的内容是文档中的可见链接(可以是文本、图像等)。 例如:<a href="https://www.example.com">Visit Example</a>
链接可以在同一页面或同一网站内使用 relative addressing(相对地址),而不是 absolute addressing(绝对地址)。可以通过id
属性链接到同一文档中的元素。链接可以指向任何文件,不限于 HTML。 例如(链接到同一页面内的元素):<a href="#section2">Go to Section 2</a>
(假设页面中有<h2 id="section2">
)
- Grouping Elements
(分组元素):
<span>
: 用于分组 inline content(行内内容),如句子中的单词。默认不渲染。<div>
: 用于分组 multi-line block(多行块)内容,如多个段落或图像。默认不渲染。 这些元素通常用于共同格式化或框选元素。
- Advanced Layout Elements
(高级布局元素):HTML5 引入了一些具有语义目的的布局元素。
<canvas>
: 创建一个矩形区域,可以使用 JavaScript 绘制位图图形,用于创建交互式动画和游戏。<header>
: 包含章节或页面的介绍性信息。<nav>
: 用于包含文档导航链接的部分。<section>
: 代表通用的文档或应用部分,类似于<div>
。<article>
: 代表页面中可独立存在的部分,如博客文章或论坛条目。<aside>
: 代表与文档主要区域相关的内容,通常在侧边栏中(如相关文章、标签云)。<footer>
: 用于标记当前页面或页面中每个章节的页脚。
HTML Forms, Input Types, and Submission
<form>
元素是获取浏览器信息发送到服务器的标准方式。在 <form>
内,可以使用 <input>
元素自动创建用于收集信息的控件(如文本框、单选按钮、复选框)。<input>
元素可以使用 <fieldset>
元素分组。可以使用 <label>
元素为 <input>
创建标签,并通过 for
属性与对应 <input>
的 id
属性链接。
Input Type Attributes(输入类型属性): <input>
元素的 type
属性决定了它如何渲染。常见的类型有:button
, checkbox
, color
, date
, email
, file
, image
, month
, number
, password
, radio
, range
, reset
, search
, submit
, tel
, text
, time
, url
, week
等。 其他输入属性包括:
value
: 设置输入的初始值。readonly
: 意味着用户不能编辑它。placeholder
: 提供输入值类型的提示。required
: 强制用户输入值。 许多属性依赖于使用的类型,例如autocomplete
,min
,max
。使用正确的 semantic input type(语义输入类型)可以方便用户,例如,使用email
,url
,tel
而非纯文本时,屏幕键盘会相应改变。
Form Submission(表单提交): 表单有一个特殊的输入类型 submit
,它生成一个提交按钮。当点击表单的提交按钮时,表单的当前值会发送到 action
属性指定的服务器 URL。每个输入的值作为 key-value pair(键值对)发送,其中 key 是 name
属性的值。<form>
标签上的 method
属性决定了传输值的协议。
get
方法将表单值附加到服务器请求的 URL 中。post
方法则将值编码在服务器请求的 body 中。
例如,一个使用 get
方法的表单:
<form action="/action_page.php" method="get">
<label for="mail">Email:</label>
<input type="email" id="mail" name="my-mail">
<input type="submit" value="Submit">
</form>
提交后可能会发送请求 /action_page.php?my-mail=whiskers@gmail.com
。
HTML Form Validation
确保用户在表单中输入有效数据有两种主要方法:
- Native HTML validation
(原生 HTML 验证):
- 对
email
,url
,tel
输入类型提供自动基本验证。 - 提供各种依赖于类型的验证属性:
- 对于数字输入 (
number
,range
):max
,min
,step
。 - 对于文本输入 (
text
,email
,search
,url
,tel
,password
):maxlength
,pattern
。
- 对于数字输入 (
- JavaScript validation
(JavaScript 验证):
- 在浏览器中使用 JavaScript 编写代码来检查输入,这更灵活。
重要提示:Client-side validation(客户端验证),无论使用哪种方法,都非常容易绕过。因此,始终也要在服务器端验证您的值。