一、HTML5新特性与语义化
1.1 语义化概述
语义化意味着顾名思义,HTML5的语义化指的是合理正确地使用语义化的标签来创建页面结构,如 header、footer、nav 等,从标签上即可以直观地知道这个标签的作用,而不是滥用 div 标签。
语义化标签:
header:页面或区域的头部nav:导航栏main:主要内容区域article:文章内容section:文档区块aside:侧边栏footer:页面或区域的底部
语义化的优点:
- 代码结构清晰,易于阅读,利于开发和维护
- 方便其他设备解析(如屏幕阅读器)根据语义渲染网页
- 有利于搜索引擎优化(SEO),搜索引擎爬虫会根据不同的标签来赋予不同的权重
1.2 HTML5表单新特性
新的输入类型:
email:电子邮箱输入tel:电话号码输入number:数字输入date:日期选择range:滑块控件color:颜色选择
表单验证属性:
required:必填字段pattern:正则表达式验证min/max:数值范围限制minlength/maxlength:字符长度限制
新增表单控件:
datalist:输入建议列表progress:进度条meter:度量衡指示器
二、CSS盒子模型
2.1 盒模型概述
所有 HTML 元素可以看作盒子,在 CSS 中,box model 这一术语是用来设计和布局时使用。CSS 盒模型本质上是一个盒子,封装周围的 HTML 元素,它包括:边距(margin),边框(border),填充(padding),和实际内容(content)。
盒模型组成:
┌─────────────────────────────┐
│ Margin │
│ ┌───────────────────────┐ │
│ │ Border │ │
│ │ ┌─────────────────┐ │ │
│ │ │ Padding │ │ │
│ │ │ ┌───────────┐ │ │ │
│ │ │ │ Content │ │ │ │
│ │ │ └───────────┘ │ │ │
│ │ └─────────────────┘ │ │
│ └───────────────────────┘ │
└─────────────────────────────┘2.2 盒模型类型
标准盒模型(content-box):
width/height只包含内容(content)- 不包含 padding、border、margin
- 实际占用空间 = content + padding + border + margin
IE盒模型(border-box):
width/height包含内容(content)、padding 和 border- 不包含 margin
- 实际占用空间 = width/height + margin
2.3 box-sizing 属性
/* 默认值,标准盒模型 */
box-sizing: content-box;
/* IE盒模型,更易于布局计算 */
box-sizing: border-box;
/* 推荐:全局使用 border-box */
* {
box-sizing: border-box;
}
三、CSS样式优先级
3.1 优先级排序
CSS选择器的优先级从高到低为:
!important > 内联样式 > ID选择器 > 类选择器/伪类/属性选择器 > 元素选择器 > 通配符 > 继承
3.2 优先级权重计算
** specificity(特异性)计算规则**:
| 选择器类型 | 权重值 |
|---|---|
| 内联样式 | 1000 |
| ID选择器 | 100 |
| 类选择器/伪类/属性选择器 | 10 |
| 元素选择器/伪元素 | 1 |
| 通配符 | 0 |
示例:
/* ID选择器,权重 100 */
#header {
color: red;
}
/* 类选择器,权重 10 */
.container {
color: blue;
}
/* 元素选择器,权重 1 */
div {
color: green;
}
/* 结果:红色优先级最高 */
注意:当优先级相同时,后面声明的样式会覆盖前面的样式(后来居上原则)。
四、BFC(块格式化上下文)
4.1 BFC定义
BFC 是 Block Formatting Context 的缩写,即块格式化上下文。BFC 是 CSS 布局的一个概念,是一个独立的渲染区域,里面的元素不会影响外面的元素。
布局规则:
- Box 是 CSS 布局的对象和基本单位,页面是由若干个 Box 组成的
- 元素的类型和 display 属性,决定了这个 Box 的类型
- 不同类型的 Box 会参与不同的
Formatting Context
4.2 创建BFC的方法
- 浮动元素(
float: left/right) display: inline-blockdisplay: table-cell, flex, table-caption, inline-flex, flow-root(现代方式,推荐)overflow: hidden/auto/scroll(非 visible)position: absolute/fixed
推荐使用:display: flow-root(不会产生副作用)
4.3 BFC应用场景
防止margin重叠:
- 同一个 BFC 内的相邻元素,垂直方向的 margin 会合并
- 分属于不同的 BFC 时,可以防止 margin 重叠
清除内部浮动:
- 浮动元素会脱离文档流,导致父元素高度塌陷
- 给父元素创建 BFC,可以包含浮动元素
自适应多栏布局:
- BFC 不会与浮动元素重叠
- 可以实现两栏布局(文字环绕 + 侧边栏)
五、em和rem的区别
对于 em 和 rem 的区别一句话概括:em 相对于父元素,rem 相对于根元素。
5.1 基本概念
em:
- 相对于父元素的字体大小
- 如果没有设置,则继承自祖先元素
- 最终相对于根元素(如果祖先都没设置)
rem:
- 相对于根元素(
<html>)的字体大小 - 不受父元素影响
- 推荐用于响应式布局
5.2 区别对比
| 特性 | em | rem |
|---|---|---|
| 参照物 | 父元素 | 根元素 |
| 级联效果 | 有 (逐级相乘) | 无 |
| 响应式适配 | 复杂 | 简单 (推荐) |
示例:
html {
font-size: 16px;
}
.parent {
font-size: 1.5em;
} /* 24px = 16px * 1.5 */
.child {
font-size: 1.5em;
} /* 36px = 24px * 1.5 */
/* 使用 rem 避免级联问题 */
.rem-parent {
font-size: 1.5rem;
} /* 24px */
.rem-child {
font-size: 1.5rem;
} /* 24px */
六、CSS Flexbox和Grid布局
6.1 Flexbox(弹性布局)
一维布局模型,适用于行或列的布局。
Flex容器属性:
display: flex或display: inline-flexflex-direction:主轴方向(row/column)justify-content:主轴对齐方式align-items:交叉轴对齐方式flex-wrap:换行方式
Flex项目属性:
flex-grow:放大比例flex-shrink:缩小比例flex-basis:初始大小align-self:单独对齐方式
常用场景:
- 水平居中
- 等高列布局
- 导航菜单
- 卡片网格
6.2 Grid(网格布局)
二维布局模型,适用于复杂的网格布局。
Grid容器属性:
display: grid或display: inline-gridgrid-template-columns:定义列grid-template-rows:定义行gap:间距grid-template-areas:命名区域
常用场景:
- 页面整体布局
- 相册网格
- 仪表盘
- 复杂的对齐需求
6.3 Flexbox vs Grid 对比
| 特性 | Flexbox | Grid |
|---|---|---|
| 维度 | 一维(行或列) | 二维(行和列) |
| 控制方式 | 内容驱动 | 容器驱动 |
| 适用场景 | 组件布局 | 页面布局 |
| 对齐能力 | 强大 | 更强大 |
七、CSS变量和预处理器
7.1 CSS变量
定义和使用:
:root {
--primary-color: #3498db;
--spacing: 16px;
--border-radius: 8px;
}
.button {
background-color: var(--primary-color);
padding: var(--spacing);
border-radius: var(--border-radius);
}
优点:
- 统一管理主题样式
- 方便动态修改
- 减少重复代码
7.2 CSS预处理器
Sass/SCSS 和 Less 提供的特性:
| 特性 | 说明 |
|---|---|
| 变量 | 存储颜色、尺寸等值 |
| 嵌套 | 减少重复选择器 |
| 混合(Mixin) | 复用样式块 |
| 运算 | 数学计算 |
| 条件语句 | @if/@else |
| 循环 | @for/@each |
示例(Sass):
$primary-color: #3498db;
@mixin flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.button {
background-color: $primary-color;
@include flex-center;
}
八、响应式设计原理
8.1 核心原则
- 移动优先:先设计移动端,再适配更大屏幕
- 弹性布局:使用相对单位代替固定单位
- 断点设计:在不同屏幕尺寸应用不同样式
8.2 媒体查询
/* 移动优先 */
/* 小屏幕(平板) */
@media (min-width: 768px) {
.container {
width: 750px;
}
}
/* 中等屏幕(桌面) */
@media (min-width: 992px) {
.container {
width: 970px;
}
}
/* 大屏幕 */
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
8.3 响应式单位
| 单位 | 说明 | 适用场景 |
|---|---|---|
em |
相对于父元素字体 | 组件内响应式 |
rem |
相对于根元素字体 | 全局响应式 |
% |
相对于父元素 | 流体布局 |
vw/vh |
视口宽度/高度 | 视口相关布局 |
vmin/vmax |
视口较小/较大边 | 极端情况适配 |
九、CSS动画和过渡效果
9.1 CSS过渡(Transition)
属性:
transition-property:过渡属性transition-duration:持续时间transition-timing-function:缓动函数transition-delay:延迟时间
简写形式:
.button {
transition:
background-color 0.3s ease-in-out,
transform 0.2s;
}
9.2 CSS动画(Animation)
基本语法:
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.element {
animation: slideIn 0.5s ease-out;
}
动画属性:
animation-name:动画名称animation-duration:持续时间animation-timing-function:缓动函数animation-delay:延迟时间animation-iteration-count:播放次数animation-direction:播放方向
十、浏览器渲染机制
10.1 网页生成过程
- HTML解析:HTML 被解析器解析成 DOM 树
- CSS解析:CSS 被解析器解析成 CSSOM 树
- 渲染树构建:结合 DOM 树和 CSSOM 树,生成渲染树(Render Tree)
- 布局计算:计算每个节点的位置和尺寸(Layout)
- 绘制:将布局绘制到屏幕上(Paint)
- 合成:将不同图层合成(Composite)
10.2 重排(Reflow)与重绘(Repaint)
重排(回流):
- 当 DOM 的变化影响了元素的几何信息(位置、尺寸大小)
- 浏览器需要重新计算元素的几何属性
- 性能开销较大
触发重排的操作:
- 添加或删除可见的 DOM 元素
- 元素尺寸改变(边距、填充、边框、宽高)
- 改变元素位置(
top、left、right、bottom) - 改变元素内容(文本变化、图片尺寸变化)
- 窗口大小改变
- 获取元素尺寸或位置属性(
offsetWidth、offsetHeight、getBoundingClientRect等)
重绘:
- 当元素的外观发生改变,但几何属性不变
- 浏览器重新绘制元素外观
- 性能开销比重排小
触发重绘的操作:
- 改变元素的
color、background、box-shadow、visibility等属性
10.3 优化建议
减少重排重绘:
- 分离读写操作:先读后写,避免多次布局
- 集中样式修改:使用
cssText或切换类名批量修改多个元素的样式 - 缓存布局信息:避免重复获取偏移量
- 使用定位:尽量只修改
position: absolute/fixed的元素 - GPU加速:使用
transform、opacity创建合成层
重绘和重排是两个不同的概念,重绘是元素外观的改变,重排是元素几何信息的改变。
transform vs 位置属性:
transform 不会触发重排(回流),因为它不改变元素的几何属性。对于 transition/animate 动画,使用 transform(特别是配合 will-change 或 3D transform)会创建合成层,避免触发重绘。浏览器会通过重新复合来创建动画帧,从而提升性能。
/* 性能差:触发重排 */
.element {
top: 100px;
left: 50px;
}
/* 性能好:触发重绘,使用GPU加速 */
.element {
transform: translate(50px, 100px);
}
will-change 提示:
.element {
will-change: transform; /* 提前告知浏览器元素将变化 */
}
十一、CSS性能优化
11.1 选择器优化
- 避免使用通配符选择器
- 减少选择器嵌套层级
- 使用高效选择器(ID > 类 > 元素)
不推荐:
.header .nav ul li a {
color: white;
}
推荐:
.nav-link {
color: white;
}
11.2 渲染优化
- 使用
transform和opacity实现动画(创建合成层) - 避免同时动画多个属性
- 使用
will-change提示浏览器
11.3 其他优化
- 避免使用
!important - 使用简写属性
- 压缩 CSS 文件
- 延迟加载非关键 CSS
十二、无障碍访问(ARIA)
12.1 语义化标签
- 使用正确的 HTML5 语义化标签
- 确保标题层级正确(h1 → h2 → h3)
- 使用
alt属性为图片提供替代文本
12.2 ARIA属性
常用 ARIA 属性:
| 属性 | 说明 |
|---|---|
aria-label |
为元素提供可访问名称 |
aria-describedby |
关联描述 |
aria-hidden |
隐藏元素(但不从DOM中移除) |
aria-expanded |
指示展开/折叠状态 |
aria-disabled |
指示禁用状态 |
12.3 键盘可访问性
- 确保所有可交互元素可以通过键盘访问
- 使用
:focus样式指示焦点 - 提供跳过链接(Skip Link)
- 确保焦点顺序合理
示例:
<!-- 跳转到主内容的链接 -->
<a href="#main-content" class="skip-link">跳转到主要内容</a>
<style>
.skip-link {
position: absolute;
top: -40px;
}
.skip-link:focus {
top: 0;
}
</style>