HTML-从0开始-20260408

3 阅读46分钟

HTML

一、HTML 全局属性

1. HTML 全局属性有哪些?

问题:HTML 全局属性有哪些?

答案核心回答:HTML 全局属性是所有 HTML 元素都可以使用的属性。

详细说明:全局属性可以用于任何 HTML 元素,即使某些属性对某些元素可能没有作用。

常用全局属性

属性描述
id元素的唯一标识符
class元素的类名(可多个,用空格分隔)
style内联 CSS 样式
title元素的额外信息(鼠标悬停时显示)
data-*自定义数据属性,用于存储页面或应用中私有的数据
lang元素内容的语言
dir文本方向(ltr/rtl)
accesskey快捷键
tabindex元素是否可被聚焦,以及是否/如何参与顺序键盘导航
hidden表示元素不相关,浏览器不显示
contenteditable元素内容是否可编辑
draggable元素是否可拖拽
spellcheck是否进行拼写和语法检查

代码示例

<!-- id 全局属性 -->
<div id="unique-element">唯一元素</div>

<!-- data-* 全局属性 -->
<div data-user-id="12345" data-role="admin">用户信息</div>

<!-- contenteditable 全局属性 -->
<p contenteditable="true">这段文字可以编辑</p>

<!-- title 全局属性 -->
<a href="https://example.com" title="访问示例网站">示例链接</a>

补充说明

  • data-* 属性可以通过 JavaScript 的 dataset 属性访问
  • accesskey 的快捷键组合因浏览器而异(Chrome 需要 Alt+快捷键)
  • HTML5 引入了许多新的全局属性,增强了语义化和交互性

2. HTML 全局属性有哪些(深入)?

问题:HTML 全局属性有哪些?

答案核心回答:HTML5 定义了完整的全局属性集合,涵盖了标识、样式、元数据、无障碍和事件处理等方面。

详细说明

核心全局属性

<!-- 基本属性 -->
<div id="main" class="container" style="padding: 10px;">
  内容
</div>

<!-- 元数据属性 -->
<html lang="zh-CN">
<meta charset="UTF-8">

<!-- 事件处理属性(通常通过 JavaScript 使用) -->
<button onclick="handleClick()">点击</button>

<!-- ARIA 属性(无障碍访问) -->
<nav aria-label="主导航">
  <ul>
    <li><a href="/" aria-current="page">首页</a></li>
  </ul>
</nav>

自定义数据属性(data-*)使用示例

// 获取 data-* 属性
const element = document.querySelector('[data-user-id]');
const userId = element.dataset.userId;    // "12345"
const role = element.dataset.role;         // "admin"

// 设置 data-* 属性
element.dataset.productId = '5678';

补充说明

  • ARIA 属性(如 aria-*)用于增强屏幕阅读器的可访问性支持
  • hidden 属性在 HTML5 中相当于 display: none
  • 全局属性可以被所有元素继承

二、HTML 基础元素

3. 默认块级元素(至少 3 个)和行内元素(至少 3 个)

问题:默认块级元素(至少 3 个)和行内元素(至少 3 个)

答案核心回答:块级元素独占一行,默认宽度100%;行内元素不独占一行,宽度由内容决定。

详细说明

常见块级元素

元素描述
<div>无语义容器
<p>段落
<h1>-<h6>标题(h1最大,h6最小)
<ul>无序列表
<ol>有序列表
<li>列表项
<table>表格
<form>表单
<header>头部区域
<footer>底部区域
<section>区块
<article>文章
<aside>侧边栏
<nav>导航
<blockquote>块级引用

常见行内元素

元素描述
<span>无语义容器
<a>链接
<strong>强调(粗体)
<em>强调(斜体)
<img>图片
<input>输入框
<button>按钮
<label>标签
<select>下拉选择
<textarea>多行文本输入
<b>粗体(无语义)
<i>斜体(无语义)

代码示例

<!-- 块级元素示例 -->
<div>独占一行</div>
<p>段落也是块级</p>

<!-- 行内元素示例 -->
<span>在一行内</span>
<a href="#">链接</a>
<strong>强调</strong>

补充说明

  • 可以通过 CSS 的 display 属性改变元素的默认显示类型
  • 块级元素可以包含行内元素,反之不行(<a> 可以包含块级元素在 HTML5 中是合法的)
  • 语义化标签(header、nav、article等)默认也是块级元素

4. 列举默认的块级元素和行内元素(至少 15 个)

问题:列举默认的块级元素和行内元素(至少 15 个)

答案核心回答:HTML 元素根据默认 display 值的不同,分为块级元素和行内元素两大类。

详细说明

块级元素(至少15个)

div, p, h1, h2, h3, h4, h5, h6,
ul, ol, li, dl, dt, dd,
table, form, header, footer, nav,
section, article, aside, main,
blockquote, pre, hr, address

行内元素(至少15个)

span, a, strong, em, b, i, u, s,
img, input, button, label, select,
textarea, br, small, sub, sup,
mark, code, kbd, samp, time

代码示例

<!-- 块级元素特点:独占一行,可设置宽高 -->
<style>
  .block-demo div {
    background: #f0f0f0;
    margin: 10px 0;
    padding: 10px;
  }
</style>
<div class="block-demo">
  <div>第一个 div(块级)</div>
  <div>第二个 div(块级)</div>
</div>

<!-- 行内元素特点:不独占一行,宽高由内容决定 -->
<style>
  .inline-demo span {
    background: #e0e0e0;
    padding: 5px;
    /* 注意:设置宽高对行内元素无效 */
  }
</style>
<span class="inline-demo">
  <span>第一个 span</span>
  <span>第二个 span</span>
</span>

补充说明

  • display: inline-block 可以让元素不独占一行但又能设置宽高
  • HTML5 的语义化标签(如 article、section、nav)都是块级元素
  • 行内元素设置 margin-top/margin-bottom 不生效,设置 padding-top/padding-bottom 可生效但不影响布局

5. 元素分类区别(行内元素、块级元素、空元素)

问题:元素分类区别(行内元素、块级元素、空元素)

答案核心回答:HTML 元素按显示类型分为块级元素、行内元素、空元素,它们在布局行为、尺寸特征和内容限制上有显著区别。

详细说明

特征块级元素行内元素空元素
布局独占一行不独占一行不独占一行
宽度默认100%由内容决定由内容决定
高度由内容决定由内容决定由内容决定
可设置宽高否(可用inline-block)部分是
垂直方向margin生效不生效部分生效
包含子元素可包含块级/行内只能包含行内(HTML5除外)

空元素(Void Elements)

area, base, br, col, embed, hr, img, 
input, link, meta, param, source, track, wbr

代码示例

<!-- 块级与行内元素对比 -->
<style>
  .demo {
    border: 1px solid #333;
    margin: 10px;
    padding: 10px;
  }
  .inline-block {
    display: inline-block; /* 兼具两者特点 */
    width: 200px;
  }
</style>

<div class="demo">
  <p style="background: yellow;">块级 p 元素</p>
  <span style="background: blue; color: white;">行内 span 元素</span>
</div>

<!-- 空元素示例 -->
<hr> <!-- 水平线 -->
<img src="logo.png" alt="Logo"> <!-- 图片 -->
<input type="text" placeholder="输入框"> <!-- 输入框 -->
<br> <!-- 换行 -->

补充说明

  • 空元素不能包含任何子元素,因为它们没有结束标签
  • HTML5 中 <p> 不能再包含块级元素,但 <a> 可以包含块级元素
  • 使用 display: inline-block 可以让块级元素不独占一行

6. 行内元素、块级元素及空元素(void)的常见标签

问题:行内元素、块级元素及空元素(void)的常见标签

答案核心回答:行内元素、块级元素和空元素是 HTML 元素的三种主要分类,它们在文档流和布局中有不同的行为表现。

详细说明

行内元素(Inline Elements)

<!-- 文本相关 -->
<span><a><strong><em><b><i><u><s>
<small><sub><sup><mark><code><kbd>

<!-- 表单相关 -->
<input><label><button><select><textarea>

<!-- 媒体相关 -->
<img><audio><video>(可设置宽高)

<!-- 其他 -->
<br><time><span>

块级元素(Block Elements)

<!-- 文档结构 -->
<div><p><h1>-<h6><hr>

<!-- 列表 -->
<ul><ol><li><dl><dt><dd>

<!-- 表格与表单 -->
<table><form><fieldset><legend>

<!-- 语义化结构 -->
<header><footer><nav><main><section>
<article><aside><figure><figcaption>

<!-- 其他 -->
<blockquote><pre><address>

空元素(Void Elements)

<!-- 换行与分隔 -->
<br><hr>

<!-- 链接资源 -->
<img><area><link><meta>

<!-- 表单相关 -->
<input><col><source><track><embed><param><wbr>

代码示例

<!-- 行内元素:不独占一行 -->
<p>
  文字中间有
  <strong>强调内容</strong><a href="#">链接</a>
</p>

<!-- 空元素:没有闭合标签 -->
<img src="image.png" alt="图片">
<input type="text" name="username">
<br>
<hr>

补充说明

  • 空元素在 HTML5 中不再要求使用自闭合写法(如 <br/>),直接 <br> 即可
  • 空元素不能使用 CSS 的 ::before::after 伪元素(因为没有内容)
  • 行内元素设置 width/height 无效,需要先转换为 inline-blockblock

三、HTML5 新特性与语义化标签

7. HTML 的定义和基本结构

问题:HTML 的定义和基本结构

答案核心回答:HTML(HyperText Markup Language)是超文本标记语言,用于描述网页的结构和内容。

详细说明

HTML 定义

  • HTML 是一种标记语言,不是编程语言
  • 通过标签(tags)来描述网页结构
  • HTML 文档也被称为 Web 页面

