Skip to content
This page has been auto-translated and may contain errors.View in English

什么是 HTML

docs.scrimba.com

你访问过的每个网站都始于一个用 HTML 编写的纯文本文档。你在页面上看到的标题、段落、按钮、图像和链接都是用这一种语言描述的。在你能给页面添加样式或使其交互之前,你需要描述页面上有什么,而这种描述就是 HTML。

页面只是结构化文本

HTML 代表 HyperText Markup Language(超文本标记语言)。重要的词是**标记**:HTML 是一种将纯文本标记出来的方式,标记哪些是标题、哪些是段落、哪些是链接等等。你不是在给计算机指令来执行。你是在标记内容,以便浏览器知道每一部分是什么以及如何显示它。

可以把它想象成手动格式化一份文档。你圈出标题,给节标题加下划线,在照片周围画一个框。HTML 就是以浏览器能理解的方式来做这种圈、划线的操作。

HTML 是一种**声明式**语言:你描述你想要的结构,而不是产生它的步骤。没有逻辑、没有循环、没有变量。你声明"这是一个标题,这是一个段落,这是一个包含三项的列表",浏览器负责将这种描述转化为屏幕上的内容。

这就是为什么 HTML 从通常意义上说不是一种编程语言。它不计算任何东西。它组织内容。一旦你加入 CSS 和 JavaScript,这种区别就很重要了,因为三种语言中的每一种都有各自擅长的工作,而 HTML 的工作就是组织结构。

HTML 是一种声明式标记语言,浏览器将其解析为一棵称为 DOM(文档对象模型:页面的实时内存中表示,CSS 对其进行样式设置,JavaScript 对其进行操作)的对象树。你的源文本是输入;DOM 就是浏览器实际呈现的内容以及其他所有网络技术与之交互的东西。

这个框架解释了 HTML 的大部分行为。HTML 解析是故意宽容的:缺少闭合标签或元素嵌套不当很少会抛出错误,因为解析器遵循定义的恢复算法并构建有效的树。这是一个特性,不是不谨慎。它让两十年不完美的页面继续工作。这也意味着"它能呈现"是一个很弱的正确性测试:浏览器几乎可以从任何东西构建 DOM,所以结构化你的标记是你的责任,而不是解析器的。

html
<h1>欢迎</h1>
<p>这是我第一个网页上的一段文字。</p>

两行,两个结构:一个标题和一个段落。浏览器读取标签,将第一行显示为大号加粗字体,第二行显示为普通正文。

Juno页面只是结构化文本 HTML 是你标记页面各部分的方式,以便浏览器知道它们是什么。你不是在编写指令,你是在标记内容:这部分是标题,这部分是段落。这就是全部思想,其他一切都建立在它之上。
Juno页面只是结构化文本 HTML 是声明式的:你描述结构,浏览器处理其余的。没有逻辑存在于这里,这正是为什么它与 CSS 和 JavaScript 配合工作得很好。在你的脑子里保持 HTML 的工作清晰,其他两个会更容易定位。
Juno页面只是结构化文本 浏览器将你的标记解析为 DOM,这棵树是其他一切行动的对象。解析故意是宽容的,所以 它能呈现 几乎证明不了什么。格式良好的结构是你的责任,当 CSS 和 JavaScript 开始读取你构建的树时,它会得到回报。

元素、标签和属性

大多数 HTML 由**元素**组成。一个元素通常有一个开始标签、一些内容和一个闭合标签:

html
<p>你好。</p>

<p> 是开始标签,</p> 是闭合标签(注意斜杠),"你好。" 是中间的内容。它们一起构成一个段落元素。标签是标记;内容是访问者读到的内容。

你还可以用属性给标签额外的信息。一个链接需要知道它指向哪里,所以你用 href 属性告诉它:

html
<a href="https://scrimba.com">访问 Scrimba</a>

一个元素是一个开始标签、它的内容和一个闭合标签。属性以 name="value" 对的形式放在开始标签内,并配置元素:链接上的 href 设置其目的地,图像上的 src 设置其文件,alt 设置备用文本。

html
<a href="https://scrimba.com" target="_blank">访问 Scrimba</a>

有些元素没有内容也没有闭合标签。这些是**空元素**:<img><br><input><hr>。它们在属性中包含了它们需要的一切,所以没有什么可以包装,也没有什么可以关闭。

词汇的准确性值得追求,因为人们使用时很随意,这会造成后来的困惑。标签是你输入的文本,<p></p>元素是解析器产生的整个东西:标签加上它们的内容加上任何后代。属性是开始标签上的 name="value" 对,设置元素的属性。

空元素(<img><input><br><hr><meta><link>)没有内容模型,因此没有闭合标签;你有时看到的尾部斜杠(<br />)在 HTML 中是可选的,没有任何效果,是 XHTML 的遗留物。属性值是字符串,即使它们表示数字或布尔值:disabled 是一个布尔属性,仅其存在就为真,而 <input value="5"> 持有字符串 "5",直到某些东西将其读取为数字。当 JavaScript 开始读取属性值时,知道 DOM 在这一层是字符串类型的,可以让你避免一类错误。

Juno元素、标签和属性 一个元素是一个开始标签、一些内容和一个闭合标签,像 <p>...</p>。属性放在开始标签中,添加详情,比如链接指向哪里。不用担心记住每个标签。你会在需要的时候一次学几个。
Juno元素、标签和属性 标签是文本,元素是整个东西,属性配置它。注意像 <img><input> 这样的空元素:没有内容,没有闭合标签,一切都在属性中。现在就把词汇弄正确,会让文档的其余部分读起来更清晰。
Juno元素、标签和属性 标签、元素和属性意味着三种不同的东西,把它们区分清楚在调试时是值得的。属性值在这一层是字符串,即使是数字和布尔值,所以第一次 value 在 JavaScript 中作为字符串返回时,你已经知道为什么了。空元素上的可选斜杠不做任何事;忽略它。

