HTML知识介绍

245 阅读20分钟

HTML知识介绍

本文主要记录一些关于 HTML 的介绍、历史与演变、标签语言、语义化、多媒体内容、响应式设计、Web Accessibility和性能优化。 供自己以后查漏补缺,也欢迎同道朋友交流学习。

原文地址

墨渊书肆/HTML随笔

引言

对于浏览器用户来说,html 就是浏览的网页,也是我们最早和最频繁接触到的内容传播形式。所以我们前端开发的贡献是非常大的,所有浏览器用户都是通过我们才能浏览多姿多彩、功能丰富的页面。

我个人接触前端和 HTML 的过程是非常有意思的,我是自动化专业,其实不学 html,也不学前端。但我老婆是计算机多媒体专业,大学时候帮她使用 dreamweaver (简称 DW )做网页设计时接触到的。后来毕业后在做仅 3 个月的 SEO 网站编辑时,系统的自学了前端 JSJQ 去面试成功了。

HTML简介

HTML(全称HyperText Markup Language)是一种用于创建网页和网上信息的超文本标记语言,是构建网页的基础技术。

HTML 由一系列的元素组成,这些元素告诉浏览器如何展示内容。每个元素由一个起始标签和一个结束标签组成,例如 <p></p> 用于定义一个段落。

HTML5 引入的语义化标签(如 <header>, <footer>, <article>)不仅增强了内容的可读性和可维护性,还提高了网页的可访问性和搜索引擎优化(SEO)效果。

此外,HTML 支持跨平台兼容性,确保内容在各种设备和浏览器上一致显示。HTML 还提供了基本的交互功能,如表单元素,以及多媒体支持,使得嵌入音频和视频变得简单。

HTML历史与演变

HTML 自 1991 年由蒂姆·伯纳斯-李提出以来,经历了多次重大更新和发展。最初,HTML 1.0 是一个简单的标记语言,主要用于学术和科研领域的信息共享

1995 年,HTML 2.0 发布,引入了表格图像支持,标志着网页内容的丰富化。

1997 年,HTML 3.2 成为首个由 W3C(万维网联盟)发布的正式标准,增加了框架样式表的支持。

随后,HTML 4.011999 年发布,引入了更多结构化和国际化特性,奠定了现代网页的基础。然而,随着互联网的快速发展,HTML 4.01 逐渐显现出局限性。

2000 年,W3C 推出了 XHTML,试图将 HTML 与 XML 结合,但并未广泛普及。

2008 年,HTML5 正式推出,成为 HTML 发展的重要里程碑。HTML5 引入了大量新特性,如语义化标签(<header>, <footer>, <article>)、多媒体支持(<audio>, <video>)、本地存储离线应用。这些特性极大地丰富了网页的功能和用户体验,推动了 Web 应用的发展。

至今,HTML 的发展已经进入了 Living Standard(活标准)时代。这意味着我们不再期待一个宏大的 HTML6 的发布,而是由 WHATWGW3C 协作,以 Living Standard 的形式持续进行小步快跑式的更新。这种“去版本化”的演进方式,让网页技术能够更灵活地响应现代 Web 的复杂需求,确保了标准的实时性和前瞻性。

HTML 2025 & 2026:声明式交互的崛起

进入 2025 和 2026 年,HTML 的演进展现出了一个明显的趋势:减少对 JavaScript 的依赖,回归声明式编程。浏览器正在赋予 HTML 标签更强大的原生交互能力。

  • Popover API 的普及popover 属性现在已经成为主流浏览器的标配。它允许我们不写一行 JS 就能实现弹出框、菜单和提示框,并且原生支持“轻量消失”(点击外部自动关闭)和顶层渲染(Top Layer),彻底解决了 z-index 层级混乱的痛点。
  • Invoker Commands(命令触发器):这是 2025 年最令人兴奋的特性之一。通过 commandforcommand 属性,我们可以直接在按钮上声明它要触发的操作(如 show-modaltoggle-popover),甚至可以自定义命令,让 HTML 逻辑更加直观。
  • Interest Invokers(兴趣触发器):配合 popover="hint"interestfor 属性让我们可以仅通过 HTML 实现“悬停即显示”的工具提示(Tooltip)或预览卡片,而无需复杂的 mouseenter/mouseleave 监听。
  • 可定制的 select 元素:困扰前端多年的 <select> 样式难题终于有了官方解法。通过 appearance: base-select,我们可以像操作普通 HTML 元素一样,使用 CSS 深度定制下拉菜单的样式,甚至在 <option> 里嵌入图片。
  • 锚点定位(Anchor Positioning)的深度集成:到 2026 年,锚点定位将与 Popover 深度融合,使得弹窗能够根据目标元素的位置自动对齐和避让,这曾是 Popper.js 等库的专属领域,现在 HTML/CSS 就能搞定。