HTML 基本结构

<!DOCTYPE html>                    <!-- 文档类型声明 -->
<html lang="zh-CN">                <!-- 根元素,lang 属性声明语言 -->
<head>                             <!-- 头部信息,不可见 -->
    <meta charset="UTF-8">        <!-- 字符编码 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>页面标题</title>         <!-- 浏览器标签页标题 -->
    <meta name="description" content="页面描述"> <!-- SEO 描述 -->
    <link rel="stylesheet" href="styles.css">  <!-- 外部样式 -->
    <style>/* 内联样式 */</style>    <!-- 内联样式 -->
</head>
<body>                             <!-- 主体内容,可见 -->
    <header>                       <!-- 页头 -->
        <nav></nav>                <!-- 导航 -->
    </header>
    <main>                         <!-- 主内容 -->
        <article>
            <section></section>
        </article>
        <aside></aside>            <!-- 侧边栏 -->
    </main>
    <footer></footer>              <!-- 页脚 -->
    <script src="app.js"></script>  <!-- 脚本 -->
</body>
</html>

补充说明

  • <!DOCTYPE html> 声明帮助浏览器正确渲染页面
  • <head> 中的内容不会直接显示在页面上
  • <body> 中的内容是用户可见的区域
  • HTML5 语义化标签使文档结构更清晰,有利于 SEO 和无障碍访问

8. HTML 文档的标准组成部分

问题:HTML 文档的标准组成部分

答案答案核心回答:HTML 文档由 DOCTYPE 声明、html 元素、head 头部和 body 主体四部分组成。

详细说明

部分标签作用
文档类型<!DOCTYPE html>声明文档类型和版本
根元素<html>包含整个文档内容
头部<head>包含元数据、标题、样式等
主体<body>包含可见的页面内容

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <!-- 字符编码(必须放在前 1024 字节内) -->
    <meta charset="UTF-8">
    
    <!-- 视口设置(移动端适配) -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <!-- 页面标题(必填,影响 SEO) -->
    <title>页面标题</title>
    
    <!-- 其他 meta 信息 -->
    <meta name="keywords" content="关键词1, 关键词2">
    <meta name="description" content="页面描述">
    
    <!-- 外部资源链接 -->
    <link rel="stylesheet" href="style.css">
    <link rel="icon" href="favicon.ico">
    
    <!-- 脚本(通常放在 body 末尾) -->
    <script src="main.js" defer></script>
</head>
<body>
    <!-- 页面内容 -->
    <header>
        <h1>网站标题</h1>
    </header>
    
    <main>
        <article>
            <h2>文章标题</h2>
            <p>文章内容...</p>
        </article>
    </main>
    
    <footer>
        <p>&copy; 2024 公司名称</p>
    </footer>
</body>
</html>

补充说明

  • <meta charset="UTF-8"> 应放在 <head> 靠前位置
  • 移动端开发必须设置视口(viewport)meta 标签
  • <title> 是 SEO 中最重要的标签之一
  • 外部样式表通常放在 <head> 中,脚本放在 <body> 末尾

9. <!DOCTYPE> 的作用及 HTML5 意义

问题<!DOCTYPE> 的作用及 HTML5 意义

答案核心回答<!DOCTYPE> 声明文档类型,告诉浏览器使用哪种 HTML 规范来解析和渲染页面。

详细说明

DOCTYPE 的作用

  1. 标准模式声明:告诉浏览器使用 W3C 标准渲染页面
  2. 避免兼容模式:防止浏览器使用旧的 Quirks Mode 渲染
  3. 一致性保证:确保不同浏览器有相同的解析规则

HTML5 DOCTYPE 的意义

<!-- HTML5 之前,需要复杂冗长的 DOCTYPE -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

<!-- HTML5 简化至极 -->
<!DOCTYPE html>

HTML5 的改进

方面HTML4HTML5
DOCTYPE复杂冗长极简
语义化有限丰富(header、nav、section 等)
多媒体需要插件原生支持(video、audio)
表单基础类型多种新类型(email、date 等)
API有限丰富(Canvas、Geolocation 等)
移动支持原生支持

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>HTML5 页面</title>
</head>
<body>
    <!-- HTML5 新特性 -->
    <header>HTML5 头部</header>
    <nav>导航</nav>
    <main>
        <section>
            <video src="movie.mp4" controls></video>
            <audio src="music.mp3" controls></audio>
        </section>
    </main>
    <footer>页脚</footer>
</body>
</html>

补充说明

  • 没有 DOCTYPE 声明,浏览器会使用 Quirks Mode(兼容模式)渲染
  • HTML5 DOCTYPE 所有现代浏览器都支持
  • HTML5 不仅是 DOCTYPE 的简化,更是整个语言的重大的升级

10. HTML5 主要新特性

问题:HTML5 主要新特性

答案核心回答:HTML5 引入了语义化标签、原生多媒体支持、表单增强、Canvas 绘图、API 扩展等众多新特性。

详细说明

语义化标签

<header><nav><main><section><article><aside><footer><figure><figcaption>

原生多媒体

<!-- 视频播放 -->
<video src="video.mp4" controls width="640" height="480">
    您的浏览器不支持 video 标签
</video>

<!-- 音频播放 -->
<audio src="music.mp3" controls>
    您的浏览器不支持 audio 标签
</audio>

表单增强

<input type="email" placeholder="请输入邮箱">
<input type="date" min="2024-01-01" max="2024-12-31">
<input type="range" min="0" max="100">
<input type="color" value="#ff0000">
<input type="tel" pattern="[0-9]{11}">
<input type="url" placeholder="请输入网址">
<input type="number" step="0.01">
<input type="search" results="5">
<input type="datetime-local">

Canvas 绘图

<canvas id="myCanvas" width="500" height="300">
    您的浏览器不支持 canvas
</canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#FF0000';
ctx.fillRect(0, 0, 100, 100);
</script>

其他新特性

特性描述
localStorage/sessionStorage客户端存储
Web Workers后台线程
Geolocation地理位置
Drag and Drop拖拽 API
SVG矢量图形
WebSocket双向通信
History API历史记录管理

补充说明

  • HTML5 大幅减少了了对 Flash、Silverlight 等插件的依赖
  • 语义化标签有助于 SEO 和屏幕阅读器支持
  • 表单新类型提供了原生的客户端验证功能

11. 新增语义化标签及场景

问题:新增语义化标签及场景

答案核心回答:HTML5 新增了多种语义化标签,使文档结构更清晰,更利于 SEO 和无障碍访问。

详细说明

标签描述使用场景
<header>页面或区块的头部页头、区块标题、文章头部
<nav>导航链接主导航、面包屑导航
<main>文档主内容页面核心内容区域
<section>文档区块章节、主题分组
<article>独立文章博客文章、新闻、帖子
<aside>侧边栏相关文章、广告、侧边导航
<footer>页面或区块的底部页脚、版权信息、相关链接
<figure>独立流内容图片、图表、代码块
<figcaption>figure 的标题图片说明、图表标题
<mark>标记的文本搜索高亮、引用标记
<time>日期时间发布时间、事件时间
<details>可展开详情折叠面板、FAQ
<summary>details 的标题折叠面板标题

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>语义化标签示例</title>
</head>
<body>
    <header>
        <h1>我的博客</h1>
        <nav>
            <ul>
                <li><a href="/">首页</a></li>
                <li><a href="/about">关于</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <article>
            <header>
                <h2>文章标题</h2>
                <time datetime="2024-01-15">2024年1月15日</time>
            </header>
            <p>文章正文内容...</p>
            <figure>
                <img src="chart.png" alt="数据图表">
                <figcaption>图1: 2024年数据趋势</figcaption>
            </figure>
            <details>
                <summary>点击展开评论</summary>
                <p>评论内容...</p>
            </details>
        </article>

        <aside>
            <h3>相关文章</h3>
            <ul>
                <li><a href="#">相关文章1</a></li>
                <li><a href="#">相关文章2</a></li>
            </ul>
        </aside>
    </main>

    <footer>
        <p>&copy; 2024 我的博客</p>
    </footer>
</body>
</html>

补充说明

  • 语义化标签有助于搜索引擎理解页面结构
  • 屏幕阅读器用户可以通过语义标签快速导航
  • 不要滥用 div,只有关键语义时才使用语义化标签

12. 常见语义化标签

问题:常见语义化标签

答案核心回答:HTML5 语义化标签用于更清晰地表达文档结构,提升可访问性和 SEO 效果。

详细说明

标签语义常见用法
<header>头部页面顶部、区块头部、文章标题区
<nav>导航主导航、侧边导航、面包屑
<main>主内容页面核心内容(每个页面只用一次)
<section>区块文档的章节、专题
<article>文章博客文章、新闻、论坛帖子
<aside>侧边相关链接、广告、侧边栏
<footer>底部版权、联系方式、相关文档
<figure>插图图片、图表、代码片段
<figcaption>图片说明figure 内部标题
<time>时间日期、时间(机器可读)

代码示例

<!-- 博客页面结构 -->
<article>
    <header>
        <h1>博客标题</h1>
        <p><time datetime="2024-01-15T10:30">2024年1月15日 上午10:30</time></p>
    </header>
    
    <section>
        <h2>第一章</h2>
        <p>章节内容...</p>
    </section>
    
    <section>
        <h2>第二章</h2>
        <p>章节内容...</p>
        <figure>
            <img src="diagram.png" alt="流程图">
            <figcaption>图1: 工作流程图</figcaption>
        </figure>
    </section>
    
    <footer>
        <nav aria-label="相关文章">
            <h3>相关文章</h3>
            <ul>
                <li><a href="#">相关文章1</a></li>
            </ul>
        </nav>
    </footer>
</article>