HTML、CSS 和 JavaScript 如何分工

一个完成的网页通常由三种语言构建,每一种都有一个工作:

  • HTML 是结构:标题、文本、图像和按钮。
  • CSS 是样式:颜色、字体、间距和布局。
  • JavaScript 是行为:点击、输入或滚动时发生什么。

一种常见的想象方式:HTML 是房子的墙和房间,CSS 是油漆和家具,JavaScript 是使东西打开的电力。你首先学习墙,因为在结构存在之前,没有什么可以涂漆或布线。

三种语言形成一个分层堆栈,分层是有意的。HTML 提供结构和意义。CSS 读取该结构并描述它应该看起来如何。JavaScript 读取并改变结构以响应事件。

从早期就保持分离是值得培养的一个学科。当你的内容在 HTML 中,你的呈现在 CSS 中,你的行为在 JavaScript 中时,你可以改变每一个而不影响其他的。混合它们,比如用 <br> 标签或内联样式强制布局,初期可行,但很快就会变成麻烦。

三个技术间的关注点分离不仅仅是整洁,它是使页面有弹性的东西。一个页面其意义完全由其 HTML 承载,会优雅地降级:如果 CSS 加载失败,内容仍然可读和有序;如果 JavaScript 被禁用或出错,核心内容仍然存在。这是**渐进式增强**的实际论证:首先在 HTML 中构建一个工作文档,然后在上面分层样式和行为。

这也是一个可访问性和性能论证。辅助技术读取 DOM,所以在 HTML 中存在的意义对它是可用的,而用 CSS 伪造的意义或由 JavaScript 后期注入的意义往往不是。而且 HTML 是浏览器首先可以解析和绘制的东西;依赖于 JavaScript 往返才能显示的内容是用户要等待的内容。当你决定页面的某一部分应该在哪里时,默认答案是 HTML,只有当结构单独无法完成工作时,你才向上移动堆栈。

JunoHTML、CSS 和 JavaScript 如何分工 三种语言,三种工作:HTML 是结构,CSS 是样式,JavaScript 是行为。你从 HTML 开始,因为它是其他一切所在的部分。一旦这些墙竖起来,油漆和布线就有地方可去了。
JunoHTML、CSS 和 JavaScript 如何分工 HTML 中的结构,CSS 中的呈现,JavaScript 中的行为,故意保持分离。改变一个而不破坏其他的,并抵制在 HTML 中伪造布局的冲动。这个习惯现在很便宜,但以后很贵。
JunoHTML、CSS 和 JavaScript 如何分工 把意义放在 HTML 中,当 CSS 或 JavaScript 出问题时页面会优雅地降级,这也是使其无障碍和快速的原因。这是整个渐进式增强的论证。当你不确定某些东西属于哪里时,从堆栈的底部开始,只有当结构单独无法承载时才向上爬。

你对完整页面的第一次查看

下面是一个完整的,虽然很小的网页。你将在接下来的章节中正确地了解它的每个部分,所以现在不用担心细节。现在,注意它完全由你已经看到的标签和属性组成:

下面是一个最小但完整的 HTML 文档。每个真实页面都从大致这种形式开始:一个文档类型、一个 <html> 根元素、一个用于页面信息的 <head> 和一个用于访问者看到的内容的 <body>

一个完整的文档有一个必需的骨架,它值得仔细阅读,即使它看起来像样板。每一行都有一个工作,接下来的章节解释为什么每一行都值得保留,而不是把它当成一个要复制的魔法咒语。

html
<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>我的第一个页面</title>
  </head>
  <body>
    <h1>欢迎</h1>
    <p>这是我第一个网页上的一段文字。</p>
  </body>
</html>

从顶部读起:第一行告诉浏览器这是一个现代 HTML 页面,<html> 包装了一切,<head> 持有像页面标题这样的幕后信息,而 <body> 持有你实际看到的东西。之前的标题和段落在正文中,因为它们是访问者的内容。

<head> 持有元数据:关于页面的东西,在页面正文中没有显示,比如它的标题(在浏览器标签中出现)和它的字符编码。<body> 持有可见内容。这种分割,页面的信息对比页面的内容,是每个文档做出的第一个结构决策。

注意顺序和它为什么重要:<meta charset> 在 head 中首先出现,以便解析器在读取文档其余部分的字节之前知道如何解码它们。<html> 上的 lang 属性通知屏幕阅读器和翻译工具。这些都不是装饰。head 配置文档如何被解析和理解,而 body 是该配置应用到的内容。下一章,关于你的第一个 HTML 页面,逐行拆解这个骨架。

Juno你对完整页面的第一次查看 每个页面都是从一个小的、重复的骨架构建的:一个文档类型,然后 <html> 包装一个 <head> 和一个 <body>。head 是幕后信息,body 是人们看到的东西。你将在接下来正确地拆解它,所以现在快速看一下就足够了。
Juno你对完整页面的第一次查看 核心分割是 head 中的元数据,body 中的可见内容。几乎你编写的每个文档都从这个确切的形状开始,所以值得一眼识别。下一章逐行讲解。
Juno你对完整页面的第一次查看 骨架是有原因的顺序:charset 在内容之前,这样解析器可以解码其余部分,lang 用于辅助技术和翻译。把没有一个看作填充物。现在结构和理解它,head 就不再感觉像一个你粘贴的魔法块了。