HTML 基础

HTML 是一种标签语言,通过使用标签来描述网页的各种元素,一个典型的 HTML 文档结构如下所示:

<!-- 文档类型声明 -->
<!DOCTYPE html>
<!-- 文档根元素 -->
<html lang="en">
<head>
  <!-- 描述网页字符编码 -->
  <meta charset="UTF-8">
  <!-- 描述窗口属性 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <!-- 描述网页标题 -->
  <title>文档标题</title>
</head>
<!-- 文档内容元素 -->
<body>
    <!-- 描述网页头部 -->
    <header>
        <!-- 描述网站标题 -->
        <h1>网站标题</h1>
        <!-- 描述网站导航 -->
        <nav>
            <ul>
                <li><a href="#section1">首页</a></li>
                <li><a href="#section2">关于我们</a></li>
                <li><a href="#section3">联系我们</a></li>
            </ul>
        </nav>
    </header>
    <!-- 描述网站内容 -->
    <main>
        <section id="section1">
            <h2>首页</h2>
            <p>欢迎来到我们的网站!</p>
        </section>
        <section id="section2">
            <h2>关于我们</h2>
            <p>我们是一家专注于技术创新的公司。</p>
        </section>
        <section id="section3">
            <h2>联系我们</h2>
            <p>邮箱: contact@example.com</p>
        </section>
    </main>
    <!-- 描述网站底部 -->
    <footer>
        <p>版权所有 © 2023</p>
    </footer>
</body>
</html>

从上面可以看到 HTML 有很多基础但非常重要的元素,也是我们用的比较多的:

  • 文档类型声明<!DOCTYPE html> 声明文档类型,告诉浏览器这是一个 HTML5 文档。
  • 根元素<html> 文档的根元素,包含整个 HTML 文档的内容,lang 属性指定文档的主要语言。
  • 头部信息<head><meta><title> 包含文档的元数据,如字符集声明、视口设置、标题等。
  • 主体内容<body> 包含文档的所有可见内容,如文本、图像、链接等。
  • 标题<h1><h6> 定义标题,<h1> 是最高级别的标题,<h6> 是最低级别的标题。
  • 段落<p> 定义段落,用于组织和格式化文本。
  • 链接<a> 定义超链接,href 属性指定链接的目标地址。
  • 图像<img> 嵌入图像,src 属性指定图像的路径,alt 属性提供替代文本。
  • 列表<ul><ol> 分别定义无序列表和有序列表。<li> 定义列表项。
  • 无语义容器<div> 是块级元素,用于组织较大的内容结构;<span> 是内联元素,用于包裹小段文本或行内内容。它们在没有合适语义标签时作为“最后的手段”使用。
  • 语义化标签<header> 定义页面或区域的头部,<nav> 定义导航链接,<main> 定义文档的主要内容,<section> 定义文档中的独立部分,<article> 定义独立的内容,如博客文章或新闻报道。<aside> 定义侧边栏或与主要内容相关的辅助信息。<footer> 定义页面或区域的底部。

语义化标签