补充说明

  • 一个页面应该只有一个 <main> 元素
  • <article> 应该可以独立于页面其他部分而单独存在
  • <section> 通常包含一个 <h2>-<h6> 作为标题

13. HTML5 新增了哪些语义化标签

问题:HTML5 新增了哪些语义化标签

答案核心回答:HTML5 新增了 header、nav、main、section、article、aside、footer、figure、figcaption、time 等语义化标签。

详细说明

结构型语义化标签

<header>  <!-- 头部区域 -->
<nav>     <!-- 导航区域 -->
<main>    <!-- 主内容区域 -->
<section> <!-- 文档章节 -->
<article> <!-- 独立文章 -->
<aside>   <!-- 侧边栏 -->
<footer>  <!-- 底部区域 -->

内容型语义化标签

<figure>      <!-- 独立内容块 -->
<figcaption>  <!-- figure 的标题 -->
<time>        <!-- 日期时间 -->
<mark>        <!-- 标记文本 -->
<details>     <!-- 可展开详情 -->
<summary>     <!-- details 的标题 -->
<progress>    <!-- 进度条 -->
<meter>       <!-- 计量条 -->

代码示例

<!-- 完整页面结构 -->
<header>
    <h1>网站标题</h1>
    <nav>
        <a href="/">首页</a>
        <a href="/about">关于</a>
    </nav>
</header>

<main>
    <article>
        <header>
            <h2>文章标题</h2>
            <time datetime="2024-01-15">2024年1月15日</time>
        </header>
        
        <section>
            <p>第一部分内容...</p>
            <figure>
                <img src="image.jpg" alt="示例图片">
                <figcaption>图片说明</figcaption>
            </figure>
        </section>
        
        <section>
            <p>第二部分内容...</p>
            <details>
                <summary>查看更多</summary>
                <p>更多内容...</p>
            </details>
        </section>
    </article>
    
    <aside>
        <h3>相关文章</h3>
        <ul>
            <li><a href="#">链接1</a></li>
        </ul>
    </aside>
</main>

<footer>
    <p>&copy; 2024</p>
</footer>

补充说明

  • 使用语义化标签时应考虑实际语义,不要为了语义化而语义化
  • 语义化标签默认是块级元素
  • 旧版浏览器不支持语义化标签时,可使用 CSS 让它表现为块级

14. 语义化标签有哪些以及各自的使用场景

问题:语义化标签有哪些以及各自的使用场景

答案核心回答:HTML5 语义化标签使文档结构清晰,提升 SEO、无障碍访问和代码可维护性。

详细说明

标签使用场景
<header>页面顶部导航区、文章头部、区块头部
<nav>主导航、侧边栏导航、面包屑、底部导航
<main>页面主要内容,每个页面只用一次
<section>文档的章节,如章节、版本更新、特性介绍
<article>博客文章、新闻、论坛帖子、评论、卡片
<aside>侧边栏、广告、相关链接、标签云
<footer>页面底部、版权信息、联系方式、文档作者
<figure>图片、图表、代码块、引用、插图
<figcaption>figure 的标题或说明文字
<time>日期、时间、带机器可读格式
<mark>搜索高亮、引用中需要标记的文本
<details>FAQ、折叠面板、可展开的详细信息
<summary>details 的可见标题

代码示例

<body>
    <header>
        <h1>在线教育平台</h1>
        <nav>
            <ul>
                <li><a href="/courses">课程</a></li>
                <li><a href="/teachers">讲师</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <section>
            <h2>热门课程</h2>
            <article>
                <header>
                    <h3>JavaScript 入门</h3>
                    <time datetime="2024-01-10">2024年1月10日</time>
                </header>
                <p>课程介绍...</p>
                <figure>
                    <img src="js-course.jpg" alt="课程封面">
                    <figcaption>JavaScript 入门课程封面</figcaption>
                </figure>
            </article>
        </section>
    </main>

    <aside>
        <h3>热门标签</h3>
        <mark>前端</mark> <mark>JavaScript</mark> <mark>React</mark>
    </aside>

    <footer>
        <p>&copy; 2024 在线教育平台 | <time datetime="2024">2024</time></p>
    </footer>
</body>
</html>

补充说明

  • 不要用语义化标签做样式用途,应该用 div + class
  • article 可以嵌套 article,表示嵌套的文章与主文章有关联
  • section 不要作为样式容器使用,它有语义含义

15. 对 HTML 语义化的理解

问题:对 HTML 语义化的理解

答案核心回答:HTML 语义化是用合适的标签表达正确的含义,使页面结构清晰,利于 SEO、无障碍访问和代码维护。

详细说明

语义化的核心价值

  1. 可访问性(Accessibility):屏幕阅读器能正确识别内容结构
  2. 搜索引擎优化(SEO):搜索引擎能更好地理解页面内容
  3. 代码可维护性:开发者能快速理解代码结构
  4. 跨设备兼容:不同设备能正确解析内容

语义化 vs 非语义化

<!-- 非语义化:div 嵌套地狱 -->
<div class="header">
    <div class="nav">
        <div class="nav-item">导航项</div>
    </div>
</div>
<div class="content">
    <div class="article">
        <div class="title">标题</div>
        <div class="text">正文</div>
    </div>
</div>

<!-- 语义化:结构清晰 -->
<header>
    <nav>
        <a href="#">导航项</a>
    </nav>
</header>
<main>
    <article>
        <h1>标题</h1>
        <p>正文</p>
    </article>
</main>

代码示例

<!-- 正确使用语义化 -->
<article>
    <header>
        <h1>文章标题</h1>
        <p><time datetime="2024-01-15">2024年1月15日</time></p>
    </header>
    <p>文章正文...</p>
    <footer>
        <p>作者:张三</p>
    </footer>
</article>

<!-- 错误使用语义化 -->
<div class="article">
    <div class="header">
        <div class="title">文章标题</div>
    </div>
</div>

补充说明

  • 语义化不等于一定要用语义化标签,必要时可用 div
  • 语义化标签默认 display: block
  • HTML5 语义化标签兼容所有现代浏览器,旧浏览器需要额外处理

16. HTML 语义化的核心价值

问题:HTML 语义化的核心价值

答案核心回答:HTML 语义化的核心价值在于提升可访问性、SEO 效果、代码可维护性和跨设备兼容性。

详细说明

核心价值详解

核心价值说明示例
可访问性屏幕阅读器正确解析内容<nav> 让视障用户快速跳转导航
SEO搜索引擎理解页面结构<article> 帮助搜索引擎识别主要内容
可维护性开发者快速理解代码<header> 明确表示头部区域
设备兼容适配不同设备和场景语义化内容更容易被正确解析

代码示例

<!-- 无障碍访问示例 -->
<!-- 屏幕阅读器会正确识别并朗读 -->
<nav aria-label="主导航">
    <ul>
        <li><a href="/" aria-current="page">首页</a></li>
        <li><a href="/about">关于我们</a></li>
    </ul>
</nav>

<!-- SEO 优化示例 -->
<article>
    <header>
        <h1>如何学习 React</h1>
        <meta name="description" content="React 入门教程...">
    </header>
    <section>
        <h2>什么是 React</h2>
        <p>React 是 Facebook 开发的 UI 库...</p>
    </section>
</article>

<!-- 可维护性示例 -->
<!-- 新开发者看到结构就能理解 -->
<body>
    <header>顶部导航</header>
    <main>
        <article>主要内容</article>
        <aside>侧边栏</aside>
    </main>
    <footer>底部信息</footer>
</body>

补充说明

  • 语义化是前端开发的基本素养
  • 不要为了语义化而使用不合适的标签
  • 语义化和 CSS 样式可以完全分离

四、SEO 优化相关标签

17. SEO 优化注意事项

问题:SEO 优化注意事项

答案核心回答:SEO 优化需要关注标题标签、元描述、语义化标签、图片 alt 属性、页面加载速度等因素。

详细说明

Title 标签优化

  • 每个页面应该有唯一的 title
  • 控制在 60 个字符以内
  • 包含核心关键词
  • 品牌词放在最后

Meta 标签优化

<meta name="description" content="页面描述,150-160字符">
<meta name="keywords" content="关键词1, 关键词2">
<meta name="robots" content="index, follow">
<meta name="author" content="作者名称">

语义化标签使用

<!-- 使用语义化标签帮助搜索引擎理解结构 -->
<header>
    <h1>主标题(包含关键词)</h1>
</header>
<nav>导航链接</nav>
<main>
    <article>
        <h2>文章副标题</h2>
        <section>
            <h3>章节标题</h3>
        </section>
    </article>
</main>
<footer>版权信息</footer>

图片优化

<!-- 使用有意义的 alt 文本 -->
<img src="product.jpg" alt="蓝色运动鞋 - 男士跑步鞋">

<!-- 使用懒加载提升加载速度 -->
<img src="image.jpg" loading="lazy" alt="描述">

<!-- 指定图片尺寸减少重排 -->
<img src="image.jpg" width="800" height="600" alt="描述">

链接优化

<!-- 使用有描述性的链接文本 -->
<a href="/product/shoes/running-shoes">购买跑步鞋</a>
<!-- 避免:点击这里、了解更多 -->

<!-- 合理使用 nofollow -->
<a href="https://external-site.com" rel="nofollow">外部链接</a>

补充说明

  • HTTPS 对 SEO 有积极影响
  • 移动端适配是重要排名因素
  • 页面加载速度直接影响排名
  • 结构化数据(Schema.org)有助于搜索引擎理解内容

18. 从 SEO 角度提出 HTML 书写注意事项(至少 2 条)

问题:从 SEO 角度提出 HTML 书写注意事项(至少 2 条)

答案核心回答:SEO 优化的 HTML 书写需要注意语义化标签使用、标题元数据优化、图片 alt 属性、链接文本描述等方面。

详细说明

