Skip to content

CSS基础概念

1. CSS基本语法

Details

CSS(Cascading Style Sheets)基本语法由选择器、属性和值组成,用于描述HTML元素的样式。

基本语法结构

css
selector {
  property1: value1;
  property2: value2;
  /* 注释 */
}
  • 选择器(Selector):指定要应用样式的HTML元素。
  • 属性(Property):要设置的样式属性,如 colorfont-size 等。
  • 值(Value):属性的具体值,如 red16px 等。
  • 声明(Declaration):由属性和值组成的键值对。
  • 规则集(Rule Set):由选择器和一组声明组成。

选择器类型

  1. 元素选择器:选择指定类型的元素。
css
div {
  color: red;
}
  1. 类选择器:选择具有指定类名的元素。
css
.btn {
  padding: 10px;
}
  1. ID选择器:选择具有指定ID的元素。
css
#header {
  background-color: blue;
}
  1. 属性选择器:选择具有指定属性的元素。
css
input[type="text"] {
  border: 1px solid #ccc;
}
  1. 组合选择器
    • 后代选择器:.parent .child
    • 子元素选择器:.parent > .child
    • 相邻兄弟选择器:.element + .sibling
    • 通用兄弟选择器:.element ~ .sibling

注释

CSS中的注释使用 /* */ 语法:

css
/* 这是一个注释 */
div {
  color: red; /* 行内注释 */
}

CSS单位

  1. 绝对单位

    • px(像素)
    • pt(点)
    • cm(厘米)
    • mm(毫米)
    • in(英寸)
  2. 相对单位

    • em:相对于父元素的字体大小
    • rem:相对于根元素的字体大小
    • %:相对于父元素的百分比
    • vw:相对于视口宽度的1%
    • vh:相对于视口高度的1%
    • vmin:相对于视口最小尺寸的1%
    • vmax:相对于视口最大尺寸的1%

CSS颜色表示方法

  1. 关键字:如 redbluegreen 等。

  2. 十六进制:如 #FF0000(红色)、#0000FF(蓝色)。

  3. RGB:如 rgb(255, 0, 0)(红色)。

  4. RGBA:如 rgba(255, 0, 0, 0.5)(半透明红色)。

  5. HSL:如 hsl(0, 100%, 50%)(红色)。

  6. HSLA:如 hsla(0, 100%, 50%, 0.5)(半透明红色)。

CSS引入方式

  1. 内联样式:直接在HTML元素的 style 属性中定义样式。
html
<div style="color: red; font-size: 16px;">Hello</div>
  1. 内部样式表:在HTML文档的 <head> 部分使用 <style> 标签定义样式。
html
<head>
  <style>
    div {
      color: red;
      font-size: 16px;
    }
  </style>
</head>
  1. 外部样式表:使用 <link> 标签引入外部CSS文件。
html
<head>
  <link rel="stylesheet" href="style.css">
</head>
  1. @import:在CSS文件中引入其他CSS文件。
css
@import url("other-styles.css");

CSS规则的层叠顺序

当多个CSS规则应用于同一个元素时,会按照以下顺序确定最终的样式:

  1. 重要性!important 规则具有最高优先级。
  2. 来源:用户代理样式 < 用户样式 < 作者样式。
  3. 特异性:选择器的特异性越高,优先级越高。
  4. 顺序:如果特异性相同,后面定义的规则会覆盖前面的规则。

示例代码

css
/* 元素选择器 */
h1 {
  font-size: 24px;
  color: #333;
}

/* 类选择器 */
.container {
  width: 100%;
  max-width: 1200px;
  margin: 0 auto;
}

/* ID选择器 */
#header {
  background-color: #f0f0f0;
  padding: 20px;
}

/* 组合选择器 */
.container p {
  line-height: 1.5;
  margin-bottom: 15px;
}

/* 伪类选择器 */
a:hover {
  color: blue;
  text-decoration: underline;
}

/* 伪元素选择器 */
p::first-letter {
  font-size: 1.5em;
  font-weight: bold;
}