语义化标签通过提供更具描述性的标签来增强网页的结构和意义。使用语义化标签可以使代码更加清晰、易于维护,并且对搜索引擎和辅助技术(如屏幕阅读器)更加友好。以下是一些常见的语义化标签及其用途:

  • header:定义文档或节的头部,通常包含导航链接、标志、搜索框等。
  • nav:定义导航链接的集合,通常用于页面的主要导航菜单。
  • main:定义文档的主要内容,该内容与文档的其他部分(如侧边栏、页脚等)不同,是页面的核心内容。
  • section:定义文档中的独立部分,通常用于将内容分成多个逻辑部分。
  • article:定义独立的内容,如博客文章、新闻报道等,可以独立于文档的其他部分存在。
  • aside:通常用于侧边栏或注释。
  • search:定义文档中用于搜索或过滤的部分。它不仅能让搜索引擎更好地识别搜索功能,还能提升屏幕阅读器用户的导航效率。
  • footer:定义文档或节的底部,通常包含版权信息、联系方式等。
  • details 和 summary:用于创建交互式的折叠区域。<summary> 是可见的标题,点击可展开 <details> 内部的详细内容,无需 JS 即可实现 FAQ 或手风琴效果。
  • time:表示日期或时间。通过 datetime 属性提供机器可读的格式,有助于搜索引擎和日历解析。
  • mark:用于突出显示文本(如搜索关键词高亮),具有特定的视觉样式和语义含义。
  • figure 和 figcaption<figure> 用于包含图像、图表、视频等内容,<figcaption> 用于为这些内容提供标题或说明。

语义化标签的优势

  1. 可读性和可维护性:使用语义化标签可以使代码更易于理解和维护,因为每个标签都有明确的含义。

  2. 区分内容结构:例如 section 用于逻辑分段,而 article 用于可独立分发的内容(如博客帖子)。这种区分让文档树(Outline)更加清晰。

  3. 搜索引擎优化(SEO):搜索引擎可以更好地理解页面的结构和内容,从而提高搜索排名。

  4. 可访问性:屏幕阅读器和其他辅助技术可以更准确地解析和呈现内容,提高残障用户的访问体验。例如,nav 标签能让用户直接跳过导航进入主内容。

  5. 未来兼容性:语义化标签遵循标准,更容易适应未来的浏览器和技术发展。

表单与用户交互

网页中用户交互行为最多的就是表单、按钮了,一般就是输入些账号密码做登录、输入表单项内容,点击按钮发送事件。

  • form:定义一个表单,包含用户可以填写和提交的控件。
  • input:定义输入控件,通过 type 属性支持 text, password, email, number, date, range 等多种类型。
  • textarea:定义多行文本输入框。
  • button:定义一个按钮,默认 type="submit"
  • datalist:为 input 提供一组预定义的选项列表,实现带搜索建议的输入框。
  • output:用于展示计算结果或脚本输出。
  • progress 和 meter:分别用于显示任务进度和已知范围内的标量测量(如磁盘空间)。
  • popovertarget:指定按钮要控制的弹出层 ID。
  • commandfor:指定按钮要触发命令的目标元素 ID。

原生表单校验

现代 HTML 提供了强大的原生校验属性,减少了对简单 JS 校验的需求:

  • required:必填项。
  • pattern:使用正则表达式定义输入格式。
  • minlength / maxlength:限制字符长度。
  • min / max:限制数值或日期的范围。

这些新属性的加入,使得许多原本需要 JS 监听点击事件才能完成的工作,现在只需要在 HTML 中声明即可。

多媒体内容

HTML5 引入了 <audio><video> 标签,使得嵌入音频和视频内容变得更加简单和直接。

audio

audio 标签用于嵌入音频文件,支持多种音频格式,如 MP3WAVOGG

基本语法

<audio src="path/to/audio.mp3" controls>
    您的浏览器不支持 audio 元素。
</audio>

常用属性

  • src:指定音频文件的路径。
  • controls:显示播放器控件(播放、暂停、音量等)。
  • autoplay:音频文件加载完成后自动播放。
  • loop:音频文件播放结束后重新开始播放。
  • muted:静音播放音频。
  • preload:指定音频文件的预加载行为(auto、metadata、none)。