1. 合理使用标题层级

<!-- 正确:h1-h6 按层级使用 -->
<h1>网站主标题</h1>
<h2>主要章节</h2>
<h3>子章节</h3>

<!-- 错误:跳级使用、滥用 h1 -->
<h1>标题1</h1>
<h4>标题4</h4>  <!-- 跳级 -->
<h1>多个 h1</h1> <!-- 每页应只有一个 h1 -->

2. 图片必须添加 alt 属性

<!-- 正确:描述性 alt -->
<img src="red-running-shoes.jpg" alt="男士红色跑步运动鞋">

<!-- 错误:使用无意义 alt -->
<img src="img1.jpg" alt="图片">
<img src="img1.jpg" alt="">

3. 使用语义化标签构建结构

<!-- 语义化结构 -->
<header>页面头部</header>
<nav>导航</nav>
<main>
    <article>
        <h1>文章标题</h1>
        <section>
            <h2>章节</h2>
        </section>
    </article>
    <aside>侧边栏</aside>
</main>
<footer>页脚</footer>

<!-- 仅用 div 缺乏语义 -->
<div class="header"></div>
<div class="content"></div>
<div class="footer"></div>

4. 链接文本要有描述性

<!-- 好的链接文本 -->
<a href="/how-to-learn-javascript">如何学习 JavaScript</a>

<!-- 差的链接文本 -->
<a href="/article?id=123">点击这里</a>
<a href="#">更多</a>

补充说明

  • 一个页面最好只用一个 <h1>
  • <strong><em><b><i> 更有语义
  • 使用 <blockquote> 引用外部内容
  • 避免在正文内容中使用 <table> 做布局

五、元数据与资源加载

19. srchref 区别

问题srchref 区别

答案核心回答src 用于替换当前元素内容,href 用于建立当前文档与引用资源的关系。

详细说明

特征srchref
语义source(来源)hypertext reference(超文本引用)
作用替换元素内容建立关联关系
加载时机立即加载不会阻止文档加载
使用场景img、script、iframe、video、audiolink、a

代码示例

<!-- src:替换当前元素内容 -->
<img src="logo.png" alt="Logo">                    <!-- 图片 -->
<script src="app.js"></script>                        <!-- 脚本 -->
<iframe src="https://example.com"></iframe>          <!-- 框架 -->
<video src="movie.mp4"></video>                      <!-- 视频 -->
<audio src="music.mp3"></audio>                       <!-- 音频 -->

<!-- href:建立关系,不替换内容 -->
<link rel="stylesheet" href="styles.css">            <!-- 样式表 -->
<a href="https://example.com">访问网站</a>           <!-- 链接 -->
<link rel="icon" href="favicon.ico">                  <!-- 图标 -->
<base href="https://example.com/">                    <!-- 基准 URL -->

补充说明

  • 浏览器遇到 src 会暂停渲染直到资源加载完成
  • 浏览器遇到 href 会并行下载资源,不阻塞页面渲染
  • CSS 中使用 @import 引入样式会阻塞渲染(不推荐)
  • 现代浏览器的预加载功能可以优化资源加载顺序

六、其他 HTML 特性

20. strong vs em

问题strong vs em

答案核心回答strong 表示重要性、严重性(语气更强的强调),em 表示斜体强调(改变句子的含义)。

详细说明

标签语义默认样式使用场景
<strong>重要性、警告、严重粗体重要内容、警告信息
<em>强调、斜体斜体词语强调、句子含义改变

代码示例

<!-- strong:表示重要、紧急 -->
<p><strong>警告:</strong>请立即停止操作!</p>
<p>完成以下<strong>必填</strong>项才能提交。</p>

<!-- em:改变句子的含义 -->
<p><em>真的</em>喜欢他。(不是假的喜欢)</p>
<p>我真<em></em>喜欢他。(强调是真的)</p>

<!-- 嵌套使用 -->
<p>
    <strong>
        <em>重要且紧急</em>
    </strong>
</p>

无障碍意义

<!-- 屏幕阅读器会对 strong 使用更强的语气 -->
<p>
    <strong>错误:</strong>输入格式不正确
</p>
<p>
    <em>注意:</em>以上信息仅供参考
</p>

补充说明

  • strong 的强调程度高于 em
  • 不要用 <b><i> 代替,它们没有语义
  • strong 可以表示"非常紧急",em 可以表示"这个词很重要"

21. 单选框分组条件

问题:单选框分组条件

答案核心回答:单选框通过 name 属性实现分组,同一 name 值的单选框只能选择一个。

详细说明

分组条件

  • 同一组单选框必须具有相同的 name 属性值
  • 不同组的单选框应使用不同的 name
  • 同一组内只能有一个单选框被选中

代码示例

<!-- 性别分组 -->
<input type="radio" name="gender" value="male" id="male">
<label for="male"></label>

<input type="radio" name="gender" value="female" id="female">
<label for="female"></label>

<!-- 爱好分组(与性别分组使用不同 name) -->
<input type="radio" name="hobby" value="reading" id="reading">
<label for="reading">阅读</label>

<input type="radio" name="hobby" value="sports" id="sports">
<label for="sports">运动</label>

<!-- 错误示例:name 不一致无法分组 -->
<input type="radio" name="option1" value="a">
<input type="radio" name="option2" value="a">
<!-- 这两个不在同一组,可以同时选中 -->

补充说明

  • name 属性用于分组,value 属性定义选中后提交的值
  • 使用 <fieldset><legend> 可以添加分组标题(纯视觉)
  • 单选框组通常配合 <label> 使用,提升可访问性

22. 单选框(radio)实现分组需满足的属性条件

问题:单选框(radio)实现分组需满足的属性条件

答案核心回答:单选框分组需要满足 name 属性相同、typeradio、且 value 值唯一。

详细说明

必要条件

  1. type="radio" - 必须声明为单选框类型
  2. name="xxx" - 同一分组的 name 值必须相同
  3. value="xxx" - 每个选项的 value 值应唯一

代码示例

<!-- 正确分组示例 -->
<fieldset>
    <legend>付款方式</legend>
    <label>
        <input type="radio" name="payment" value="credit-card">
        信用卡
    </label>
    <label>
        <input type="radio" name="payment" value="alipay" checked>
        支付宝
    </label>
    <label>
        <input type="radio" name="payment" value="wechat">
        微信支付
    </label>
</fieldset>

<!-- 错误示例:name 不同无法分组 -->
<input type="radio" name="yes" value="1"><input type="radio" name="no" value="0"><!-- 上下可以同时选中,因为不在同一组 -->

补充说明

  • checked 属性可设置默认选中项
  • 单选框提交时只发送被选中的 name=value
  • 使用 <fieldset> 分组可以提升表单的可访问性

23. imgalttitle 区别

问题imgalttitle 区别

答案核心回答alt 是图片的替代文本,图片无法显示时显示;title 是提示信息,鼠标悬停时显示。

详细说明

特征alttitle
作用图片替代文本额外提示信息
显示时机图片加载失败、屏幕阅读器鼠标悬停
必填性建议填写(尤其有意义图片)可选
SEO 价值高(搜索引擎识别图片内容)
无障碍必须(屏幕阅读器读取)辅助

代码示例

<!-- 装饰性图片:alt 为空或留空 -->
<img src="bg-pattern.png" alt="" title="背景图案">

<!-- 内容性图片:alt 描述图片内容 -->
<img src="product-photo.jpg" alt="iPhone 15 Pro 256GB 蓝色钛金属手机" title="苹果 iPhone 15 Pro">

<!-- 链接图片:alt 描述链接目标 -->
<a href="/iphone-15">
    <img src="iphone15.jpg" alt="iPhone 15 Pro 购买页面">
</a>

补充说明

  • alt 为空时不朗读,但图片占位符会显示
  • 纯装饰性图片使用 alt="" 避免屏幕阅读器干扰
  • 图片有字(如海报),alt 应包含文字内容
  • title 不是无障碍标准要求的属性

24. HTML 层面的响应式实现

问题:HTML 层面的响应式实现

答案核心回答:HTML 响应式实现主要通过视口设置、语义化标签和媒体查询实现。

详细说明

1. 视口设置(必须)

<meta name="viewport" content="width=device-width, initial-scale=1.0">
  • width=device-width:宽度设为设备宽度
  • initial-scale=1.0:初始缩放比例为 1

2. 语义化标签

<!-- 响应式结构 -->
<header>
    <nav>导航</nav>
</header>
<main>
    <article>主要内容</article>
    <aside>侧边栏</aside>
</main>
<footer>页脚</footer>

3. 图片响应式

<!-- 使用 srcset 提供多尺寸图片 -->
<img 
    src="small.jpg" 
    srcset="
        small.jpg 480w,
        medium.jpg 800w,
        large.jpg 1200w
    "
    sizes="(max-width: 600px) 480px,
           (max-width: 900px) 800px,
           1200px"
    alt="响应式图片"
>

<!-- picture 元素 -->
<picture>
    <source media="(min-width: 900px)" srcset="large.jpg">
    <source media="(min-width: 600px)" srcset="medium.jpg">
    <img src="small.jpg" alt="图片">
</picture>

4. 自动链接电话和邮箱

<!-- 移动端电话拨打 -->
<a href="tel:1234567890">拨打电话</a>

<!-- 移动端邮箱 -->
<a href="mailto:example@example.com">发送邮件</a>

<!-- 短信 -->
<a href="sms:1234567890?body=你好">发送短信</a>

补充说明

  • 视口设置是移动端开发的第一步
  • 图片使用 srcset 让浏览器选择合适尺寸
  • <picture> 允许更复杂的图片切换策略

25. 响应式设计原理

问题:响应式设计原理

答案核心回答:响应式设计通过 CSS 媒体查询、弹性布局和流式图片等技术,使页面根据设备屏幕大小自动调整布局。