总结

CSS基本语法是CSS的基础,掌握好基本语法对于编写有效的CSS代码至关重要。通过选择器、属性和值的组合,可以创建丰富多样的样式效果。

2. 盒模型与box-sizing属性

Details

盒模型(Box Model)是CSS中描述元素布局的基础概念,它定义了元素如何占据空间以及如何与其他元素交互。而box-sizing属性则控制盒模型的计算方式。

盒模型的组成部分

  1. 内容区域(Content):元素的实际内容,由widthheight属性定义。
  2. 内边距(Padding):内容与边框之间的空间,由padding属性定义。
  3. 边框(Border):围绕内容和内边距的边界,由border属性定义。
  4. 外边距(Margin):元素与其他元素之间的空间,由margin属性定义。

标准盒模型 vs 替代盒模型

  1. 标准盒模型(content-box)

    • widthheight只包括内容区域的大小。
    • 总宽度 = width + padding-left + padding-right + border-left + border-right
    • 总高度 = height + padding-top + padding-bottom + border-top + border-bottom
  2. 替代盒模型(border-box)

    • widthheight包括内容区域、内边距和边框。
    • 总宽度 = width(包含padding和border)
    • 总高度 = height(包含padding和border)

box-sizing属性

  • 语法box-sizing: content-box | border-box | inherit
  • 默认值content-box

使用border-box的优势

  1. 更直观的尺寸控制:设置元素的widthheight时,不需要考虑内边距和边框的影响。
  2. 简化布局计算:特别是在使用百分比宽度时,更容易预测元素的实际大小。
  3. 一致性:避免了不同浏览器对盒模型的解析差异。

示例代码

css
/* 标准盒模型 */
.standard-box {
  box-sizing: content-box;
  width: 200px;
  padding: 20px;
  border: 1px solid #000;
  /* 实际宽度:200 + 20*2 + 1*2 = 242px */
}

/* 替代盒模型 */
.border-box {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;
  border: 1px solid #000;
  /* 实际宽度:200px(包含padding和border) */
}

/* 全局使用border-box */
* {
  box-sizing: border-box;
}

总结

box-sizing属性是CSS布局中的重要工具,通过设置为border-box可以使元素的尺寸计算更加直观和可控。在现代前端开发中,通常推荐全局使用border-box来简化布局计算和提高代码的可维护性。

3. 伪类和伪元素

Details

CSS中的伪类(Pseudo-classes)和伪元素(Pseudo-elements)是用于选择和样式化元素的特殊选择器,它们允许开发者对元素的特定状态或部分进行样式化,而不需要添加额外的HTML标记。

伪类(Pseudo-classes)

伪类用于选择元素的特定状态或位置,以:开头。

常见的伪类

  1. 状态伪类
  • :hover:鼠标悬停在元素上时
  • :active:元素被激活(点击)时
  • :focus:元素获得焦点时
  • :visited:已访问的链接
  • :link:未访问的链接
  1. 结构伪类

    • :first-child:父元素的第一个子元素
    • :last-child:父元素的最后一个子元素
    • :nth-child(n):父元素的第n个子元素
    • :nth-of-type(n):父元素中同类型的第n个元素
    • :only-child:父元素的唯一子元素
  2. 其他伪类

    • :not(selector):选择不匹配指定选择器的元素
    • :empty:选择没有子元素的元素
    • :checked:选择被选中的表单元素
    • :disabled:选择被禁用的表单元素
    • :enabled:选择被启用的表单元素

伪元素(Pseudo-elements)

伪元素用于选择元素的特定部分,以::开头(CSS3规范)。

常见的伪元素

  1. ::before:在元素内容前插入内容
  2. ::after:在元素内容后插入内容
  3. ::first-letter:选择元素的第一个字母
  4. ::first-line:选择元素的第一行
  5. ::selection:选择用户选中的文本