多源文件:为了提高兼容性,可以提供多个源文件,浏览器会选择第一个支持的格式。

<audio controls>
    <source src="music.mp3" type="audio/mpeg">
    <source src="music.ogg" type="audio/ogg">
    您的浏览器不支持 audio 元素。
</audio>

video

video 标签用于嵌入视频文件,支持多种视频格式,如 MP4、WebM 和 OGG。

基本语法

<video src="path/to/video.mp4" controls>
    您的浏览器不支持 video 元素。
</video>

常用属性

  • src:指定视频文件的路径。
  • controls:显示播放器控件(播放、暂停、音量等)。
  • autoplay:视频文件加载完成后自动播放。
  • loop:视频文件播放结束后重新开始播放。
  • muted:静音播放视频。
  • preload:指定视频文件的预加载行为(auto、metadata、none)。
  • poster:指定视频播放前显示的图像。
  • playsinline:在移动端浏览器上,允许视频在页面内播放而非自动进入全屏。

媒体资源优化

  • 懒加载 (loading="lazy"):为 imgiframe 设置 loading="lazy",可以让浏览器在用户滚动到该位置时再加载资源,显著提升页面首屏加载速度。
  • 现代格式支持:优先使用 WebP (图片) 和 WebM (视频) 格式,它们比传统的 JPEG/MP4 具有更好的压缩率。
  • Object-fit 适配:配合 CSS 的 object-fit 属性(如 cover, contain),可以更优雅地处理多媒体内容的比例缩放。

多源文件:为了提高兼容性,可以提供多个源文件,浏览器会选择第一个支持的格式。

<video controls>
    <source src="movie.mp4" type="video/mp4">
    <source src="movie.webm" type="video/webm">
    您的浏览器不支持 video 元素。
</video>

track

<track> 标签用于为 <audio><video> 提供外部文本轨道,如字幕、描述和章节。

基本语法

<track src="subtitles.vtt" kind="subtitles" srclang="en" label="English">

常用属性

  • src:指定文本轨道文件的路径。
  • kind:指定轨道的类型(subtitlescaptionsdescriptionschaptersmetadata)。
  • srclang:指定轨道的语言。
  • label:指定轨道的标签,用于用户选择。

响应式设计

通过使用响应式设计,网页可以根据用户的设备(如桌面、平板电脑、手机)自动调整布局和内容,确保在任何设备上都能流畅地显示和操作。

响应式设计的基本原理

  • 流式布局(Fluid Layouts):使用百分比而不是固定像素来定义元素的宽度,使布局能够根据屏幕尺寸动态调整。
  • 媒体查询(Media Queries):使用 CSS 媒体查询来针对不同的屏幕尺寸应用不同的样式规则。
  • 弹性图片(Flexible Images):通过设置图片的最大宽度为 100%,使其在不同屏幕尺寸下自动缩放。
  • 响应式图片标签:利用 <img>srcsetsizes 属性,或者使用 <picture> 标签,根据设备像素比或屏幕宽度加载最合适的图片资源。
<picture>
  <source srcset="large.webp" media="(min-width: 800px)">
  <source srcset="medium.webp" media="(min-width: 450px)">
  <img src="small.jpg" alt="响应式示例">
</picture>

Web Accessibility

Web Accessibility 指的是确保网站和应用程序可以被所有人访问,无论他们是否有残疾。这包括视觉障碍、听觉障碍、运动障碍和认知障碍等。通过实施无障碍设计,可以提高网站的可用性和用户体验,扩大潜在用户群体。

实现 Web Accessibility 的基本原则

感知性

信息和用户界面组件必须以用户可以感知的方式呈现。

  • 文本替代:为图像、视频和音频提供替代文本(如 alt 属性)。
  • 颜色对比:确保文本和背景之间的颜色对比度足够高。

可操作性

用户界面组件和导航必须可以用多种方式操作,而不仅仅是鼠标。

  • 键盘导航:确保所有功能都可以通过键盘操作。
  • 时间限制:避免或提供延长时间限制的选项。

可理解性

