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-block或block
三、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>© 2024 公司名称</p>
</footer>
</body>
</html>
补充说明:
<meta charset="UTF-8">应放在<head>靠前位置- 移动端开发必须设置视口(viewport)meta 标签
<title>是 SEO 中最重要的标签之一- 外部样式表通常放在
<head>中,脚本放在<body>末尾
9. <!DOCTYPE> 的作用及 HTML5 意义
问题:<!DOCTYPE> 的作用及 HTML5 意义
答案:
核心回答:<!DOCTYPE> 声明文档类型,告诉浏览器使用哪种 HTML 规范来解析和渲染页面。
详细说明:
DOCTYPE 的作用:
- 标准模式声明:告诉浏览器使用 W3C 标准渲染页面
- 避免兼容模式:防止浏览器使用旧的 Quirks Mode 渲染
- 一致性保证:确保不同浏览器有相同的解析规则
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 的改进:
| 方面 | HTML4 | HTML5 |
|---|---|---|
| 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>© 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>© 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>© 2024 在线教育平台 | <time datetime="2024">2024</time></p>
</footer>
</body>
</html>
补充说明:
- 不要用语义化标签做样式用途,应该用 div + class
- article 可以嵌套 article,表示嵌套的文章与主文章有关联
- section 不要作为样式容器使用,它有语义含义
15. 对 HTML 语义化的理解
问题:对 HTML 语义化的理解
答案: 核心回答:HTML 语义化是用合适的标签表达正确的含义,使页面结构清晰,利于 SEO、无障碍访问和代码维护。
详细说明:
语义化的核心价值:
- 可访问性(Accessibility):屏幕阅读器能正确识别内容结构
- 搜索引擎优化(SEO):搜索引擎能更好地理解页面内容
- 代码可维护性:开发者能快速理解代码结构
- 跨设备兼容:不同设备能正确解析内容
语义化 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. src 和 href 区别
问题:src 和 href 区别
答案:
核心回答:src 用于替换当前元素内容,href 用于建立当前文档与引用资源的关系。
详细说明:
| 特征 | src | href |
|---|---|---|
| 语义 | source(来源) | hypertext reference(超文本引用) |
| 作用 | 替换元素内容 | 建立关联关系 |
| 加载时机 | 立即加载 | 不会阻止文档加载 |
| 使用场景 | img、script、iframe、video、audio | link、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 属性相同、type 为 radio、且 value 值唯一。
详细说明:
必要条件:
type="radio"- 必须声明为单选框类型name="xxx"- 同一分组的 name 值必须相同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. img 的 alt 和 title 区别
问题:img 的 alt 和 title 区别
答案:
核心回答:alt 是图片的替代文本,图片无法显示时显示;title 是提示信息,鼠标悬停时显示。
详细说明:
| 特征 | alt | title |
|---|---|---|
| 作用 | 图片替代文本 | 额外提示信息 |
| 显示时机 | 图片加载失败、屏幕阅读器 | 鼠标悬停 |
| 必填性 | 建议填写(尤其有意义图片) | 可选 |
| 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 是额外提示信息,两者作用完全不同。
详细说明:
| 特征 | alt | title |
|---|---|---|
| 用途 | 图片无法显示时的替代文本 | 额外补充信息 |
| 显示 | 图片加载失败时显示 | 鼠标悬停时显示 |
| 屏幕阅读器 | 朗读 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(图片属性):
| 特征 | alt | title |
|---|---|---|
| 显示条件 | 图片加载失败 | 鼠标悬停 |
| 屏幕阅读器 | 朗读 | 不朗读 |
| SEO 价值 | 高 | 低 |
| 必填性 | 建议填写 | 可选 |
| 适用元素 | img 等 | 所有元素 |
代码示例:
<img
src="laptop.jpg"
alt="银色MacBook Pro 14寸笔记本" <!-- 图片替代 -->
title="Apple MacBook Pro M3" <!-- 悬停提示 -->
>
strong vs em(文本强调):
| 特征 | strong | em |
|---|---|---|
| 语义 | 重要性、严重性、警告 | 词语或句子含义强调 |
| 默认样式 | 粗体 | 斜体 |
| 强调程度 | 更强 | 一般 |
| 嵌套 | 可嵌套,层层递进 | 可嵌套 |
代码示例:
<!-- 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、透明图 | 照片(体积太大) |
| GIF | 256色,支持动画 | 简单动画、动图 | 照片、渐变图像 |
| 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 是元素提示信息用于提供额外上下文。
详细说明:
| 属性 | alt | title |
|---|---|---|
| 显示时机 | 图片加载失败时 | 鼠标悬停 |
| 屏幕阅读器 | 朗读 | 不朗读 |
| 适用元素 | 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-label 或 aria-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 |
url | URL 地址 | 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>使用 - 使用
required、pattern等属性进行验证 name属性是表单提交的关键
44. HTML5 新增的表单控件类型(至少 3 个)
问题:HTML5 新增的表单控件类型(至少 3 个)
答案: 核心回答:HTML5 新增了 email、date、time、number、range、color、search、url、tel 等多种表单控件类型。
详细说明:
新增类型详解:
| 类型 | 用途 | 代码示例 |
|---|---|---|
email | 邮箱验证 | <input type="email"> |
url | URL 验证 | <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. 表单元素的各种类型及其属性、应用场景
问题:表单元素的各种类型及其属性、应用场景
答案: 核心回答:表单元素类型包括文本、密码、单选、复选、下拉、文件等,各有特定属性和应用场景。
详细说明:
| 类型 | 属性 | 应用场景 |
|---|---|---|
| text | maxlength, placeholder | 用户名、姓名 |
| password | minlength, pattern | 密码输入 |
| multiple, pattern | 邮箱地址 | |
| url | - | 网站地址 |
| tel | pattern | 电话号码 |
| number | min, max, step | 数量、年龄 |
| date/time | min, max | 日期选择 |
| checkbox | checked, value | 多选爱好 |
| radio | checked, name | 单选性别 |
| select | multiple, size | 下拉国家 |
| textarea | rows, cols, maxlength | 留言、评论 |
| file | accept, multiple | 文件上传 |
| hidden | value | 隐藏数据 |
代码示例:
<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是提交到服务器的关键required、min/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 时防抖验证
- 不要只依赖客户端验证,服务器端也要验证