伪类和伪元素的区别

  1. 语法:伪类使用单冒号:,伪元素在CSS3中使用双冒号::(为了兼容性,单冒号也可以用于旧的伪元素)。
  2. 功能:伪类选择元素的特定状态,伪元素选择元素的特定部分。
  3. 数量:一个选择器可以包含多个伪类,但只能包含一个伪元素。

示例代码

css
/* 伪类示例 */
a:hover {
  color: red;
}

li:first-child {
  font-weight: bold;
}

input:focus {
  border-color: blue;
}

/* 伪元素示例 */
blockquote::before {
  content: "\201C"; /* 左引号 */
  font-size: 2em;
  color: #ccc;
}

blockquote::after {
  content: "\201D"; /* 右引号 */
  font-size: 2em;
  color: #ccc;
}

p::first-letter {
  font-size: 2em;
  font-weight: bold;
}

::selection {
  background-color: yellow;
  color: black;
}

总结

伪类和伪元素是CSS中强大的工具,它们允许开发者对元素的特定状态或部分进行样式化,而不需要添加额外的HTML标记。合理使用伪类和伪元素可以使CSS代码更加简洁、语义化,同时实现更丰富的视觉效果。

4. 继承与层叠

Details

CSS中的继承(Inheritance)和层叠(Cascade)是CSS的两个核心概念,它们决定了如何处理样式冲突和样式传递。

继承(Inheritance)

继承是指子元素从父元素继承某些CSS属性的值。不是所有的CSS属性都可以继承,只有那些与文本相关的属性通常可以继承。

可继承的属性

  • 文本相关colorfont-familyfont-sizefont-weightline-heighttext-align
  • 列表相关list-stylelist-style-typelist-style-position
  • 其他visibilitycursor

不可继承的属性

  • 布局相关widthheightmarginpaddingborder
  • 定位相关positiontopleftz-index
  • 背景相关background-colorbackground-image

控制继承

  • inherit:强制继承父元素的属性值
  • initial:使用属性的初始值
  • unset:如果属性可继承则继承,否则使用初始值
  • revert:恢复到浏览器默认样式

层叠(Cascade)

层叠是CSS的核心机制,它决定了当多个样式规则应用于同一个元素时,哪个规则会生效。层叠的优先级顺序如下:

  1. 重要性(Importance)!important 规则具有最高优先级
  2. 来源(Origin)
    • 用户代理样式(浏览器默认样式)
    • 用户样式(用户自定义样式)
    • 作者样式(开发者编写的样式)
  3. Specificity(特异性):选择器的特异性决定了样式的优先级
  4. 顺序(Order):如果特异性相同,后面定义的样式会覆盖前面的样式

特异性计算

特异性是通过选择器的类型来计算的,优先级从高到低:

  1. 内联样式:1000
  2. ID选择器:100
  3. 类选择器、伪类选择器、属性选择器:10
  4. 元素选择器、伪元素选择器:1

示例代码

css
/* 继承示例 */
body {
  color: #333;
  font-family: Arial, sans-serif;
}

/* p元素会继承body的color和font-family属性 */
p {
  /* 不需要重复定义color和font-family */
  font-size: 16px;
}

/* 控制继承 */
.special {
  color: inherit; /* 继承父元素的颜色 */
  margin: initial; /* 使用初始值 */
}

/* 层叠示例 */
/* 元素选择器 - 特异性:1 */
p {
  color: blue;
}

/* 类选择器 - 特异性:10 */
.text {
  color: red;
}

/* ID选择器 - 特异性:100 */
#unique {
  color: green;
}

/* 内联样式 - 特异性:1000 */
/* <p style="color: purple;">...</p> */

/* !important - 最高优先级 */
p {
  color: yellow !important;
}

总结

继承和层叠是CSS的核心概念,理解它们对于编写有效的CSS代码至关重要。继承允许子元素从父元素继承某些属性,减少代码重复;层叠则解决了样式冲突,确保正确的样式应用到元素上。

5. CSS优先级的判断法则

Details