信息和操作必须易于理解。

  • 简洁语言:使用简单明了的语言。
  • 一致的导航:保持导航结构的一致性。

健壮性

内容必须能够被各种用户代理(包括辅助技术)可靠地解析。

  • 语义化 HTML:使用语义化的 HTML 标签。
  • ARIA 属性:使用 ARIA(Accessible Rich Internet Applications)属性增强可访问性。例如 aria-label 为没有文本内容的按钮提供描述,aria-hidden="true" 隐藏装饰性元素。
  • tabindex 属性:控制元素在键盘导航中的顺序。tabindex="0" 让不可聚焦元素(如 div)变得可聚焦;tabindex="-1" 允许脚本聚焦但从 Tab 键顺序中移除。
  • Role 角色定义:通过 role 属性显式定义元素的角色(如 role="button", role="tab"),在无法使用原生语义标签时,告知辅助技术该元素的真实功能。

Web Components

随着 Web 规范的成熟,HTML 已经内置了实现“组件化”的能力,即 Web Components。它由三项核心技术组成:

  • Custom Elements:允许开发者定义自定义 HTML 标签(如 <my-card>),并为其编写自定义行为。
  • Shadow DOM:提供 CSS 和 DOM 的封装,确保组件内部的样式不会泄露到外部,也不会被外部样式意外干扰。
  • HTML Templates (<template><slot>):用于定义 HTML 结构模板,并通过插槽(Slot)实现内容分发。