详细说明

核心原理

技术作用
媒体查询根据设备特性应用不同样式
弹性盒(Flexbox)灵活的空间分配和对齐
网格布局(Grid)二维布局系统
流式图片图片随容器缩放

代码示例

<!-- HTML 结构 -->
<div class="container">
    <header class="header"></header>
    <main class="main">
        <article class="content"></article>
        <aside class="sidebar"></aside>
    </main>
    <footer class="footer"></footer>
</div>

<!-- CSS 响应式实现 -->
<style>
/* 移动优先 */

/* 基础样式 */
.container {
    width: 100%;
    padding: 0 15px;
}

.main {
    display: flex;
    flex-direction: column;
}

/* 平板(>= 768px) */
@media (min-width: 768px) {
    .container {
        max-width: 720px;
        margin: 0 auto;
    }
    
    .main {
        flex-direction: row;
    }
    
    .content {
        flex: 3;
    }
    
    .sidebar {
        flex: 1;
    }
}

/* 桌面(>= 1024px) */
@media (min-width: 1024px) {
    .container {
        max-width: 960px;
    }
}

/* 大屏(>= 1200px) */
@media (min-width: 1200px) {
    .container {
        max-width: 1140px;
    }
}
</style>

补充说明

  • 移动优先:先为移动设备设计,再为大屏幕添加样式
  • 使用 rem/em 而非固定 px 提高灵活性
  • 图片使用 max-width: 100% 防止溢出

26. 渐进增强 vs 优雅降级

问题:渐进增强 vs 优雅降级

答案核心回答:渐进增强从基础功能开始,逐步为高版本浏览器添加增强功能;优雅降级从完整功能开始,兼容低版本浏览器。

详细说明

策略定义目标浏览器开发顺序
渐进增强(Progressive Enhancement)先保证基础功能,再增强体验低版本浏览器从低到高
优雅降级(Graceful Degradation)先实现完整功能,再处理兼容高版本浏览器从高到低

代码示例

<!-- 优雅降级:先实现炫酷效果,再处理兼容性 -->
<style>
/* 基础样式(所有浏览器支持) */
.box {
    background: blue;
    color: white;
    padding: 20px;
}

/* 增强:圆角(不支持则显示方角) */
.box {
    border-radius: 10px;
}