CSS 优先级(也称为"特 specificity")是决定哪些样式规则应用于特定元素的一种机制。理解 CSS 优先级对于编写有效、可维护的样式至关重要。以下是 CSS 优先级的判断法则和计算方法。

1. 优先级计算法则

在 CSS 中,优先级的计算主要基于选择器的类型和具体性。优先级通常按照以下顺序进行评估:

  1. 内边样式(Inline styles):直接在 HTML 元素的 style 属性中定义的样式。

    • 例:<div style="color: red;">Hello</div>
    • 优先级值:1000
  2. ID 选择器:使用 # 符号定义的选择器,选择器中每个 ID 的优先级值。

    • 例:#header
    • 优先级值:100
  3. 类选择器、伪类选择器、属性选择器:使用 . 符号(类选择器),: 符号(伪类选择器),或 [](属性选择器)定义的选择器。

    • 例:.className:hover[type="text"]
    • 优先级值:10
  4. 元素选择器和伪元素选择器:直接选择元素的选择器(如 divpspan)和使用 :: 符号的伪元素选择器(如 ::before::after)。

    • 例:divp
    • 优先级值:1
  5. 通配符选择器* 选择所有元素,没有特定优先级。

    • 优先级值:0

2. 计算优先级示例

假设我们有以下 CSS 规则:

css
#header {
    color: blue; /* 优先级 100 */
}

.header {
    color: green; /* 优先级 10 */
}

div {
    color: yellow; /* 优先级 1 */
}

<div id="header" class="header">Hello</div>

在这个例子中,#header 选择器的优先级最高(100),所以 <div id="header" class="header"> 元素的文本颜色将为蓝色。

3. 优先级冲突处理

如果多个选择器具有相同的优先级,最后定义的样式规则将生效。例如:

css
p {
    color: red; /* 优先级 1 */
}

p {
    color: blue; /* 优先级 1 */
}

在这个例子中,<p> 元素的颜色将为蓝色,因为最后定义的规则覆盖了之前的规则。

4. 重要性和 !important

使用 !important 可以强制某个样式规则具有最高优先级。任何带有 !important 的样式都将覆盖其他所有样式,无论它们的优先级如何。例如:

css
p {
    color: red !important; /* 优先级 1000 */
}

p {
    color: blue; /* 优先级 1 */
}

在这个例子中,<p> 元素的颜色将为红色,因为它带有 !important

5. 总结

理解 CSS 的优先级和计算法则对于编写有效的样式至关重要。通过正确使用选择器类型和优先级,可以确保样式按预期应用于 HTML 元素。避免过度使用 !important,以免使样式变得难以维护。

6. CSS变量(CSS Custom Properties)

Details

CSS变量(CSS Custom Properties)是CSS3中引入的一种新特性,允许开发者定义和使用可重用的变量,提高CSS代码的可维护性和灵活性。

CSS变量的基本语法

css
/* 定义变量 */
:root {
  --primary-color: blue;
  --font-size: 16px;
  --spacing: 10px;
}

/* 使用变量 */
.container {
  color: var(--primary-color);
  font-size: var(--font-size);
  padding: var(--spacing);
}

CSS变量的特性

  1. 作用域:CSS变量具有作用域,在定义它们的选择器及其后代中可用。

    • 全局变量:在 :root 伪类中定义,可在整个文档中使用。
    • 局部变量:在特定选择器中定义,只在该选择器及其后代中可用。
  2. 可继承性:CSS变量会被后代元素继承,这使得它们在主题设计中非常有用。

  3. 动态性:CSS变量的值可以通过JavaScript动态修改,这使得它们在交互设计中非常灵活。

  4. 类型:CSS变量可以存储任何CSS值,包括颜色、长度、百分比、字符串等。

CSS变量的优势

  1. 减少重复代码:通过使用变量,可以避免在多个地方重复相同的值。
  2. 易于维护:当需要修改某个值时,只需修改变量的定义,而不需要在多处修改。
  3. 主题切换:通过修改CSS变量的值,可以轻松实现主题切换。
  4. 响应式设计:在媒体查询中修改CSS变量的值,可以实现响应式设计。
  5. 与JavaScript集成:可以通过JavaScript读取和修改CSS变量的值,实现更复杂的交互效果。