<template id="user-card-template">
  <style>
    .card { border: 1px solid #ccc; padding: 10px; }
  </style>
  <div class="card">
    <slot name="username">Default Name</slot>
  </div>
</template>

HTML 与安全

HTML 也是前端安全的第一道防线。通过合理配置属性,可以有效防御 XSS(跨站脚本攻击)等常见威胁:

  • CSP (Content Security Policy):通过 <meta http-equiv="Content-Security-Policy" ...> 限制资源加载来源。
  • iframe sandbox:为 <iframe> 添加 sandbox 属性,限制其执行脚本、提交表单或弹出窗口的能力。
  • rel="noopener":在使用 target="_blank" 的链接中加入 rel="noopener"rel="noreferrer",防止新窗口通过 window.opener 访问原窗口对象。
  • HttpOnly 和 Secure:虽然是 Cookie 的属性,但与 HTML 的数据传输和状态管理息息相关,确保敏感数据不会被恶意脚本读取。

性能优化

HTML 性能优化是提高网页加载速度和用户体验的关键步骤。

减少 HTTP 请求

  • 合并文件:将多个 CSS 文件和 JavaScript 文件合并成一个文件,减少 HTTP 请求次数。
  • 使用 Sprites:将多个小图标合并成一张大的图像,通过 CSS 背景定位来显示不同的图标。
  • 内联小资源:对于非常小的资源(如小图标或 CSS),可以直接将其内联到 HTML 中,减少额外的请求。

压缩文件

  • 压缩 HTML:去除不必要的空格、注释和换行,减小文件大小。
  • 压缩 CSS 和 JavaScript:使用工具(如 UglifyJSCSSNano)压缩 CSS 和 JavaScript 文件,减小文件大小。
  • 启用 Gzip 压缩:在服务器端启用 Gzip 压缩,进一步减小传输文件的大小。

优化图片

  • 选择合适的格式:根据图片的特性选择合适的格式(如 JPEG、PNG、WebP)。
  • 压缩图片:使用工具(如 TinyPNGImageOptim)压缩图片,减小文件大小。
  • 使用懒加载:延迟加载非关键图片,直到用户滚动到它们的位置。
  • 使用响应式图片:使用 srcsetsizes 属性,根据设备的屏幕尺寸加载适当大小的图片。

优化 CSS

  • 避免使用 @import:@import 会阻塞并延迟 CSS 的加载,使用 <link> 标签代替。
  • 使用媒体查询:将媒体查询放在 CSS 文件的顶部,以便浏览器尽早解析。
  • 避免使用通配符选择器:通配符选择器(如 *)会导致浏览器执行大量的样式计算,影响性能。

优化 JavaScript

  • 异步加载:使用 asyncdefer 属性异步加载 JavaScript 文件,避免阻塞页面渲染。
  • 利用 blocking="render":对于关键的 CSS 或脚本,可以使用 blocking="render" 属性显式告知浏览器在解析该资源前暂停渲染,以避免“无样式内容闪烁”(FOUC)。
  • 减少 DOM 操作:尽量减少对 DOM 的频繁操作,使用批量更新和事件委托。
  • 使用模块化:将 JavaScript 代码模块化,按需加载必要的模块。

优化资源加载优先级

  • fetchpriority:使用 fetchpriority 属性(如 high, low)显式告诉浏览器哪些资源最重要(如 LCP 图像),从而优化加载顺序。
  • 预加载关键资源:使用 <link rel="preload"> 预加载字体、核心 JS 或 CSS,缩短关键路径。

优化 HTML 结构

  • 使用语义化标签:使用语义化的 HTML 标签,有助于浏览器和搜索引擎更好地理解页面结构。
  • 使用 inert 属性:对于暂时不需要交互的区域(如模态框背后的内容),使用 inert 属性可以快速禁用该区域的所有交互,不仅提升性能,还能增强无障碍体验。
  • 减少嵌套层级:尽量减少 HTML 的嵌套层级,简化 DOM 结构。
  • 避免使用内联样式:将样式放在外部 CSS 文件中,避免内联样式导致的重复和冗余。

缓存策略

  • 设置缓存头:在服务器端设置适当的缓存头(如 Cache-Control 和 Expires),使浏览器缓存静态资源。
  • 使用版本控制:在文件名中包含版本号,确保用户在更新文件时能够获取最新版本。

优化第三方资源

  • 减少第三方脚本:尽量减少第三方脚本的数量,特别是那些可能阻塞页面加载的脚本。
  • 使用 CDN:使用内容分发网络(CDN)加载第三方资源,提高加载速度。

使用现代 Web 技术

  • 使用 WebP 图片格式WebP 格式提供了更好的压缩率和质量,适用于现代浏览器。
  • 使用 Service Workers:使用 Service Workers 缓存静态资源,实现离线访问和快速加载。
  • 使用 HTTP/2HTTP/2 提供了多路复用和头部压缩等特性,显著提高性能。

SEO:让内容更具传播力

正如我在引言中提到的,我的前端之路始于 SEO 网站编辑。HTML 不仅仅是给浏览器看的,更是给搜索引擎的爬虫(Spider)看的。良好的 HTML 结构是 SEO 的基石。

  • TDK 标签的艺术
    • <title>:网页的灵魂,应包含核心关键词。
    • <meta name="description">:网页的简介,直接影响搜索结果页(SERP)的点击率。
    • <meta name="keywords">:虽然权重降低,但在某些场景下仍有参考价值。
  • 合理的标题层级 (H1-H6):确保一个页面只有一个 <h1>,并按照逻辑顺序使用 <h2><h6>。这就像一本书的目录,帮助爬虫快速理解页面主题。
  • 语义化的深度应用:使用 <article><section><nav><aside> 等标签,能让爬虫更精准地抓取核心内容,过滤掉侧边栏或广告等干扰信息。
  • 图像的 alt 属性:爬虫“看不懂”图片,alt 属性是它们理解图片内容的唯一途径,同时也是无障碍设计的关键。
  • 结构化数据 (JSON-LD):通过 <script type="application/ld+json"> 嵌入结构化数据,可以向搜索引擎提供更丰富的信息(如评分、价格、活动时间),从而在搜索结果中获得“丰富摘要”(Rich Snippets)展示。
  • 规范链接 (Canonical Link):使用 <link rel="canonical" href="..."> 防止因 URL 参数不同导致的重复内容惩罚。
  • 移动优先与适配:通过 <meta name="viewport"> 确保移动端友好,这在当今“移动优先”的索引策略下至关重要。

良好的 SEO 并不是作弊,而是通过规范的 HTML 编写,让优质的内容更容易被需要它的人找到。