/* 进一步增强:阴影和渐变 */
.box {
    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
    background: linear-gradient(to bottom, #4a90e2, #357abd);
}
</style>

<!-- 渐进增强:先保证可访问,再增强 -->
<!-- 基础内容:所有设备都能看到 -->
<div class="content">
    <p>重要信息</p>
</div>

<!-- 增强:支持 CSS Grid 的设备获得更好布局 -->
<style>
@supports (display: grid) {
    .content {
        display: grid;
        grid-template-columns: 1fr 2fr;
    }
}
</style>

<!-- 渐进增强:先能用,再好用 -->
<!-- 表单验证 -->
<form>
    <input type="email" required>
    <button type="submit">提交</button>
</form>

<!-- 增强:JavaScript 实时验证 -->
<script>
document.querySelector('form').addEventListener('submit', function(e) {
    // 额外验证逻辑
});
</script>

补充说明

  • 渐进增强更推荐,因为基础体验有保障
  • 优雅降级风险较高,低版本浏览器可能体验很差
  • 可以使用 @supports 检测 CSS 特性支持
  • 考虑目标用户的浏览器使用分布

27. HTML 空元素

问题:HTML 空元素

答案核心回答:空元素是只有开始标签、没有结束标签的元素,用于插入或引用自闭合内容。

详细说明

常见空元素

元素用途
<br>换行
<hr>水平线
<img>图片
<input>输入框
<meta>元数据
<link>外部资源
<area>图片热区
<base>基准 URL
<col>表格列
<embed>嵌入内容
<param>对象参数
<source>媒体源
<track>字幕
<wbr>换行机会
<path>SVG 路径

代码示例

<!-- br 换行 -->
<p>第一行<br>第二行</p>

<!-- hr 水平线 -->
<hr>

<!-- img 图片 -->
<img src="photo.jpg" alt="照片">

<!-- input 输入 -->
<input type="text" name="username">

<!-- meta 元数据 -->
<meta charset="UTF-8">
<meta name="description" content="页面描述">

<!-- link 外部资源 -->
<link rel="stylesheet" href="style.css">

<!-- source 媒体源 -->
<video controls>
    <source src="movie.mp4" type="video/mp4">
    <source src="movie.webm" type="video/webm">
</video>

<!-- wbr 可选换行位置 -->
<p>honorificabilitudinitatibus<wbr>这是一个很长的单词</p>

补充说明

  • HTML5 中空元素可以不使用自闭合 /
  • 空元素不能包含任何内容
  • 某些空元素(如 img、video)可以包含文字内容作为备用

28. HTML 空元素有哪些

问题:HTML 空元素有哪些

答案核心回答:HTML 空元素(Void Elements)共有 14 个,不需要也不允许结束标签。

详细说明

空元素完整列表

元素说明
<area>定义图像热区
<base>基准 URL
<br>换行
<col>表格列属性
<embed>嵌入内容
<hr>水平分割线
<img>图片
<input>输入控件
<link>文档关系
<meta>元数据
<param>对象参数
<source>媒体源
<track>视频字幕
<wbr>可换行位置

代码示例

<!-- 常见空元素使用 -->
<img src="image.jpg" alt="图片">
<input type="text" placeholder="输入">
<br>
<hr>
<link rel="stylesheet" href="style.css">
<meta charset="UTF-8">
<video>
    <source src="video.mp4" type="video/mp4">
    <track src="subtitles.vtt" kind="subtitles">
</video>
<audio controls>
    <source src="audio.mp3" type="audio/mpeg">
</audio>

补充说明

  • 空元素在 XHTML 中需要自闭合(如 <br/>
  • HTML5 中两种写法都支持
  • <wbr> 是最佳换行机会提示,不是强制换行

29. title vs alt 属性

问题title vs alt 属性

答案核心回答alt 是图片替代文本,title 是额外提示信息,两者作用完全不同。

详细说明

特征alttitle
用途图片无法显示时的替代文本额外补充信息
显示图片加载失败时显示鼠标悬停时显示
屏幕阅读器朗读 alt 文本不朗读
SEO 价值
适用元素img, area, input[type="image"]大多数元素

代码示例

<!-- img 的 alt 和 title -->
<img 
    src="product.jpg" 
    alt="iPhone 15 Pro Max 256GB 钛金属色"  <!-- 必填描述图片 -->
    title="点击查看详情"                      <!-- 可选,提示操作 -->
>

<!-- 其他元素的 title -->
<span title="这是额外信息">悬停查看提示</span>
<a href="/about" title="关于我们">关于</a>
<abbr title="HyperText Markup Language">HTML</abbr>

补充说明

  • img 的 alt 是无障碍的重要属性
  • title 不是标准无障碍属性,屏幕阅读器支持不一致
  • 链接的 title 可以提供额外的上下文信息
  • 表格可以使用 title 为单元格提供额外说明

30. img 标签的 alt 与 title 属性区别、strong 与 em 语义差异

问题:img 标签的 alt 与 title 属性区别、strong 与 em 语义差异

答案核心回答:alt 是图片替代文本,title 是提示信息;strong 表示重要性强调,em 表示含义强调。

详细说明

alt vs title(图片属性)

特征alttitle
显示条件图片加载失败鼠标悬停
屏幕阅读器朗读不朗读
SEO 价值
必填性建议填写可选
适用元素img 等所有元素

代码示例

<img 
    src="laptop.jpg" 
    alt="银色MacBook Pro 14寸笔记本"   <!-- 图片替代 -->
    title="Apple MacBook Pro M3"        <!-- 悬停提示 -->
>

strong vs em(文本强调)

特征strongem
语义重要性、严重性、警告词语或句子含义强调
默认样式粗体斜体
强调程度更强一般
嵌套可嵌套,层层递进可嵌套

代码示例

<!-- strong 表示重要、紧急 -->
<p><strong>重要提示:</strong>请在24小时内完成验证</p>
<p>这是一个 <strong>必须完成</strong> 的任务</p>

<!-- em 改变句子含义 -->
<p><em>真的</em>喜欢他。(强调是真的)</p>
<p>我真<em></em>喜欢他。(强调"真的"这个程度)</p>

补充说明

  • 不要用样式标签(b、i)替代语义标签
  • 屏幕阅读器会对 strong 使用更高音量或音调
  • alt 为空的图片不会朗读,但会有占位提示

31. 渐进增强与优雅降级设计理念

问题:渐进增强与优雅降级设计理念

答案核心回答:渐进增强从基础开始逐步提升,优雅降级从完整开始兼容降级。

详细说明

设计理念渐进增强优雅降级
开发起点低版本浏览器/基础功能高版本浏览器/完整功能
核心理念基础体验必须保证基础功能必须可用
CSS 策略@supports 检测前缀、兼容性处理
JavaScript渐进增强特性检测降级

代码示例

<!-- 渐进增强示例 -->

<!-- 1. HTML 基础内容(所有设备可访问) -->
<form>
    <input type="email" required>
    <button type="submit">订阅</button>
</form>

<!-- 2. CSS 增强 -->
<style>
/* 基础样式 */
input { padding: 8px; }

/* 增强:只在支持时应用 */
@supports (display: grid) {
    form { display: grid; }
}
</style>

<!-- 3. JavaScript 增强 -->
<script>
if ('fetch' in window) {
    // 使用现代 fetch API
} else {
    // 回退到 XMLHttpRequest
}
</script>

<!-- 优雅降级示例 -->
<style>
/* 渐变(现代浏览器) */
.box {
    background: linear-gradient(red, blue);
}

/* 纯色(老浏览器降级) */
.box {
    background: gray;  /* 会覆盖上面的渐变 */
}
</style>
</html>

补充说明

  • 渐进增强是更现代、更安全的开发策略
  • 优雅降级需要为各种旧浏览器写兼容代码
  • 可以结合使用:以渐进增强为主,优雅降级为辅

32. 多域名存储资源的优化原理

问题:多域名存储资源的优化原理

答案核心回答:多域名存储利用浏览器并发下载限制和域名缓存特性,提升资源加载速度。

详细说明

优化原理

机制说明
并发限制浏览器每个域名同时下载 4-8 个文件
cookie-free静态资源用独立域名避免 cookie 传输
缓存共享不同子域名的缓存不能共享
DNS 预解析提前解析域名减少 DNS 查找时间

代码示例

<!-- 使用多个 CDN 域名 -->
<img src="https://img1.example.com/logo.png">
<img src="https://img2.example.com/product1.jpg">
<img src="https://img3.example.com/product2.jpg">

<!-- CSS 中的多域名资源 -->
<style>
.hero {
    background: url('https://static1.example.com/bg.jpg');
}
.icon {
    background: url('https://static2.example.com/icons.png');
}
</style>

<!-- DNS 预解析 -->
<link rel="dns-prefetch" href="//img1.example.com">
<link rel="dns-prefetch" href="//img2.example.com">
<link rel="preconnect" href="https://img1.example.com" crossorigin>

<!-- 预加载关键资源 -->
<link rel="preload" href="https://img1.example.com/critical.png" as="image">

补充说明

  • 通常 2-4 个域名足够,过多会增加 DNS 解析开销
  • 静态资源域名不要带 cookie(使用纯净域名)
  • HTTP/2 时代,多域名优化效果减弱
  • 合理使用 sprite 图减少请求数

33. 图片格式选择(PNG/JPG/GIF 适用场景)

问题:图片格式选择(PNG/JPG/GIF 适用场景)

答案核心回答:JPG 适合照片,PNG 适合图标和透明图,GIF 适合动画,WebP 综合性能优秀。

详细说明

格式特点适用场景不适用场景
JPG有损压缩,体积小照片、复杂图像图标、透明背景
PNG无损压缩,支持透明图标、logo、透明图照片(体积太大)
GIF256色,支持动画简单动画、动图照片、渐变图像
WebP高压缩率,支持透明通用(现代浏览器)旧浏览器兼容
SVG矢量,可缩放图标、logo、图表复杂照片

代码示例

<!-- 照片使用 JPG -->
<img src="photo.jpg" alt="风景照片">

<!-- 图标使用 PNG 或 SVG -->
<img src="icon.png" alt="设置图标">
<img src="icon.svg" alt="设置图标">

<!-- 透明图使用 PNG/WebP -->
<img src="logo.webp" alt="公司logo">
<div style="background: url('pattern.png');"></div>

<!-- 动画使用 GIF 或 WebP -->
<img src="loading.gif" alt="加载动画">

<!-- 矢量图标使用 SVG -->
<svg width="24" height="24" viewBox="0 0 24 24">
    <path d="M12 2L2 7l10 5 10-5-10-5z"/>
</svg>

<!-- 现代格式选择:优先 WebP,降级 JPG/PNG -->
<picture>
    <source srcset="image.webp" type="image/webp">
    <source srcset="image.jpg" type="image/jpeg">
    <img src="image.jpg" alt="描述">
</picture>

补充说明

  • 小图标尽量使用 SVG 或 icon font
  • PNG-8 适合简单图形,PNG-24 适合复杂透明图
  • WebP 比 JPG 体积小 25-35%,是首选格式
  • 使用 <picture> 实现响应式图片和格式协商

七、性能优化

34. 什么是 HTML?它的基本结构是什么

问题:什么是 HTML?它的基本结构是什么

答案核心回答:HTML(HyperText Markup Language)是超文本标记语言,用于构建 Web 页面的结构和内容。

详细说明

HTML 定义

  • 标记语言,不是编程语言
  • 通过标签定义页面结构
  • 是 Web 的基础技术之一

HTML 基本结构

<!DOCTYPE html>                           <!-- 文档类型声明 -->
<html lang="zh-CN">                       <!-- 根元素 -->
<head>                                    <!-- 头部信息 -->
    <meta charset="UTF-8">               <!-- 字符编码 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>页面标题</title>                <!-- 标题 -->
    <link rel="stylesheet" href="style.css"><!-- 样式 -->
</head>
<body>                                    <!-- 可见内容 -->
    <header>
        <nav>导航内容</nav>
    </header>
    <main>
        <article>
            <h1>文章标题</h1>
            <p>段落内容...</p>
        </article>
    </main>
    <footer>页脚内容</footer>
    <script src="main.js"></script>       <!-- 脚本 -->
</body>
</html>

补充说明

  • <!DOCTYPE html> 必须是首行
  • <head> 包含元数据,不直接显示
  • <body> 包含所有可见内容
  • 现代 HTML5 文档结构应使用语义化标签

35. HTML5 有哪些新特性?如何处理其浏览器兼容问题

问题:HTML5 有哪些新特性?如何处理其浏览器兼容问题

答案核心回答:HTML5 新增语义化标签、多媒体支持、表单增强、Canvas、离线存储等特性,兼容问题可通过特性检测和 polyfill 处理。

详细说明

主要新特性

<!-- 语义化标签 -->
<header>, <nav>, <main>, <section>, <article>, <aside>, <footer>

<!-- 多媒体 -->
<video>, <audio>, <source>, <track>

<!-- 表单增强 -->
<input type="email/url/date/time/number/range/color">

<!-- Canvas 绘图 -->
<canvas id="myCanvas"></canvas>

<!-- 离线存储 -->
localStorage, sessionStorage

<!-- 其他 -->
<datalist>, <details>, <summary>, <progress>, <meter>, <wbr>

浏览器兼容处理

策略方法示例
特性检测检测浏览器支持if ('localStorage' in window)
Polyfill引入兼容性库
CSS reset统一默认样式header { display: block; }
渐进增强先基础后增强先用 input[type=text],再增强

代码示例

<!-- HTML5 Shiv(让旧浏览器支持语义化标签) -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcdn.net/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->

<!-- 特性检测示例 -->
<script>
if ('localStorage' in window) {
    localStorage.setItem('key', 'value');
} else {
    // 降级方案:使用 cookie
    document.cookie = 'key=value';
}

if ('geolocation' in navigator) {
    navigator.geolocation.getCurrentPosition();
}
</script>

<!-- CSS 兼容处理 -->
<style>
/* 旧浏览器需要显式设置块级 */
header, nav, main, article, aside, footer {
    display: block;
}
</style>

补充说明

  • 现代浏览器(Chrome、Firefox、Safari、Edge)基本都支持 HTML5
  • 主要兼容问题是 IE9 及以下
  • 使用 Modernizr 库可以方便地进行特性检测

36. 说说 title 和 alt 属性的区别及作用

问题:说说 title 和 alt 属性的区别及作用

答案核心回答alt 是图片替代文本用于无障碍和 SEO,title 是元素提示信息用于提供额外上下文。

详细说明

属性alttitle
显示时机图片加载失败时鼠标悬停
屏幕阅读器朗读不朗读
适用元素img, area, input[type=image]所有元素
SEO 价值
必填性推荐填写可选

代码示例

<!-- 标准图片用法 -->
<img 
    src="product.jpg" 
    alt="iPhone 15 Pro 256GB 深空黑手机"   <!-- 替代文本 -->
    title="点击查看大图"                    <!-- 悬停提示 -->
>

<!-- 链接图片 -->
<a href="/product/iphone-15">
    <img src="iphone15.jpg" alt="iPhone 15 Pro 购买页面">
</a>

<!-- 其他元素使用 title -->
<abbr title="Cascading Style Sheets">CSS</abbr>
<p title="这是段落的额外信息">段落内容</p>

<!-- 空 alt 用于装饰性图片 -->
<img src="decoration.png" alt="" title="装饰图案">

补充说明

  • alt 文本应该简洁描述图片内容
  • 纯装饰性图片使用空 alt
  • title 属性不应用于关键信息(屏幕阅读器用户看不到)

37. 微格式(Microformats)

问题:微格式(Microformats)

答案核心回答:微格式是用标准 HTML 属性(如 class、rel)标记语义化信息,让机器能理解和提取结构化数据。

详细说明

常用微格式

微格式用途使用类名
hCard联系信息vcard, fn, org, tel, email
hCalendar事件信息vevent, dtstart, summary
hReview评论信息hreview, item, rating
hRecipe食谱信息hrecipe, ingredient, instructions

代码示例

<!-- hCard 联系信息 -->
<div class="vcard">
    <span class="fn">张三</span>
    <span class="org">示例公司</span>
    <span class="tel">138-0000-0000</span>
    <a class="email" href="mailto:zhangsan@example.com">zhangsan@example.com</a>
</div>

<!-- hCalendar 事件 -->
<div class="vevent">
    <h3 class="summary">技术大会</h3>
    <time class="dtstart" datetime="2024-05-15T09:00">2024年5月15日 上午9点</time>
    <time class="dtend" datetime="2024-05-15T18:00">下午6点</time>
    <location class="location">北京国际会议中心</location>
</div>

<!-- hRecipe 食谱 -->
<div class="hrecipe">
    <h1 class="fn">红烧肉</h1>
    <img class="photo" src="hongshourou.jpg" alt="红烧肉">
    <span class="ingredient">五花肉 500g</span>
    <span class="ingredient">生抽 30ml</span>
    <p class="instructions">
        <span class="instruction">1. 五花肉切块焯水</span>
        <span class="instruction">2. 下锅炒糖色</span>
    </p>
</div>

<!-- rel 属性微格式 -->
<a rel="me" href="https://github.com/username">GitHub</a>
<a rel="author" href="about.html">关于作者</a>
<a rel="license" href="license.html">许可证</a>

补充说明

  • 微格式已被 Schema.org 和 JSON-LD 取代
  • 新项目建议使用 Schema.org 进行结构化数据标记
  • Google 搜索结果支持微格式展示富片段

38. 什么是微格式(Microformats)

问题:什么是微格式(Microformats)

答案核心回答:微格式是在 HTML 中嵌入语义数据的简单协议,让网页内容能被机器理解和提取。

详细说明

微格式特点

  • 使用现有 HTML 属性(class、rel)
  • 不需要额外命名空间
  • 人可读,机器也易解析

应用场景

类型用途核心类名
hCard联系人信息vcard, fn, org, tel
hCalendar日历事件vevent, dtstart, summary
XFN社交关系rel="me"
geo地理坐标geo, latitude, longitude

代码示例

<!-- XFN 社交关系 -->
<a rel="me" href="https://github.com/user">GitHub</a>
<a rel="friend" href="https://example.com/bob">Bob</a>

<!-- geo 地理坐标 -->
<span class="geo">
    <span class="latitude">39.9042</span>
    <span class="longitude">116.4074</span>
</span>

<!-- 嵌入的联系方式 -->
<div class="vcard">
    <a class="fn org url" href="https://company.com">公司名称</a>
    <div class="adr">
        <span class="street-address">北京市朝阳区</span>
        <span class="locality">北京市</span>
    </div>
    <div class="tel">+86-10-12345678</div>
</div>

<!-- rel-license 许可证 -->
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
    CC BY 4.0
</a>

补充说明

  • 微格式是早期的语义网实践
  • 现代网站推荐使用 Schema.org
  • Google 支持多种微格式显示富搜索结果

八、无障碍访问

39. 无障碍(A11Y):缺少 ARIA 标签或键盘导航

问题:无障碍(A11Y):缺少 ARIA 标签或键盘导航

答案核心回答:无障碍访问需要使用 ARIA 属性增强语义和提供键盘导航支持。

详细说明

常见问题及解决方案

问题解决方案
图标按钮无标签aria-labelaria-labelledby
动态内容更新aria-live 通知屏幕阅读器
模态框焦点管理焦点锁定、Trap Focus
缺失角色标识role 属性
导航结构不明确aria-label 标识各区域

代码示例

<!-- 图标按钮添加标签 -->
<button aria-label="关闭对话框">
    <svg><!-- X 图标 --></svg>
</button>

<!-- 导航区域标识 -->
<nav aria-label="主导航">
    <ul>...</ul>
</nav>
<nav aria-label="面包屑">
    <ol>...</ol>
</nav>

<!-- 动态内容更新通知 -->
<div aria-live="polite" aria-atomic="true">
    <!-- 动态更新的内容 -->
</div>

<!-- 模态框实现 -->
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
    <h2 id="dialog-title">对话框标题</h2>
    <button aria-label="关闭">X</button>
    <div>内容...</div>
</div>

<!-- 折叠面板 -->
<button aria-expanded="false" aria-controls="panel-content">
    查看详情
</button>
<div id="panel-content" hidden>
    详情内容...
</div>

<!-- 表单错误提示 -->
<label for="email">邮箱</label>
<input type="email" id="email" aria-describedby="email-error">
<span id="email-error" class="error" aria-live="assertive">
    请输入有效的邮箱地址
</span>

键盘导航要求

/* 确保可聚焦元素有可见焦点 */
:focus {
    outline: 2px solid #0066cc;
    outline-offset: 2px;
}

/* 移除默认焦点样式但保留可访问性 */
:focus:not(:focus-visible) {
    outline: none;
}

补充说明

  • ARIA 不能弥补糟糕的 HTML 结构
  • 首先使用语义化 HTML 标签
  • 动态内容必须使用 aria-live 区域
  • 模态框必须管理焦点,防止焦点丢失

40. 无障碍化实现方法

问题:无障碍化实现方法

答案核心回答:无障碍化通过语义化标签、ARIA 属性、键盘导航和颜色对比度等措施,让所有用户都能访问内容。

详细说明

实现方法

方法说明实现要点
语义化标签使用正确的 HTML5 标签header、nav、main、article 等
ARIA 属性增强语义表达role、aria-label、aria-describedby
键盘支持所有功能可用键盘操作tabindex、focus 管理
颜色对比确保文字可读4.5:1 以上对比度
表单标签正确关联标签和输入label for、aria-label

代码示例

<!-- 语义化结构 -->
<header>
    <h1>网站标题</h1>
    <nav aria-label="主导航">
        <ul>
            <li><a href="/" aria-current="page">首页</a></li>
        </ul>
    </nav>
</header>

<main>
    <article>
        <h2>文章标题</h2>
        <p>文章内容...</p>
    </article>
</main>

<!-- 表单无障碍 -->
<form>
    <label for="name">姓名</label>
    <input type="text" id="name" required>
    
    <label for="password">密码</label>
    <input type="password" id="password" 
           aria-describedby="password-hint">
    <span id="password-hint">密码至少8位</span>
</form>

<!-- 图片 alt 文本 -->
<img src="chart.png" alt="2024年销售趋势图:Q1增长20%,Q2增长15%">

<!-- 链接文本描述性 -->
<a href="/products/shoes">查看所有运动鞋</a>
<!-- 避免:点击这里、更多 -->

<!-- 颜色对比度检查 -->
<style>
.text {
    color: #333333;           /* 深灰色文字 */
    background: #ffffff;     /* 白色背景 */
    /* 对比度约 12.6:1,满足 AAA 标准 */
}
</style>

键盘导航

<!-- 自定义焦点管理 -->
<div tabindex="0" role="button" 
     aria-pressed="false"
     onclick="toggle()">
    自定义按钮
</div>

<!-- 跳转到主内容链接 -->
<a href="#main-content" class="skip-link">
    跳转到主要内容
</a>
<main id="main-content" tabindex="-1">
    <!-- 主内容 -->
</main>

<style>
.skip-link {
    position: absolute;
    top: -40px;
}
.skip-link:focus {
    top: 0;
}
</style>

补充说明

  • 无障碍不只是视障用户需要
  • 运动障碍用户依赖键盘操作
  • 老年人需要更大的对比度和字体
  • 无障碍也是 SEO 最佳实践

九、移动端适配

41. 移动端适配的常用方法?

问题:移动端适配的常用方法?

答案核心回答:移动端适配主要有 viewport 视口设置、媒体查询、弹性布局和响应式图片等技术。

详细说明

常用方法

方法说明适用场景
viewport视口设置必须设置
媒体查询CSS 断点适配响应式布局
Flexbox弹性盒子布局一维布局
Grid网格布局二维布局
rem/vw响应式尺寸单位适配不同屏幕
图片 srcset响应式图片多分辨率图片

代码示例

<!-- 1. viewport 设置(必须) -->
<meta name="viewport" 
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

<!-- 2. 响应式结构 -->
<div class="container">
    <header></header>
    <main class="flex-layout">
        <article></article>
        <aside></aside>
    </main>
    <footer></footer>
</div>

<style>
/* 3. 媒体查询 */
.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 15px;
}

/* 移动优先 */
.flex-layout {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

/* 平板 */
@media (min-width: 768px) {
    .flex-layout {
        flex-direction: row;
    }
    
    article { flex: 3; }
    aside { flex: 1; }
}

/* 4. 响应式图片 */
img {
    max-width: 100%;
    height: auto;
}

/* 5. 响应式字体 */
html {
    font-size: 16px;
}
@media (min-width: 768px) {
    html {
        font-size: 18px;
    }
}

/* 6. 使用 rem 单位 */
.button {
    padding: 0.75rem 1.5rem;
    font-size: 1rem;
}
</style>

<!-- 7. 图片 srcset -->
<img srcset="small.jpg 480w,
             medium.jpg 800w,
             large.jpg 1200w"
     sizes="(max-width: 600px) 480px,
            (max-width: 900px) 800px,
            1200px"
     src="medium.jpg" 
     alt="响应式图片">

补充说明

  • viewport 设置是移动端开发的第一步
  • 使用 touch-action 优化触摸体验
  • 移动端点击元素建议至少 44x44 像素
  • 测试不同设备和屏幕尺寸

十、表单元素与验证

42. 新增表单控件类型

问题:新增表单控件类型

答案核心回答:HTML5 新增了 email、url、tel、date、time、number、range、color、search 等多种输入类型。

详细说明

新增输入类型

类型用途示例
email邮箱地址user@example.com
urlURL 地址https://example.com
tel电话号码格式因地区而异
date日期选择2024-01-15
time时间选择14:30
datetime-local本地日期时间2024-01-15T14:30
number数字输入可设置 min/max/step
range滑动条0-100
color颜色选择返回十六进制
search搜索框样式略有不同
month月份选择2024-01
week周选择2024-W03

代码示例

<form>
    <label>邮箱:<input type="email" name="email" 
                       placeholder="user@example.com"></label>
    
    <label>网址:<input type="url" name="website" 
                       placeholder="https://"></label>
    
    <label>电话:<input type="tel" name="phone" 
                       pattern="[0-9]{11}"></label>
    
    <label>日期:<input type="date" name="birthday" 
                       min="1900-01-01" max="2024-12-31"></label>
    
    <label>时间:<input type="time" name="meeting-time"></label>
    
    <label>数量:<input type="number" name="quantity" 
                       min="1" max="10" step="1"></label>
    
    <label>音量:<input type="range" name="volume" 
                       min="0" max="100" value="50"></label>
    
    <label>颜色:<input type="color" name="bg-color" 
                       value="#ffffff"></label>
    
    <label>搜索:<input type="search" name="query" 
                       results="5"></label>
</form>

补充说明

  • 不支持的浏览器会回退为 text 输入
  • 新类型提供原生客户端验证
  • 移动端会显示适合的虚拟键盘

43. HTML 表单元素类型

问题:HTML 表单元素类型

答案核心回答:HTML 表单提供了 text、password、checkbox、radio、submit、file、hidden、button 等多种输入类型。

详细说明

类型说明示例
text单行文本姓名、地址
password密码(隐藏)密码输入
checkbox多选框爱好选择
radio单选框性别选择
submit提交按钮提交表单
button普通按钮自定义行为
reset重置按钮重置表单
file文件上传选择文件
hidden隐藏字段传递数据
image图片按钮图片提交
textarea多行文本留言、评论
select下拉选择国家选择

代码示例

<form action="/submit" method="POST">
    <!-- 文本输入 -->
    <input type="text" name="username" maxlength="20" 
           required placeholder="请输入用户名">
    
    <!-- 密码输入 -->
    <input type="password" name="password" 
           minlength="6" required>
    
    <!-- 单选框 -->
    <input type="radio" name="gender" value="male" id="male">
    <label for="male"></label>
    <input type="radio" name="gender" value="female" id="female">
    <label for="female"></label>
    
    <!-- 复选框 -->
    <input type="checkbox" name="hobby" value="reading" id="reading">
    <label for="reading">阅读</label>
    <input type="checkbox" name="hobby" value="sports" id="sports">
    <label for="sports">运动</label>
    
    <!-- 下拉选择 -->
    <select name="country">
        <option value="">请选择</option>
        <option value="cn">中国</option>
        <option value="us">美国</option>
    </select>
    
    <!-- 多行文本 -->
    <textarea name="message" rows="4" 
              placeholder="请输入留言"></textarea>
    
    <!-- 文件上传 -->
    <input type="file" accept="image/*" multiple>
    
    <!-- 隐藏字段 -->
    <input type="hidden" name="token" value="abc123">
    
    <!-- 按钮 -->
    <button type="submit">提交</button>
    <button type="reset">重置</button>
    <input type="button" value="普通按钮">
</form>

补充说明

  • 所有输入框建议配合 <label> 使用
  • 使用 requiredpattern 等属性进行验证
  • name 属性是表单提交的关键

44. HTML5 新增的表单控件类型(至少 3 个)

问题:HTML5 新增的表单控件类型(至少 3 个)

答案核心回答:HTML5 新增了 email、date、time、number、range、color、search、url、tel 等多种表单控件类型。

详细说明

新增类型详解

类型用途代码示例
email邮箱验证<input type="email">
urlURL 验证<input type="url">
tel电话号码(移动端键盘)<input type="tel">
date日期选择器<input type="date">
time时间选择器<input type="time">
datetime-local本地日期时间<input type="datetime-local">
number数字输入(带上下箭头)<input type="number">
range滑动条<input type="range">
color颜色选择器<input type="color">
search搜索框(带清除按钮)<input type="search">

代码示例

<form>
    <!-- email:自动验证邮箱格式 -->
    <label>邮箱:<input type="email" required></label>
    
    <!-- url:自动验证 URL 格式 -->
    <label>网址:<input type="url" required></label>
    
    <!-- tel:移动端显示数字键盘 -->
    <label>电话:<input type="tel" pattern="[0-9]{11}"></label>
    
    <!-- date:日期选择器 -->
    <label>日期:<input type="date" min="2024-01-01"></label>
    
    <!-- time:时间选择器 -->
    <label>时间:<input type="time"></label>
    
    <!-- datetime-local:本地日期时间 -->
    <label>预约时间:<input type="datetime-local"></label>
    
    <!-- number:数字输入 -->
    <label>数量:<input type="number" min="1" max="99" step="1"></label>
    
    <!-- range:滑动条 -->
    <label>音量(<span id="vol-value">50</span>):</label>
    <input type="range" min="0" max="100" value="50"
           oninput="vol-value.textContent = this.value">
    
    <!-- color:颜色选择 -->
    <label>颜色:<input type="color" value="#3498db"></label>
    
    <!-- search:搜索框 -->
    <label>搜索:<input type="search" results="5"></label>
</form>

补充说明

  • 不支持的浏览器回退为普通文本框
  • 移动端会根据 type 显示不同的虚拟键盘
  • 这些类型提供原生的客户端验证功能

45. 表单元素的各种类型及其属性、应用场景

问题:表单元素的各种类型及其属性、应用场景

答案核心回答:表单元素类型包括文本、密码、单选、复选、下拉、文件等,各有特定属性和应用场景。

详细说明

类型属性应用场景
textmaxlength, placeholder用户名、姓名
passwordminlength, pattern密码输入
emailmultiple, pattern邮箱地址
url-网站地址
telpattern电话号码
numbermin, max, step数量、年龄
date/timemin, max日期选择
checkboxchecked, value多选爱好
radiochecked, name单选性别
selectmultiple, size下拉国家
textarearows, cols, maxlength留言、评论
fileaccept, multiple文件上传
hiddenvalue隐藏数据

代码示例

<form action="/register" method="POST">
    <!-- 文本输入 -->
    <input type="text" name="username" 
           maxlength="20" placeholder="用户名">

    <!-- 密码 -->
    <input type="password" name="password" 
           minlength="6" required>

    <!-- 邮箱 -->
    <input type="email" name="email" multiple>

    <!-- 数字 -->
    <input type="number" name="age" min="18" max="100">

    <!-- 日期范围 -->
    <input type="date" name="trip" 
           min="2024-01-01" max="2024-12-31">

    <!-- 单选 -->
    <input type="radio" name="plan" value="basic">
    <input type="radio" name="plan" value="pro">

    <!-- 复选 -->
    <input type="checkbox" name="features[]" value="email">
    <input type="checkbox" name="features[]" value="sms">

    <!-- 下拉 -->
    <select name="country">
        <option value="cn">中国</option>
        <option value="us">美国</option>
        <option value="jp">日本</option>
    </select>

    <!-- 多行文本 -->
    <textarea name="bio" rows="5" 
              maxlength="500" 
              placeholder="个人简介"></textarea>

    <!-- 文件上传 -->
    <input type="file" name="avatar" 
           accept="image/*" capture="user">

    <!-- 隐藏字段 -->
    <input type="hidden" name="ref" value="banner">
</form>

补充说明

  • name 是提交到服务器的关键
  • requiredmin/max 等提供客户端验证
  • autocomplete 属性可以指导浏览器自动填充

十一、表单验证

46. 表单验证:防抖处理或错误提示样式缺失

问题:表单验证:防抖处理或错误提示样式缺失

答案核心回答:表单验证需要实时反馈、清晰错误提示和适当的防抖处理,避免用户困惑。

详细说明

验证策略

策略说明实现
HTML5 内置原生验证required、pattern
JavaScript 验证灵活控制自定义逻辑
防抖处理减少验证频率debounce 函数
实时反馈即时提示input 事件
错误样式视觉明确:invalid、:valid

代码示例

<style>
/* 验证状态样式 */
input.error {
    border-color: #e74c3c;
    background: #fdf2f2;
}

input.success {
    border-color: #27ae60;
    background: #f0fdf4;
}

.error-message {
    color: #e74c3c;
    font-size: 12px;
    margin-top: 4px;
}

.success-message {
    color: #27ae60;
    font-size: 12px;
}
</style>

<form id="registration-form">
    <div class="form-group">
        <label for="email">邮箱</label>
        <input type="email" id="email" name="email"
               required
               aria-describedby="email-error">
        <span id="email-error" class="error-message" 
              role="alert" hidden></span>
    </div>
    
    <div class="form-group">
        <label for="password">密码</label>
        <input type="password" id="password" name="password"
               required minlength="8"
               pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])"
               title="密码需包含大小写字母和数字">
        <span id="password-error" class="error-message" 
              role="alert" hidden></span>
    </div>
    
    <button type="submit">注册</button>