CSS变量的使用示例

css
/* 定义主题变量 */
:root {
  --primary-color: #007bff;
  --secondary-color: #6c757d;
  --success-color: #28a745;
  --danger-color: #dc3545;
  --light-color: #f8f9fa;
  --dark-color: #343a40;
}

/* 主题切换 */
[data-theme="dark"] {
  --primary-color: #0062cc;
  --secondary-color: #6c757d;
  --success-color: #218838;
  --danger-color: #c82333;
  --light-color: #343a40;
  --dark-color: #f8f9fa;
}

/* 使用变量 */
.btn {
  padding: 0.5rem 1rem;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.5;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  cursor: pointer;
  transition: all 0.2s ease-in-out;
}

.btn-primary {
  color: #fff;
  background-color: var(--primary-color);
  border-color: var(--primary-color);
}

.btn-secondary {
  color: #fff;
  background-color: var(--secondary-color);
  border-color: var(--secondary-color);
}

与JavaScript的集成

javascript
// 读取CSS变量
const rootStyles = getComputedStyle(document.documentElement);
const primaryColor = rootStyles.getPropertyValue('--primary-color');
console.log(primaryColor); // 输出: #007bff

// 修改CSS变量
document.documentElement.style.setProperty('--primary-color', '#0056b3');

// 主题切换
function toggleTheme() {
  const body = document.body;
  if (body.getAttribute('data-theme') === 'dark') {
    body.removeAttribute('data-theme');
  } else {
    body.setAttribute('data-theme', 'dark');
  }
}

总结

CSS变量是CSS3中一个非常强大的特性,它可以帮助开发者编写更简洁、更可维护的CSS代码。通过使用CSS变量,可以减少重复代码,提高代码的可读性和可维护性,同时还可以实现更灵活的主题切换和响应式设计。

7. 层叠上下文(Stacking Context)

Details

层叠上下文(Stacking Context)是CSS中一个重要的概念,它决定了元素在页面中的堆叠顺序。理解层叠上下文对于控制元素的显示顺序和解决z-index问题非常重要。

层叠上下文的概念

层叠上下文是一个三维的概念,它定义了元素在z轴上的堆叠顺序。每个层叠上下文都有自己的层叠顺序,内部的元素会按照特定的规则进行堆叠。

如何创建层叠上下文

以下情况会创建层叠上下文:

  1. 根元素:整个文档的根元素(<html>)默认创建一个层叠上下文。

  2. 定位元素

    • position: absoluteposition: relativez-index 不为 auto 的元素。
    • position: fixedposition: sticky 的元素。
  3. CSS3特性

    • opacity 小于 1 的元素。
    • transform 不为 none 的元素。
    • filter 不为 none 的元素。
    • backdrop-filter 不为 none 的元素。
    • perspective 不为 none 的元素。
    • isolation: isolate 的元素。
    • mix-blend-mode 不为 normal 的元素。
    • clip-path 不为 none 的元素。
  4. Flex和Grid容器

    • Flex容器的子元素,如果 z-index 不为 auto
    • Grid容器的子元素,如果 z-index 不为 auto

层叠顺序

在一个层叠上下文中,元素的堆叠顺序按照以下规则:

  1. 背景和边框:层叠上下文的背景和边框。
  2. 负z-indexz-index 为负数的子元素。
  3. 块级元素:文档流中的块级元素。
  4. 浮动元素:浮动的元素。
  5. 行内元素:文档流中的行内元素。
  6. z-index: autoz-indexauto 的定位元素。
  7. 正z-indexz-index 为正数的定位元素。

层叠上下文的特性

  1. 独立性:每个层叠上下文都是独立的,内部的元素不会影响外部的元素。
  2. 继承性:子元素会继承父元素的层叠上下文。
  3. z-index的作用域z-index 只在当前层叠上下文中有效。

层叠上下文的应用

  1. 解决z-index问题:理解层叠上下文可以帮助解决z-index不生效的问题。
  2. 创建隔离环境:通过创建层叠上下文,可以隔离内部元素的堆叠顺序。
  3. 优化性能:合理使用层叠上下文可以减少重绘和重排。

示例代码

css
/* 创建层叠上下文 */
.overlay {
  position: relative;
  z-index: 1;
  background-color: rgba(0, 0, 0, 0.5);
  width: 100%;
  height: 100%;
}

/* 内部元素的z-index只在当前层叠上下文中有效 */
.overlay .content {
  position: relative;
  z-index: 2; /* 这个z-index只在.overlay的层叠上下文中有效 */
  background-color: white;
  padding: 20px;
  border-radius: 4px;
}

/* 外部元素的z-index */
.modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1000; /* 这个z-index在根层叠上下文中有效 */
  background-color: rgba(0, 0, 0, 0.8);
}

总结

层叠上下文是CSS中一个重要的概念,它决定了元素在页面中的堆叠顺序。理解层叠上下文的创建条件和层叠顺序规则,可以帮助开发者更好地控制元素的显示顺序,解决z-index问题,并优化页面性能。

8. 媒体查询

Details

媒体查询(Media Queries)是CSS3中引入的一种特性,允许开发者根据设备的特性(如屏幕尺寸、分辨率、方向等)应用不同的样式规则,实现响应式设计。

媒体查询的基本语法

css
@media media-type and (media-feature) {
  /* 样式规则 */
}

媒体类型

  • all:适用于所有设备
  • screen:适用于屏幕设备
  • print:适用于打印设备
  • speech:适用于语音合成设备

常用的媒体特性

  • width:视口宽度
  • height:视口高度
  • device-width:设备宽度
  • device-height:设备高度
  • orientation:设备方向(portrait 或 landscape)
  • aspect-ratio:视口宽高比
  • device-aspect-ratio:设备宽高比
  • resolution:设备分辨率
  • color:颜色深度
  • color-index:颜色索引数
  • monochrome:单色深度
  • grid:是否是网格设备

媒体查询的使用示例

  1. 根据屏幕宽度应用不同样式

    css
    /* 移动设备 */
    @media (max-width: 767px) {
      .container {
        width: 100%;
      }
    }
    
    /* 平板设备 */
    @media (min-width: 768px) and (max-width: 991px) {
      .container {
        width: 90%;
        margin: 0 auto;
      }
    }
    
    /* 桌面设备 */
    @media (min-width: 992px) {
      .container {
        width: 80%;
        margin: 0 auto;
      }
    }
  2. 根据设备方向应用不同样式

    css
    @media (orientation: portrait) {
      /* 竖屏样式 */
      .container {
        flex-direction: column;
      }
    }
    
    @media (orientation: landscape) {
      /* 横屏样式 */
      .container {
        flex-direction: row;
      }
    }
  3. 根据分辨率应用不同样式

    css
    @media (min-resolution: 2dppx) {
      /* 高分辨率屏幕样式 */
      .image {
        background-image: url('high-res-image.png');
      }
    }

媒体查询的最佳实践

  1. 移动优先设计:先为移动设备设计样式,然后使用媒体查询为更大的屏幕添加样式。

  2. 使用相对单位:使用 %emremvwvh 等相对单位,而不是固定的像素值。

  3. 合理的断点:根据常见的设备尺寸设置合理的断点,如 360px、768px、1024px 等。

  4. 避免过度使用媒体查询:尽量使用弹性布局(Flexbox)和网格布局(Grid)等现代布局技术,减少对媒体查询的依赖。

  5. 测试:在不同的设备和浏览器上测试媒体查询的效果,确保响应式设计的一致性。