</form>

<script>
// 防抖函数
function debounce(fn, delay) {
    let timer = null;
    return function(...args) {
        clearTimeout(timer);
        timer = setTimeout(() => fn.apply(this, args), delay);
    };
}

// 验证函数
function validateField(field) {
    const errorEl = document.getElementById(`${field.id}-error`);
    
    if (!field.validity.valid) {
        field.classList.add('error');
        field.classList.remove('success');
        
        let message = '';
        if (field.validity.valueMissing) {
            message = '此字段为必填项';
        } else if (field.validity.patternMismatch) {
            message = field.title || '格式不正确';
        } else if (field.validity.tooShort) {
            message = `至少需要 ${field.minLength} 个字符`;
        } else if (field.validity.typeMismatch) {
            message = '请输入有效的格式';
        }
        
        errorEl.textContent = message;
        errorEl.hidden = false;
        return false;
    } else {
        field.classList.remove('error');
        field.classList.add('success');
        errorEl.hidden = true;
        return true;
    }
}

// 应用防抖验证
const form = document.getElementById('registration-form');
const emailInput = document.getElementById('email');
const passwordInput = document.getElementById('password');

emailInput.addEventListener('input', debounce(() => {
    validateField(emailInput);
}, 300));

passwordInput.addEventListener('input', debounce(() => {
    validateField(passwordInput);
}, 300));

// 表单提交验证
form.addEventListener('submit', (e) => {
    if (!validateField(emailInput) || 
        !validateField(passwordInput)) {
        e.preventDefault();
    }
});
</script>

补充说明

  • 错误提示应该明确告知如何修复
  • 使用 aria-describedby 关联错误信息
  • 验证时机:blur 时开始验证,input 时防抖验证
  • 不要只依赖客户端验证,服务器端也要验证