媒体查询的高级用法

  1. 媒体查询的逻辑操作符

    • and:同时满足多个条件
    • not:否定条件
    • only:仅在特定条件下应用样式
    css
    /* 使用 and 操作符 */
    @media screen and (min-width: 768px) and (max-width: 991px) {
      /* 样式 */
    }
    
    /* 使用 not 操作符 */
    @media not print {
      /* 非打印设备的样式 */
    }
    
    /* 使用 only 操作符 */
    @media only screen and (min-width: 768px) {
      /* 仅在屏幕设备且宽度大于等于768px时应用样式 */
    }
  2. 媒体查询的组合

    css
    /* 组合多个媒体查询 */
    @media (min-width: 768px), (orientation: landscape) {
      /* 宽度大于等于768px 或 横屏时应用样式 */
    }

总结

媒体查询是实现响应式设计的重要工具,它允许开发者根据设备的特性应用不同的样式规则。通过合理使用媒体查询,可以创建在各种设备上都能良好显示的网页。

9. CSS reset 和 Normalize.css

Details

CSS reset 和 Normalize.css 是两种用于处理浏览器默认样式差异的方法,它们的目标是确保在不同浏览器中,元素的默认样式保持一致。

CSS reset

CSS reset 是一种通过重置浏览器默认样式的方法,将所有元素的默认样式设置为相同的基准值,从而消除浏览器之间的差异。

常见的 CSS reset 方法

  1. 通配符重置:使用 * 选择器重置所有元素的样式。

    css
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
  2. Eric Meyer's CSS Reset:一个广泛使用的CSS reset方案。

    css
    /* http://meyerweb.com/eric/tools/css/reset/ 
       v2.0 | 20110126
       License: none (public domain)
    */
    
    html, body, div, span, applet, object, iframe,

h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; }


### Normalize.css

Normalize.css 是一种更现代的方法,它不是完全重置所有样式,而是保持有用的默认样式,同时修复浏览器之间的差异,使元素在不同浏览器中表现一致。

#### Normalize.css 的特点

1. **保留有用的默认样式**:不像CSS reset那样完全重置所有样式,而是保留了一些有用的默认样式,如标题的字体大小和粗体。

2. **修复浏览器bug**:修复了一些浏览器的特定bug,如IE8中的inline-block元素的间距问题。

3. **标准化样式**:确保元素在不同浏览器中的表现一致,如表单元素的样式。

4. **模块化**:可以根据需要只包含特定部分的样式。

5. **注释详细**:代码中有详细的注释,解释了每个规则的作用。

### CSS reset 与 Normalize.css 的比较

| 特性 | CSS reset | Normalize.css |
|------|-----------|---------------|
| 方法 | 完全重置所有样式 | 保留有用的默认样式,修复差异 |
| 目标 | 消除所有浏览器默认样式 | 使浏览器默认样式一致 |
| 适用场景 | 需要完全控制所有样式的项目 | 大多数项目,特别是需要保持默认样式的项目 |
| 代码量 | 通常较少 | 通常较多,但更详细 |

### 如何选择

1. **使用 CSS reset**:如果您需要完全控制所有元素的样式,不希望任何默认样式干扰您的设计。

2. **使用 Normalize.css**:如果您希望保持浏览器的一些有用的默认样式,同时确保在不同浏览器中的表现一致。

3. **混合使用**:可以先使用 Normalize.css 来标准化浏览器默认样式,然后根据需要添加自己的重置规则。

### 示例代码

```html
<!-- 在HTML中引入Normalize.css -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css">

<!-- 然后引入自己的样式 -->
<link rel="stylesheet" href="style.css">
css
/* 在自己的样式中添加额外的重置规则 */
/* 例如,重置列表样式 */
ul, ol {
  list-style: none;
}

/* 重置链接样式 */
a {
  text-decoration: none;
  color: inherit;
}

总结

CSS reset 和 Normalize.css 都是用于处理浏览器默认样式差异的方法,它们各有优缺点。选择哪种方法取决于项目的需求和个人偏好。无论选择哪种方法,重要的是确保在不同浏览器中,元素的默认样式保持一致,从而减少后续的样式调试工作。