CSS学习

Web-CSS-Study

 


 

<u> 作者:jason-wrj </u>

<u> 分类:服务器/网络服务器/CSS </u>

<u> 标签:Server, Web Server, CSS </u>

<u> 更多:www.dioit.com——迪欧IT——dio智能科技 </u>

<u> 更多:www.dioit.com——dioIT——嵌入式电子智能技术 </u>

 


 

1 概述

1.1 CSS 的基本概念

CSS(Cascading Style Sheets,层叠样式表)是一种用于描述HTML或XML(包括 SVG、XHTML 等)网页结构化文档(外观和格式视觉表现)呈现方式的样式表语言,由W3C制定标准。

CSS 通过定义网页元素的字体、间距、颜色、布局、动画等外观视觉属性,控制网页内容外观和布局,实现网页美化。

CSS 通过将样式与内容分离,使得网页设计更加灵活、高效,并支持动态变化的布局和交互效果。

CSS 是现代网页设计(前端开发)的核心技能之一,通过实践和参考优秀案例可以快速掌握。

1.2 CSS 的发展历程

  • 1994年:由哈坤·利(Håkon Wium Lie)首次提出,旨在解决HTML样式与内容混杂导致的代码臃肿问题。

  • 1996年:CSS1成为W3C推荐标准,支持基础样式控制。

  • 1998年:CSS2增加浮动、定位等复杂布局功能。

  • 2010年:CSS3引入圆角、阴影、动画等现代特性,与HTML5共同成为网页开发主流。

1.3 CSS 的版本演进

  • CSS3:当前主流版本,模块化引入弹性布局、动画、媒体查询等功能。

  • 向后兼容:新特性在不支持的老浏览器中可平稳降级。

1.4 CSS 的应用场景

  • 网页设计

    • 网页视觉美化(字体、颜色、背景)。

    • 构建响应式网站,适配不同设备(手机、平板、桌面)。

    • 动态交互效果(悬停、点击反馈)。

    • 打印样式优化(@media print)。

    • 组件化开发(配合CSS-in-JS或CSS Modules)。

  • 实现复杂的 UI 组件

    • 如导航栏、卡片布局、模态框。

  • 主题与样式库

    • 开发可复用的 UI 框架(如 Bootstrap、Tailwind CSS)。

    • 动态切换主题(如暗色模式)。

  • 性能优化

    • 使用 CSS 压缩工具减少文件体积。

    • 利用缓存策略提升加载速度。

  • 国际化与无障碍

    • 通过逻辑属性支持多语言排版(如阿拉伯语的 RTL 布局)。

    • 确保样式兼容屏幕阅读器。

1.5 CSS 的核心特点

  • 分离性

    内容与表现分离,HTML 专注结构,CSS 控制样式,便于维护和协作。CSS 将样式与 HTML 结构分离,提升代码可维护性。修改样式无需调整 HTML 结构,只需更新 CSS 文件。

  • 层叠性

    多个样式规则可叠加作用于同一元素,按优先级(如!important> 内联样式 > ID 选择器 > 类选择器 > 标签选择器)确定最终效果。

  • 继承性

    父元素的样式(如字体、颜色)可自动传递到子元素,减少重复代码。

  • 响应式设计

    通过媒体查询(Media Queries)适配不同设备屏幕(如手机、电脑),实现自适应布局。

  • 精准控制

    像素级调整元素位置、大小、边框等。

  • 样式复用

    一套样式可应用于多个页面,减少重复代码。

  • 性能优化

    支持外部样式表缓存,减少重复代码加载。

  • 丰富效果

    支持渐变、圆角、阴影、动画等现代视觉特性(CSS3)。

  • 可扩展性

    通过预处理器(如 Sass/Less)或后处理器(如PostCSS)增强功能。

  • 跨浏览器一致性

    通过标准化属性(如 display: flex)减少样式差异。

1.6 CSS 的功能作用

  • 控制网页外观

    • 颜色表示:支持十六进制(如 #FFFF00 表示黄色)、RGB 等格式。

    • 文本样式:字体、颜色、对齐方式。

    • 排版控制 :可以精确地设置字体、字号、行距、字距等排版属性,实现丰富的文本排版效果,如不同的字体样式、大小写转换、文本阴影等。

    • 外观美化 :可设置元素的颜色、背景图像、边框样式、圆角、阴影等外观属性,使网页更具视觉吸引力。

  • 实现复杂的布局((Flexbox)弹性盒子、(Grid)网格布局、响应式设计)。

    • 布局设计 :通过定位属性(如 position)、盒模型(marginpaddingborderwidthheight 等)以及弹性布局(flex 布局)、网格布局(grid 布局)等技术,实现复杂的网页布局,如响应式布局、多列布局等。

  • 管理元素的动态状态(悬停效果、动画)。

    • 交互效果 :利用伪类和 CSS 动画(@keyframes)、过渡(transition)等特性,为网页添加交互效果,如按钮悬停效果、点击效果、元素的动画过渡、关键帧动画等。

  • 内容与样式的分离

    • 通过 CSS 将网页的结构(HTML)与表现(CSS 样式)解耦,实现内容(HTML)与样式(CSS)分离,便于维护和更新,提升代码可维护性和复用性。

    • 允许通过一个样式表文件统一管理多个页面的样式。

  1. 提升开发效率

    • 避免重复的 HTML 标签(如 <font> 或表格布局),减少代码冗余。

    • 支持继承和层叠规则,简化样式覆盖逻辑。

1.7 CSS 的工作原理

  1. 解析 HTML,生成 DOM 树。

  2. 解析 CSS ,生成 CSSOM 树。

  3. 合并 DOM + CSSOM,构建渲染树。

  4. 布局与绘制,计算元素位置并渲染页面。

1.8 CSS 的优势与局限

  • 优势

    • 性能优化:外部样式表可被浏览器缓存,减少重复加载。

    • SEO友好:结构清晰的HTML更易被搜索引擎抓取。

    • 维护便捷:全局样式可通过单一CSS文件统一调整。

  • 局限

    • 浏览器兼容性问题(如旧版IE不支持部分CSS3属性)。

    • 学习曲线较陡,需掌握选择器优先级、盒模型等复杂概念。

    • CSS 本身主要用于样式和布局,对于页面的结构和内容逻辑的控制能力较弱,通常需要与 HTML 和 JavaScript 配合使用来实现更复杂的网页功能。

    • 一些复杂的样式效果可能需要使用较多的代码和技巧来实现,并且在不同浏览器中可能存在兼容性问题,需要进行额外的测试和调整。

 


 

2 CSS 引入方式与优先级

2.1 外部样式表(最常用)

外部样式表(External style sheet),编写在HTML文档中的<head> </head>头部元素之间,通过<link>元素标签引入独立 CSS 文件,方便实现多页面复用:

<head>
    <link rel="stylesheet" href="style.css">
</head>

  

2.2 内部样式表

内部样式表(Internal style sheet),通常编写在HTML文档中的<head> </head>头部元素之间的<style> </style>元素内,通过在<style>元素内,(且需要写在 link 外部样式表的后面,否则会被外部样式表优先覆盖内部样式表),直接定义 CSS 样式,仅当前页面有效:

<style>
    body { background: #f0f0f0; }
</style>

 

2.3 内联样式表

内联样式表(Inline style),直接写在 HTML 文档元素标签的style属性中,优先级最高但不利于维护:

<p style="color: purple;">示例文本</p>

 

2.4 样式表的优先级

内联样式 > 内部样式 > 外部样式 > 浏览器默认样式。

 


 

3 CSS 的基础语法

3.1 CSS 样式规则

由一系列规则集组成,规则集(ruleset)常简称为规则(rule)。每条规则集(ruleset)是由选择器(selector)声明块构成。如下所示:

selector_1,     /* 选择器1 */
selector_2,     /* 选择器2 */
selector_n {    /* 选择器n */
  property_1: value_1; /* 声明块1 */ /* 属性名_1: 属性值_1 */
  property_2: value_2; /* 声明块2 */ /* 属性名_2: 属性值_2 */
  property_n: value_n; /* 声明块n */ /* 属性名_n: 属性值_n */
}

 

  • 选择器

    选择器(Selectors)用于指定要应用样式的 HTML 或 XML 元素(如#id.classh1),例如: #id 用于选择具有特定 ID 的元素,.class 用于选择具有特定类的元素,p 用于选择所有段落元素等。

  • 声明块

    声明块(Declaration Block)由一对大括号 {} 包围,其中包含一条或多条(属性: 值;)声明(Declaration) 。每条声明都是由属性和值组成,用于指定元素的样式,例如( color: black;) 表示设置元素的文本颜色为黑色。

    • 属性(Property):是一个标识符,用可读的名称来表示其特性。如colorfont-sizemargin等样式属性(style attribute)。

    • 值(Value):属性的具体设置,每个属性都包含一个有效值的集合,它有正式的语法和语义定义。如red16pxauto等。(属性值与单位不能有空格,16 px是错误的,正确的写法是16px)。

  • 注释

    使用 /* 注释内容 */,添加 CSS 层叠样式表中的注释内容。

3.2 CSS 样式选择器

选择器(Selectors)至少要有一个,通过ID类名元素标签名等精准定位HTML元素,并指定要应用的样式(如 #id.classp),或通过属性伪类等实现动态样式。如果包含多个选择器的集合分组,则用逗号,分隔。

#header { background-color: gray; } /* ID选择器 */
.text-red { color: red; } /* 类选择器 */
[type="text"] { border: 1px solid black; } /* 属性选择器 */
:hover { } /* 伪类(状态) */
::before { } /* 伪元素(生成内容) */
p { color: blue; } /* 元素标签选择器 */
div p { margin: 10px; }      /* 关系组合选择器 */ /* 后代选择器 */
div > p { padding: 5px; }    /* 关系组合选择器 */ /* 子选择器 */
h1 + p { font-weight: bold; } /* 关系组合选择器 */ /* 相邻兄弟选择器 */

 

常见的选择器类型,有以下几种:

  • ID 选择器

    使用唯一ID 标识符来选择元素,匹配具有同名 ID 属性值的元素,(ID 标识符不要以数字开头,个别浏览器不起作用)。ID 前需要加上(井号 #),如 #myId 只会选中页面上唯一具有 id="myId" 属性的元素。

    例如:

    • #bg1 { background: blue; },匹配具有 id 属性,且 id 属性值为 bg1 的所有元素 。

  • 类选择器

    使用类名来选择元素,匹配具有同名 class 属性值的元素,(类名不要以数字开头,个别浏览器不起作用)。类名前需要加上(点号 .),如 .myClass 会选中所有具有 class="myClass" 属性的元素。

    例如:

    • .text1 { font-size: 16px; },匹配具有 class 属性,且 class 属性值为 text1 的所有元素。

  • 属性选择器

    根据元素的属性及其来选择元素,如 [type="text"] 会选中所有具有 type="text" 属性的元素。

    例如:

    • [attribute] { background: red; } ,匹配具有 attribute 属性的所有元素。

    • [attribute1=value1] { background: red; } ,匹配具有 attribute1 属性,且 attribute1 属性值与 value1 等同的所有元素。

    • [attribute2^=value2] { background: red; },匹配具有 attribute2 属性,且 attribute2 属性值以 value2 开头的所有元素。

    • [attribute3$=value3] { background: red; },匹配具有 attribute3 属性,且 attribute3 属性值以 value3 结尾的所有元素。

    • [attribute4*=value4] { background: red; },匹配具有 attribute4 属性,且 attribute4 属性值包含 value4 的所有元素。

    • [attribute5~=value5] { background: red; },匹配具有 attribute5 属性,且 attribute5 属性值包含一个以空格分隔的值与 value5 等同的所有元素。即 attribute5 属性的值里,必须有 value5这个单词,并且value5要与其它单词之间有空格分隔。

    • [attribute6|=value6] { background: red; },匹配具有 attribute6 属性,且 attribute6 属性值与 value6 等同或以 value6 开头的所有元素。

  • 伪类选择器

    用于选择处于特定状态的元素,如 :hover 用于选择鼠标悬停在元素上时的状态,:active 用于选择鼠标点击元素时的状态等。例如:a:hover { color: green; }

    例如:

    • :first-child,结构性伪类选择器,匹配在一组兄弟元素中的第一个元素。

    • :last-child,结构性伪类选择器,匹配在一组兄弟元素中的最后一个元素。

    • :nth-child(n),结构性伪类选择器,根据元素在父元素内的子元素列表中的索引来匹配选择元素。n 表示元素在子元素列表中的第几个

    • :nth-last-child(n),结构性伪类选择器,匹配子元素列表中的倒数第 n 个子元素。

    • :nth-child(odd),结构性伪类选择器,根据元素在父元素内的子元素列表中的索引来匹配选择元素。odd 表示元素在兄弟元素列表中的位置是奇数:1、3、5……。

    • :nth-child(even),结构性伪类选择器,根据元素在父元素内的子元素列表中的索引来匹配选择元素。even 表示元素在兄弟元素列表中的位置是偶数:2、4、6……。

    • :only-child,结构性伪类选择器,匹配仅有一个子元素的元素。

    • :first-of-type,结构性伪类选择器,匹配在一组兄弟元素中其类型第一个元素。

    • :last-of-type,结构性伪类选择器,匹配在(它父元素的)子元素列表中,最后一个给定类型的元素。

    • :only-of-type,结构性伪类选择器,匹配任意一个元素,这个元素没有其他相同类型的兄弟元素。

    • :nth-of-type(n),结构性伪类选择器,匹配相同类型元素的第 n 个元素。

    • :nth-last-of-type(n),结构性伪类选择器,匹配相同类型元素的倒数第 n 个元素。

    • :checked,UI元素状态伪类选择器,匹配选中状态的元素,选择任何处于选中状态的radio(<input type="radio">),checkbox (<input type="checkbox">) 或 select 元素中的 ("option") 元素。即匹配任意被勾选/选中的 radio(单选按钮),checkbox(复选框),或者 option(select 中的一项) 。

    • :enabled,UI元素状态伪类选择器,匹配任何已启用的元素。如果元素可以被激活(例如被选择、单击、输入文本等),或者能够获得焦点,那么它就是启用的。

    • :disabled,UI元素状态伪类选择器,匹配任何被禁用的元素。如果一个元素不能被激活(如选择、点击或接受文本输入)或获取焦点,则该元素处于被禁用状态。

    • :in-range,UI元素状态伪类选择器,匹配指定范围以内值的元素。

    • :out-of-range,UI元素状态伪类选择器,匹配指定范围以外值的元素。

    • :optional,UI元素状态伪类选择器,匹配没有 "required" 属性的元素。

    • :required,UI元素状态伪类选择器,匹配有 "required" 属性的元素。

    • :invalid,UI元素状态伪类选择器,匹配无效的元素。

    • :read-only,UI元素状态伪类选择器,匹配只读状态的元素,表示元素不可被用户编辑的状态(如锁定的文本输入框)。

    • :read-write,UI元素状态伪类选择器,匹配可读可写状态的元素。

    • :focus,UI元素状态伪类选择器,匹配获得焦点的元素(如表单输入)。当用户点击或轻触一个元素或使用键盘的 Tab 键选择它时,它会被触发。

    • :link,UI元素状态伪类选择器,所有未访问链接。

    • :visited,UI元素状态伪类选择器,匹配在用户访问链接后生效。但由于出于隐私保护的原因,使用该选择器可以修改的样式非常有限。

    • :hover,UI元素状态伪类选择器,匹配在用户使用指针设备与元素进行交互时匹配,但不一定激活它。通常在用户将光标(鼠标指针)悬停在元素上时触发。

    • :active,UI元素状态伪类选择器,匹配被用户激活的元素。它让页面能在浏览器监测到激活时给出反馈。当用鼠标交互时,它代表的是用户按下按键和松开按键之间的时间。

    • :empty,UI元素状态伪类选择器,匹配没有子元素的元素。

  • 否定反选伪类选择器(negation pseudo-class)

    用来匹配不符合一组选择器的元素,它的作用是防止特定的元素被选中。

    例如:

    • :not(selectors),匹配与selectors选择器相反的所有元素。

  • 元素选择器

    直接使用 HTML 元素的名称作为选择器,如 p 会选中页面上所有的 <p> 元素。

    例如:

    • p { color: blue; },匹配所有p元素。

  • 伪元素选择器

    • ::first-letter,用于将样式应用于区块容器第一行的第一个字母,但仅当其前面没有其他内容(例如图像或行内表格)时才有效。

    • ::first-line,只能在块容器中,匹配在区块容器第一行应用样式。

    • ::before,会创建一个伪元素,作为所选中元素的第一个子元素。通常用于为具有 content 属性的元素添加修饰性的内容。此元素默认情况下是行级的。

    • ::after,会创建一个伪元素,作为所选中元素的最后一个子元素。通常用于为具有 content 属性的元素添加修饰性的内容。此元素默认情况下是行向布局的。

  • 关系组合选择器(combinator)

    包含祖先后代选择器(A B)、第一级父子元素选择器(A > B)、相邻兄弟选择器(A + B)、后续兄弟选择器(A ~ B)等。

    例如:

    • div p { color: blue; }祖先后代选择器,匹配所有 div 元素内的所有 p 元素。

    • .class1>p { color: blue; }第一级父子元素选择器,匹配具有 class 类属性,且类属性的值为 .class1 的所有元素下的第一级 p 子元素

    • h1+p { color: blue; }相邻兄弟选择器,匹配所有 h1 元素后面紧接相邻着的第一个 p 元素。

    • h2~p { color: blue; }后续兄弟选择器,匹配所有 h2 元素后面所有的 p 元素。

  • 通配选择器(universal selector)

    通配符选择器(*),用于匹配当前 HTML 文档中所有的元素。

    例如:

    • * { color: red; },匹配当前 HTML 文档中所有的元素,并设置颜色为红色。

  • 集合分组选择器

    上述所有选择器均可集合成同一分组选择器,通过(逗号 ,)分隔不同的选择器。

    例如:

    • div p, .class1>p, h1+p, h2~p { color: red; },集合匹配所有 div 元素内的所有 p 元素,集合匹配具有 class 类属性,且类属性的值为 .class1 的所有元素下的第一级 p 子元素,集合匹配所有 h1 元素后面紧接相邻着的第一个 p 元素,集合匹配所有 h2 元素后面所有的 p 元素。

3.3 CSS 样式声明块

包含一个或多个声明,用花括号 { } 包裹。每个声明由属性和值组成,不同声明用分号;分隔。

  • 样式属性与属性值

    • 样式属性(如colormargin),用于定义样式特性。如 background-color 用于设置元素的背景颜色,font-size 用于设置字体大小等。

    • 属性值(如red20px),为样式属性指定具体效果的值。如 background-color: #ff0000; 表示将背景颜色设置为红色,font-size: 16px; 表示将字体大小设置为 16 像素。

  • 声明缩写优化

    • margin: 10px 20px;(上下10px,左右20px)。

3.4 CSS 的 at 规则

以 @()开始,随后是标识符,一直到以分号或右大括号结束。

每个 at 规则由其标识符定义,可能有它自己的语法。

at 规则涵盖了 meta 信息(比如 @charset @import)、条件信息(比如 @media @document)、描述信息(比如 @font-face)。

  • @charset——定义样式表使用的字符集。

  • @import——告诉 CSS 引擎引入一个外部样式表。

  • @namespace——告诉 CSS 引擎必须考虑 XML 命名空间。

  • @layer ——声明了一个层叠层,同一层内的规则将级联在一起,这给予了开发者对层叠机制的更多控制。

3.5 CSS 的语法示例

body {
  background: #f0f0f0; /* 浅灰色背景 */
  font-family: "Microsoft YaHei"; /* 字体 */
}
​
h1 {
  color: #0A0000;      /* 深红色标题(RGB 10,0,0) */
}/* 选择所有 <p> 标签,声明设置字体颜色和背景 */
p {
  color: blue;
  background-color: #f0f0f0;
}/* 选择 class 为 "highlight" 的元素,声明 */
.highlight {
  font-weight: bold;
  border: 1px solid red;
}/* 选择 id 为 "header" 的元素 */
#header {
  text-align: center;
  padding: 20px;
}

 

 


 

4 核心组成

4.1 盒模型(Box Model)

定义元素的空间占用规则,每个元素在页面中都被视为一个矩形盒子,由内容区(content)、内边距(padding)、边框 (border)和 外边距(margin)组成),是布局的基础。

从内部到外围,分别为:

  1. content(内容):盒子的内容,显示文本和图像。

  2. padding(内边距):清除内容周围的区域,内边距是透明的。

  3. border(边框):围绕在内边距和内容外的边框。

  4. margin(外边距):清除边框外的区域,外边距是透明的。

.box {
  width: 300px;       /* 内容区宽度 */
  padding: 20px;      /* 内边距 */
  border: 1px solid black; /* 边框 */
  margin: 10px;       /* 外边距 */
  box-sizing: border-box; /* 宽度包含padding和border */
}

 

通过设置 box-sizing 属性,可分为两种盒模型

  • box-sizing: content-box;,设置为标准模式的盒模型,此种模式下,矩形盒子的总宽度和总高度,仅指内容区的宽度和高度。

  • box-sizing: border-box;,设置为怪异模式的盒模型,此种模式下,矩形盒子的总宽度和总高度,包含了(内容区+内边距+边框)的宽度和高度。

/* 默认:width/height 仅指内容区域 */
box-sizing: content-box;
​
/* width/height 包含内容、内边距和边框 */
box-sizing: border-box;

 

4.2 布局系统

  • 浮动(Float)

    传统布局,通过 float 实现元素左右对齐,实现文字环绕效果,常用于早期的多列布局。可分为设置浮动(float)、清除浮动(clear)。

.float-left { 
    float: left; /* 浮动(Float) */
}
.clearfix::after {
    content: " ";
    display: table;
    clear: both; /* 清除浮动 */
}

 

  • 定位(Positioning)

    传统布局,通过 position: static/relative/absolute/fixed/sticky; 控制元素的绝对或相对位置。可分为默认状态(static)、相对定位(relative)、绝对定位(absolute)、固定定位(fixed)、粘性定位(sticky)。

    • 默认状态(static):HTML 元素的默认值,即没有定位。

      static 定位的元素不会受到 top、bottom、left、right 这4个属性影响。

    • 相对定位(relative):relative 定位的元素位置,是相对其正常位置。

      移动 relative 定位的元素,元素原本所占的空间(会保留)不会发生改变。

      relative 定位元素经常被用来作为绝对定位元素的容器块。

    • 绝对定位(absolute):absolute 定位的元素位置,是相对于已定位的父元素,如果没有已定位的父元素。那么absolute 定位的元素的位置,则是相对于 <html>

      absolute 定位的元素和其他元素重叠,与文档流无关,不占据空间。

    • 固定定位(fixed):fixed 定位的元素位置相对于浏览器窗口是固定位置。

      即使窗口是滚动的,fixed 定位的元素也不会移动。

      fixed 定位的元素和其他元素重叠,与文档流无关,不占据空间。

    • 粘性定位(sticky):sticky 定位的元素位置,是是依赖于用户的滚动位置来定位,且是在 relativefixed 定位之间切换。

      当页面滚动没有超出目标区域时(跨越特定阈值前),sticky 定位的行为,像 relative 。当页面滚动超出目标区域时(跨越特定阈值后),sticky 定位的表现,像 fixed,会固定在目标位置。

      这个特定阈值指的是 top、bottom、left、right 这4个属性之一,指定这4个属性阈值的其中任何1个,才会使粘性定位生效。否则其行为与相对定位相同。

    • 定位的重叠属性

      定位后的元素与文档流无关,定位元素可以覆盖页面上的其它元素。通过 z-index 属性,可以指定元素的堆叠顺序(即指定哪个元素在前面,哪个在后面)。

      一个元素可以有正数或负数的 z-index 堆叠顺序,具有更高堆叠顺序的元素总是在较低的堆叠顺序元素的前面。而如果两个定位元素重叠,没有指定 z - index 属性值,那么最后定位在 HTML 代码中的元素将被显示在最前面。

.static {
    position: static; /* 默认状态 */
}
.relative {
    position: relative; /* 相对定位 */
}
.absolute {
    position: absolute; /* 绝对定位 */
    top: 10px; 
    left: 20px;
}
.fixed {
    position: fixed; /* 固定定位 */
    bottom: 0;
}
.sticky {
    position: sticky; /* 粘性定位 */
    top: 0;
}

 

  • 定位相关属性

    属性说明
    position 指定元素的定位类型。 staticrelative absolutefixed stickyinherit
    top 定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。 autolength %inherit
    right 定义了定位元素右外边距边界与其包含块右边界之间的偏移。 autolength %inherit
    bottom 定义了定位元素下外边距边界与其包含块下边界之间的偏移。 autolength %inherit
    left 定义了定位元素左外边距边界与其包含块左边界之间的偏移。 autolength %inherit
    z-index 设置元素的堆叠顺序。 numberauto inherit
    overflow 只工作于指定高度的块元素上,用于控制内容溢出元素框时显示的方式。 autohidden scrollvisible inherit
    overflow-x 指定如何处理右边/左边边缘的内容溢出元素的内容区域。 autohidden scrollvisible no-displayno-content
    overflow-y 指定如何处理顶部/底部边缘的内容溢出元素的内容区域。 autohidden scrollvisible no-displayno-content
    clip 剪辑一个绝对定位的元素。 shapeauto inherit
    cursor 显示光标移动到指定的类型。 autodefault pointercrosshair movewait texthelpurl e-resizene-resize nw-resizen-resize se-resizesw-resize s-resizew-resize
  • 弹性盒子(Flexbox)

    现代新式布局,设置一维弹性布局,用于简化响应式布局。适合简单对齐和空间分配。

    弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。

    通过设置 display属性的值为 flexinline-flex ,将显示布局定义为弹性容器。弹性容器内包含了一个或多个弹性子元素

    相关属性flexflex-basisflex-directionflex-flowflex-growflex-shrinkflex-wraporderalign-contentalign-itemsalign-selfjustify-contentplace-contentrow-gapcolumn-gapgap

    • flex-direction(指定弹性子元素在父容器中的位置):row | row-reverse | column | column-reverse;

      • row:横向从左到右排列(左对齐),默认的排列方式。

      • row-reverse:反转横向排列(右对齐,从后往前排,最后一项排在最前面。

      • column:纵向排列。

      • column-reverse:反转纵向排列,从后往前排,最后一项排在最上面。

    • flex-wrap(用于指定弹性盒子的子元素换行方式):nowrap | wrap | wrap-reverse | initial | inherit;

      • nowrap: 默认, 弹性容器为单行。该情况下弹性子项可能会溢出容器。

      • wrap:弹性容器为多行。该情况下弹性子项溢出的部分会被放置到新行,子项内部会发生断行。

      • wrap-reverse:反转 wrap 排列。

    • flex-flow(设置或检索弹性盒模型对象的子元素排列方式):flex-direction flex-wrap|initial|inherit;

    • flex(设置弹性盒子的子元素如何分配空间):flex-grow flex-shrink flex-basis|auto|initial|inherit;

    • flex-grow(设置或检索弹性盒子的扩展比率):number | initial | inherit;

    • flex-shrink(flex 元素的收缩大小):number | initial | inherit;

    • flex-basis(设置或检索弹性盒伸缩基准值):number | auto | initial | inherit;

    • justify-content(沿着弹性容器的主轴线(横轴),进行内容对齐):flex-start | flex-end | center | space-between | space-around;

      • flex-start:弹性项目向行头紧挨着填充。这个是默认值。第一个弹性项的main-start外边距边线被放置在该行的main-start边线,而后续弹性项依次平齐摆放。

      • flex-end:弹性项目向行尾紧挨着填充。第一个弹性项的main-end外边距边线被放置在该行的main-end边线,而后续弹性项依次平齐摆放。

      • center:弹性项目居中紧挨着填充。(如果剩余的自由空间是负的,则弹性项目将在两个方向上同时溢出)。

      • space-between:弹性项目平均分布在该行上。如果剩余空间为负或者只有一个弹性项,则该值等同于flex-start。否则,第1个弹性项的外边距和行的main-start边线对齐,而最后1个弹性项的外边距和行的main-end边线对齐,然后剩余的弹性项分布在该行上,相邻项目的间隔相等。

      • space-around:弹性项目平均分布在该行上,两边留有一半的间隔空间。如果剩余空间为负或者只有一个弹性项,则该值等同于center。否则,弹性项目沿该行分布,且彼此间隔相等(比如是20px),同时首尾两边和弹性容器之间留有一半的间隔(1/2*20px=10px)。

    • align-items(设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式):flex-start | flex-end | center | baseline | stretch;

      • flex-start:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。

      • flex-end:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。

      • center:弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。

      • baseline:如弹性盒子元素的行内轴与侧轴为同一条,则该值与'flex-start'等效。其它情况下,该值将参与基线对齐。

      • stretch:如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。

    • align-content(用于修改 flex-wrap 属性的行为):flex-start | flex-end | center | space-between | space-around | stretch;

      align-content 类似于 align-items, 但 align-content 不是设置弹性子元素的对齐,而是设置各个行的对齐。

      • stretch:默认。各行将会伸展以占用剩余的空间。

      • flex-start:各行向弹性盒容器的起始位置堆叠。

      • flex-end:各行向弹性盒容器的结束位置堆叠。

      • center:各行向弹性盒容器的中间位置堆叠。

      • space-between:各行在弹性盒容器中平均分布。

      • space-around:各行在弹性盒容器中平均分布,两端保留子元素与子元素之间间距大小的一半。

    • align-self(在弹性子元素上使用,覆盖容器的 align-items 属性):auto | stretch | center | flex-start | flex-end | baseline | initial | inherit;

      • auto:默认值。元素继承了它的父容器的 align-items 属性。如果没有父容器则为 "stretch"。

      • stretch:元素被拉伸以适应容器。

      • center:元素位于容器的中心。

      • flex-start:元素位于容器的开头。

      • flex-end:元素位于容器的结尾。

      • baseline:元素位于容器的基线上。

      • initial:设置该属性为它的默认值。

      • inherit:从父元素继承该属性。

    • order(设置弹性盒子的子元素排列顺序):number | initial | inherit;

.flexbox-container {
    display: flex;           /* 创建弹性容器 */
    justify-content: center; /* 水平居中对齐 */
    /* justify-content: space-between; */ /* 主轴对齐方式 */
    align-items: center;     /* 垂直居中对齐 */
    /* align-items: center; */ /* 交叉轴对齐方式 */
}

 

  • 网格布局(Grid)

    现代新式布局,设置二维网格布局,用于实现复杂页面结构。网格是一组相交的水平线和垂直线,分别定义网格的列和行。

    通过设置 display属性的值为 gridinline-grid ,将显示布局定义为网格容器。网格容器带有,可以更轻松地设计网页,而无需使用浮动和定位。

    网格引入了(fr 单位),可以创建灵活的网格轨道。一个(fr 单位)代表网格容器中可用空间的一等份。

    相关属性grid-template-columnsgrid-template-rowsgrid-template-areasgrid-templategrid-auto-columnsgrid-auto-rowsgrid-auto-flowgridgrid-row-startgrid-column-startgrid-row-endgrid-column-endgrid-rowgrid-columngrid-areagrid-row-gapgrid-column-gapgrid-gap

    • grid( CSS 所有网格容器的简写属性),可以用来设置以下属性:

      • 显式网格属性: grid-template-rowsgrid-template-columnsgrid-template-areas

      • 隐式网格属性: grid-auto-rowsgrid-auto-columnsgrid-auto-flow

      • 间距属性: grid-row-gapgrid-column-gap

    • grid-template(设置网格中行、列与分区):none | grid-template-rows/grid-template-columns | grid-template-areas | initial | inherit;

    • grid-template-rows(定义网格中的行):none | auto | max-content | min-content | length | initial | inherit;

    • grid-template-columns(定义网格中的列):none | auto | max-content | min-content | length | initial | inherit;

    • grid-template-areas(指定如何显示行和列,使用网格元素的名称来布局网格):none | itemnames;

    • grid-auto-rows(设置网格容器中行的默认大小):auto | max-content | min-content | length;

    • grid-auto-columns(设置网格容器中列的默认大小):auto | max-content | min-content | length;

    • grid-auto-flow(指定自动布局算法,精确指定自动布局的元素排列):row | column | dense | row dense | column dense;

    • grid-gap(同时设置行间距和列间距):grid-row-gap grid-column-gap

    • grid-row-gap(定义网格行间距):length | %

    • grid-column-gap(定义网格列间距):length | %

    • grid-row(同时指定网格元素行线的开始位置和结束位置):grid-row-start / grid-row-end;

    • grid-area(指定网格元素在网格布局中的大小和位置):grid-row-start / grid-column-start / grid-row-end / grid-column-end | itemname;

    • grid-row-start(指定网格元素行线的开始位置):auto | row-line;

    • grid-row-end(指定网格元素行线的结束位置):auto | row-line | span n;

    • grid-column(同时指定网格元素列线的开始位置和结束位置):grid-column-start / grid-column-end;

    • grid-column-start(指定网格元素列线的开始位置):auto | span n | column-line;

    • grid-column-end(指定网格元素列线的结束位置):auto | span n | column-line;

    • justify-content (用于对齐容器内的网格,设置如何分配顺着弹性容器主轴(或者网格行轴) 的元素之间及其周围的空间),网格的总宽度必须小于容器的宽度才能使 justify-content 属性生效。。

    • align-content(用于设置垂直方向上的网格元素在容器中的对齐方式),网格元素的总高度必须小于容器的高度才能使 align-content 属性生效。

.grid-container {
    display: grid;                  /* 创建网格容器 */
    grid-template-columns: 1fr 2fr; /* 列宽比例 */
    /* grid-template-columns: repeat(3, 1fr);*/ /* 3 列等宽 */
    gap: 10px;                     /* 网格间隔 */
}

 

参考函数repeat()minmax()fit-content()

相关术语:网格(Grid),网格线(Grid lines),网格轨道(Grid tracks),网格单元格(Grid cell),网格区域(Grid areas),网格间隙(Gutters),网格轴(Grid Axis),网格行(Grid row),网格列(Grid column)。

  • 弹性盒子网格布局的示例

/* 示例:居中元素 */
.container {
    display: flex;      /* 传统flex方案 */
    justify-content: center;
    align-items: center;
}
​
.container {
    display: grid;          /* 现代grid方案 */
    place-items: center; /* 一行代码实现居中 */
}

 

4.3 响应式设计

  • 媒体查询(Media Queries)

    使用@media媒体查询,适配不同设备尺寸,根据设备特性(如屏幕宽度)应用不同的样式,适配不同终端(PC/平板/手机)。

@media screen and (max-width: 768px) { /* 屏幕宽度小于768px时应用 */
    body { 
        font-size: 14px; 
    }
    .container { 
        flex-direction: column; 
    }
}

 

  • 多媒体类型

    • all:用于所有多媒体类型设备。

    • print:用于打印机。

    • screen:用于电脑屏幕,平板,智能手机等。

    • speech:用于屏幕阅读器。

  • 多媒体查询语法

@media not|only mediatype and (expressions) {
    CSS 代码...;
}
/* not: not是用来排除掉某些特定的设备的。 */
/* only: 用来定某种特别的媒体类型。 */

 

  • 在不同的媒体上使用不同的样式文件

<link rel="stylesheet" media="mediatype and|not|only (expressions)" href="select.css">

 

  • 视口单位(Viewport Units)

    • vw(视口宽度)(视口宽度的百分比)。

    • vh(视口高度)(视口高度的百分比)。

 


 

5 常用 CSS 样式

5.1 文本相关样式

  • color(颜色):red | #ff0000 | rgb(255,0,0) | rgba(255,0,0,0.5)

  • font-size(字号):14px | 1em | 2rem | 100%

  • font-weight(字重):normal | light | bold | 500

  • font-style(字体样式):normal | italic | oblique

  • font-family(字体类型):"黑体", "宋体", "Microsoft Yahei", "Times New Roman"

  • direction(文本方向):ltr | rtl | inherit

  • unicode-bidi(文本是否被重写):normal | embed | bidi-override | initial | inherit

  • text-transform(文本转换):uppercase | lowercase | capitalize

  • text-decoration(文本装饰线):none | underline | overline | line-through

  • text-indent(文本缩进):16px | 2em | 1rem

  • text-shadow(文本阴影):h-shadow v-shadow blur color;

  • text-align(文本水平对齐):left | center | right | justify

  • vertical-align(非块级元素垂直对齐):top | middle | bottom

  • line-height(文本行高):16px | 32px

  • letter-spacing(字符间距):2px | -2px

  • word-spacing(字间距):12px | 22px

  • white-space(元素内空白):pre | pre-line | pre-wrap | nowrap

5.2 盒模型相关样式

  • content(内容),用于在元素的 ::before::after伪元素中插入内容。使用 content 属性插入的内容都是匿名的可替换元素

  • padding(内边距),该属性为给定元素设置所有四个(上右下左)方向的内边距属性。

    单个设置值会统一应用于(所有边),两个设置值则应用于(上边下边左边右边),三个设置值则应用于(上边左边右边下边),四个设置值则分别按(顺时针方向)应用于(上边右边下边左边)。

    padding(内边距):length | %

    padding(内边距)可细分为:

    • padding-top(上方内边距):length | %

    • padding-right(右方内边距):length | %

    • padding-bottom(下方内边距):length | %

    • padding-left(左方内边距):length | %

  • border(边框),该属性最多只接受三个参数,分别是宽度风格颜色,这样会使得四条边的边框相同。也可以使用一个,两个或三个值来指定 border 属性,值的顺序无关紧要。(可按四边分为 border-topborder-rightborder-bottomborder-left)。

    border(边框):border-width border-style border-color

    可细分为:

    • border-width:边框宽度。(支持单值、双值、三值、四值分别设置四个边,也可按四边分为 border-top-widthborder-right-widthborder-bottom-widthborder-left-width)。

      border-width(边框宽度):thin | medium | thick | length

      • 值为thin:定义细的边框。

      • 值为medium:定义中等粗细的边框。

      • 值为thick:定义粗的边框。

      • 值为length:自定义边框的粗细宽度。

    • border-style:边框风格。(支持单值、双值、三值、四值分别设置四个边,也可按四边分为 border-top-styleborder-right-styleborder-bottom-styleborder-left-style)。

      outline-style(边框风格):none | dotted | dashed | solid | double | groove | ridge | inset | outset

      • 值为none:和关键字 hidden 类似,不显示边框。

      • 值为hidden:和关键字 none 类似,不显示边框。

      • 值为dotted:显示为一系列圆点,圆点半径是 border-width计算值的一半。

      • 值为dashed:显示为一系列短的方形虚线。

      • 值为solid:显示为一条实线。

      • 值为double:显示为一条双实线,宽度是 border-width

      • 值为groove:显示为三维沟槽雕刻效果的边框,样式与 ridge 相反。

      • 值为ridge:显示为三维脊状浮雕效果的边框,样式与 groove 相反。

      • 值为inset:显示为三维嵌入效果的边框,样式与 outset 相反。

      • 值为outset:显示为三维突出效果的边框,样式与 inset 相反。

    • border-color:边框颜色。(支持单值、双值、三值、四值分别设置四个边,也可按四边分为 border-top-colorborder-right-colorborder-bottom-colorborder-left-color)。

      border-color(边框颜色):color-name | hex-number | rgb-number | transparent

      • 值为color:指定背景颜色。

      • 值为transparent:指定边框的颜色是透明的。

    • border-radius:边框圆角。(支持单值、双值、三值、四值分别设置四个角,也可按四角分为 border-top-left-radiusborder-top-right-radiusborder-bottom-right-radiusborder-bottom-left-radius)。

      border-radius(边框圆角):(1-4个 length | %) / (1-4个 length | %)

      • 单值语法border-radius: length|%,这一个值表示所有的边框宽度。

      • 双值语法: border-radius: length|% length|%,第一个值表示 top-left 和 bottom-right 方向的角;第二个值表示 top-right 和 bottom-left 方向的角。

      • 三值语法border-radius: length|% length|% length|%,第一个值表示 top-left 方向的角,第二个值表示 top-right 和 bottom-left 方向的角,第三个值表示 bottom-right 方向的角。

      • 四值语法border-radius: length|% length|% length|% length|%,这四个值分别表示 top-left、top-right、bottom-right、bottom-left,即从 top-left 开始的顺时针顺序。

  • margin(外边距),该属性为给定元素设置所有四个(上右下左)方向的外边距属性。

    单个设置值会统一应用于(所有边),两个设置值则应用于(上边下边左边右边),三个设置值则应用于(上边左边右边下边),四个设置值则分别按(顺时针方向)应用于(上边右边下边左边)。

    margin(外边距):auto | length | %

    margin(外边距)可细分为:

    • margin-top(上方外边距):auto | length | %

    • margin-right(右方外边距):auto | length | %

    • margin-bottom(下方外边距):auto | length | %

    • margin-left(左方外边距):auto | length | %

  • outline(轮廓),绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。可按顺序设置(outline-color outline-style outline-width

    可细分为:

    outline-color(轮廓的颜色):color-name | hex-number | rgb-number | invert

    outline-style(轮廓的样式):none | dotted | dashed | solid | double | groove | ridge | inset | outset

    outline-width(轮廓的宽度):thin | medium | thick | length

  • box-shadow(阴影)。

  • width(宽度):100px | 1em | 2rem

  • height(高度):100px | 1em | 2rem

5.3 显示相关样式

  • display(显示)用于设置元素是块级盒子(占用整行)或是行级盒子(仅需必要宽度,不强制换行)。display 也可用于设置子元素的布局,例如:文档流式布局弹性盒子布局网格布局

    display(显示)用于设置一个元素应如何显示,display:none;可以隐藏某个元素,且隐藏的元素不会占用任何空间。

    visibility(可见性)用于指定一个元素可见或隐藏。visibility:hidden;可以隐藏元素,但隐藏的元素仍需占用与未隐藏之前一样的空间。

/* 预组合值 */
display: block; /* 块级 */
display: inline; /* 行内 */
display: inline-block; /* 行内块 */
display: flex; /* 弹性盒子 */
display: inline-flex;
display: grid; /* 网格布局 */
display: inline-grid;
display: flow-root;
​
/* 生成盒子 */
display: none;
display: contents;
​
/* 多关键字语法 */
display: block flex;
display: block flow;
display: block flow-root;
display: block grid;
display: inline flex;
display: inline flow;
display: inline flow-root;
display: inline grid;
​
/* 其他值 */
display: table;
display: table-row; /* 所有的 table 元素 都有等效的 CSS display 值 */
display: list-item;
​
/* 全局值 */
display: inherit;
display: initial;
display: revert;
display: revert-layer;
display: unset;

 

  • 关键值可以被分组为六个种类:

    • display-outside外部表现,规定元素的外部显示类型。

    • display-inside内部表现,元素的内部显示类型,其定义了该内容布局时的格式上下文的类型。

    • display-listitem列表元素,为内容生成一个块级盒子和一个单独的列表元素行级盒子。

    • display-internal内部,一些布局模型,例如 tableruby 有一个复杂的内置结构,它们的子孙后代可以扮演几个不同的角色。

    • display-box,定义一个元素到底是否产生 display 盒。

    • display-legacy预组合,对相同布局模式的块级和行级变体需要单独的关键字。

  • position(定位):static | relative | absolute | fixed

    • static(静态定位),relative(相对定位)。absolute(绝对定位),fixed(固定定位)。

    • top(上坐标),right(右坐标),bottom(下坐标),left(左坐标)。

    • z-index(层叠)。

  • float(浮动):left | right

    • 清除浮动:overflowhidden

    • 清除浮动:clearleft | right | both

    • 设置父级盒子的固定高度:height

5.4 背景相关样式

  • background:背景。

    样式设置语法:background:#颜色值 url("图像") 是否重复 固定或滚动 图像起始位置;

    可细分为如下5种样式。

    • background-color:背景颜色。

    • background-image:背景图像。

    • background-repeat:背景图像重复。

    • background-attachment:背景图像是否固定或者随着页面的其余部分滚动。

    • background-position:背景图像的起始位置。

5.5 链接列表表格样式

  • 链接相关样式:

    1. a:link(未访问过的链接):可以用颜色、字体、背景等样式属性。

    2. a:visited(用户已访问过的链接):可以用颜色、字体、背景等样式属性。

    3. a:hover(当用户鼠标放在链接上时):可以用颜色、字体、背景等样式属性。

    4. a:active(链接被点击的那一刻):可以用颜色、字体、背景等样式属性。

  • 列表相关样式:

    • list-style(ul/ol列表样式):none | circle | disc | decimal

    • list-style-type(ul 列表项标记):circle、square

    • list-style-type(ol 列表项标记):lower-alpha、upper-roman

    • list-style-position(列表项标志的位置):inside | outside

    • list-style-image(作为列表项标记的图像):url('xxx.gif')

  • 表格相关样式:

    • border(边框)。

    • border-collapse(折叠边框):collapse

    • width(宽)。

    • height(高)。

    • text-align(水平对齐)。

    • vertical-align(垂直对齐)。

    • padding(内边距填充):10px

    • color(颜色)。

    • background-color(背景颜色)。

5.6 元素尺寸样式

  • width(元素的宽度):auto | length | %

  • height(元素的高度):auto | length | %

  • max-width(元素的最大宽度):none | length | %

  • max-height(元素的最大高度):none | length | %

  • min-width(元素的最小宽度):length | %

  • min-height(元素的最小高度):length | %

5.7 溢出和浮动样式

  • overflow(溢出)只工作于指定高度的块元素上,用于控制内容溢出元素框时显示的方式。

    • overflow:visible;:内容不会被修剪,会呈现在元素框之外。

    • overflow:hidden;:内容会被修剪,并且其余内容是不可见的。

    • overflow:scroll;:内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。

    • overflow:auto;:如果内容出现被修剪,则浏览器会显示滚动条以便查看其余的内容。

    • overflow:inherit;:从父元素继承 overflow 属性的值。

  • float(浮动)会使元素向左或向右移动,其周围的元素也会重新排列,通常是用于图像。

    float(浮动):none | left | right | inherit;

    • 在布局时,是水平方向浮动,元素只能左右移动而不能上下移动。

    • 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。

    • 浮动元素之后的元素将围绕它(例如图像是左浮动,文本流将环绕在它右边)。

    • 如果把几个浮动的元素放到一起,且有空间的话,这几个浮动元素会彼此相邻。

  • clear(清除):不允许元素周围有浮动元素,即指定元素两侧不能出现浮动元素。

    clear(清除):none | left | right | both | inherit;

 


 

6 颜色与单位

6.1 颜色值

.color-name { color: red; }           /* 颜色名称 */
.hex-code { color: #FF0000; }         /* 十六进制 */
.rgb-value { color: rgb(255, 0, 0); } /* RGB值 */
.rgba-value { color: rgba(255, 0, 0, 0.5); } /* 带透明度 */

 

6.2 单位

.px-unit { font-size: 16px; }       /* 固定像素 */
.em-unit { font-size: 1.5em; }      /* 相对于父元素 */
.rem-unit { font-size: 1.2rem; }    /* 相对于根元素 */
.percentage { width: 50%; }         /* 百分比 */
.vw-vh { width: 50vw; }             /* 视口宽度的50% */

 

 


 

7 关键特性

7.1 优先级(Specificity)

  • 多个样式规则可叠加作用于同一元素,当多个样式规则冲突时,通过优先级规则(如特异性、来源顺序)确定最终应用的样式。CSS 样式有不同的优先级,优先级高的样式规则会覆盖优先级低的。

  • 优先级规则(从高到低):

    • !important(例外规则,强制覆盖)。应该尽量避免,因为这会破坏了样式表中的固有的级联规则 使得调试找 bug 变得更加困难了。

    • 行内样式(inline),在 HTML 元素的 style 属性中定义的样式。

    • ID 选择器(例如#example)。

    • 类选择器(例如.example),属性选择器(例如[type="radio"]),伪类(例如:hover)。

    • 元素标签选择器(例如h1),伪元素(例如::before)。

    • 继承样式(inheritance)。

    • 通配符选择器(*)。

  • 通配选择器(universal selector)(*)、关系选择器(combinator)(+>~" "||)和 否定伪类(negation pseudo-class)(:not())对优先级没有影响。但是,在 :not() 内部声明的选择器会影响优先级。

  • 优先级建议

    • 更好地利用 CSS 级联属性。

    • 使用更具体的规则。在你选择的元素之前,增加一个或多个其他元素,使选择器变得更加具体,并获得更高的优先级。

7.2 继承(Inheritance)

子元素自动继承父元素样式(如font-family),部分属性(如margin)不继承。

  • 当元素的一个继承属性(inherited property)没有指定值时,则取父元素的同属性的计算值。

  • 某些属性(如 colorfont-family)会从父元素自动继承到子元素。

  • 不可继承的属性(如 bordermargin)需要显式设置。

7.3 层叠(Cascading)

层叠是 CSS 的一个基本特征,它是一个定义了如何合并来自多个源的属性值的算法。它在 CSS 处于核心地位,CSS 的全称层叠样式表正是强调了这一点。

  • CSS 声明的来源

    • 用户代理样式:浏览器会有一个基本的样式表来给任何网页设置默认样式。

    • 页面作者样式:网页的作者可以定义文档的样式,这是最常见的样式表。大多数情况下此类型样式表会定义多个,它们构成网站的视觉和体验,即主题。

    • 读者用户样式:读者,作为浏览器的用户,可以使用自定义样式表定制使用体验。

  • 层叠顺序(从高到低

    假如层叠顺序相等,则使用哪个值取决于优先级(Specificity)。

    1. CSS 过渡 (CSS Transition)

    2. 用户代理样式的!important

    3. 读者用户样式的!important

    4. 页面作者样式的!important

    5. CSS 动画(CSS Animation)

    6. 页面作者样式

    7. 读者用户样式

    8. 用户代理样式

  • 重置样式

    当 CSS 对样式完成更改之后,也许会在某种情况下希望还原到一个已知样式上,这可能发生在动画、主题修改之类的情形中。CSS 属性 all能够快速地把(几乎)所有 CSS 属性设置到一个已知样式上。

  • 层叠层/级联层

    使用 @layer 声明了一个层叠层/级联层,同一层内的规则将级联在一起,这给予了开发者对层叠机制的更多控制。

    • 一个层叠层同样可以通过 @import来创建,规则存在于被引入的样式表内:@import (utilities.css) layer(utilities);

    • 可以创建带命名的层叠层,但不指定任何样式。例如,单一的命名层:@layer utilities;

    • 多个命名层也可以被同时定义。例如:@layer theme, layout, utilities;

      对于多个命名层的声明而言,如果同一声明在多个层叠层中被指定,最后一层中的将优先于其他层。因此,在上面的例子中,如果 theme 层和 utilities 层中存在冲突的规则,那么 utilities 层中的将优先被应用。

  • 层叠层的嵌套

    层叠层允许嵌套,例如:

@layer framework {
    @layer layout {
        
    }
}

 

  • 嵌套层的附加规则

    framework 层内部的 layout 层附加规则,只需用 . 连接这两层。

@layer framework.layout {
    p {
        margin-block: 1rem;
    }
}

 

  • 匿名层

    如果创建了一个层叠层但并未指定名字,则称为一个匿名层。除创建后无法向其添加规则外,该层和其他命名层功能一致。例如:

@layer {
    p {
        margin-block: 1rem;
    }
}

 

7.4 格式化上下文(Formatting Context)

  • 行内格式化上下文(Inline Formatting Context),是一个网页的渲染结果的一部分。

    其中,各行内框(inline box)一个接一个地排列,其排列顺序根据书写模式(writing-mode)的设置来决定:

    • 对于水平书写模式,各个框从左边开始水平地排列。

    • 对于垂直书写模式,各个框从顶部开始水平地排列。

  • 区块格式化上下文(Block Formatting Context,BFC),是 Web 页面的可视 CSS 渲染的一部分,是块级盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

    区块格式化上下文(BFC)是一个独立的布局环境,BFC 内部的元素布局与外部互相不影响。BFC 有一套属于自己的规则

    • BFC 的区域不会与浮动 Box 重叠。

    • BFC 是一个独立容器,BFC 内部的元素布局与外部互相不影响

    • 计算 BFC 的高度时,浮动子元素也要参与计算。

    下列方式会创建区块格式化上下文:

    • 文档的根元素(<html>)。

    • 浮动元素(即 float值不为 none 的元素)。

    • 绝对定位元素(position值为 absolutefixed 的元素)。

    • 行内块元素(display值为 inline-block 的元素)。

    • 表格单元格(display值为 table-cell,HTML 表格单元格默认值)。

    • 表格标题(display 值为 table-caption,HTML 表格标题默认值)。

    • 匿名表格单元格元素(display值为 table(HTML 表格默认值)、table-row(表格行默认值)、table-row-group(表格体默认值)、table-header-group(表格头部默认值)、table-footer-group(表格尾部默认值)或 inline-table)。

    • overflow值不为 visibleclip 的块级元素。

    • display 值为 flow-root 的元素。

    • contain值为 layoutcontentpaint 的元素。

    • 弹性元素(display 值为 flexinline-flex 元素的直接子元素),如果它们本身既不是弹性网格,也不是表格容器。

    • 网格元素(display 值为 gridinline-grid 元素的直接子元素),如果它们本身既不是弹性网格,也不是表格容器。

    • 多列容器(column-countcolumn-width值不为 auto,且含有 column-count: 1 的元素)。

    • column-span 值为 all 的元素始终会创建一个新的格式化上下文,即使该元素没有包裹在一个多列容器中)

  • 格式化上下文影响布局,通常,我们会为定位和清除浮动创建新的 BFC,而不是更改布局,因为它将:

    • 包含内部浮动。

    • 排除外部浮动。

    • 阻止外边距重叠

  • 块级格式化上下文(BFC )的常用场景

    • 解决浮动元素使父级元素的高度坍塌问题。

    • 解决非浮动元素被浮动元素覆盖问题。

    • 解决盒子顶底外边距重合问题。

    • 两栏自适应布局,一侧是有固定宽度和浮动的固定栏,另一侧为开启 BFC 的不固定栏。

7.5 变量(Custom Properties)

定义和复用样式值(可复用的值):

:root {
  --primary-color: #3498db;
}
button {
  background: var(--primary-color);
}

 

7.6 函数与运算

  1. 使用calc()

  2. 进行动态计算:

width: calc(100% - 20px);

 

7.7 逻辑属性(Logical Properties)

基于书写模式(如左到右或右到左)自动适配布局:

.text {
  margin-inline-start: 20px; /* 自动适配 LTR/RTL */
}

 

7.8 动画与过渡

  • 过渡(Transition)

    通过 transition ,平滑改变属性值,实现平滑动画效果,提升用户体验。使页面元素显示从一种样式转变到另一个的时候,无需使用 Flash 动画或 JavaScript 脚本。

    transition(过渡):property duration timing-function delay;

    可细分为:

    • transition-property(需要应用过渡的 CSS 属性名):`none | all | property

    • transition-duration(定义过渡效果需要花费的时间):time

    • transition-timing-function(规定过渡效果的时间曲线):linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier(n,n,n,n)

      • linear:匀速过渡效果。

      • ease:默认值,缓慢加速,然后缓慢减速的过渡效果。

      • ease-in:缓慢加速的过渡效果。

      • ease-out:缓慢减速的过渡效果。

      • ease-in-out:先缓慢加速,再缓慢减速的过渡效果。

      • cubic-bezier(n,n,n,n):自定义的贝塞尔曲线函数,通过四个值来定义曲线的控制点,分别对应 x1y1x2y2

    • transition-delay(过渡效果延迟开始的时间,默认是0):time

.button {
    background-color: blue;
    transition: background-color 0.3s ease; /* 过渡 */
}
.button:hover { /* 悬停时颜色渐变 */
    background-color: red; 
}
​
.box {
    transition: transform 0.3s ease; /* 过渡 */
}
.box:hover { /* 悬停时颜色渐变 */
    transform: scale(1.1);
}

 

  • 动画(Animation)

    通过 @keyframes 定义复杂动画,提升用户体验。CSS 动画可以取代许多网页动画图像、Flash 动画和 JavaScript 实现的效果。

    animation(动画):name duration timing-function delay iteration-count direction fill-mode play-state;

    • animation-name(指定要绑定到选择器的关键帧的名称):keyframename | none

    • animation-duration(指定动画需要多少秒或毫秒完成):time

    • animation-timing-function(设置动画将如何完成一个周期):linear | ease | ease-in | ease-out | ease-in-out | steps(int,start|end) | cubic-bezier(n,n,n,n)

      • linear:动画从头到尾的速度是相同的。

      • ease:默认。动画以低速开始,然后加快,在结束前变慢。

      • ease-in:动画以低速开始。

      • ease-out:动画以低速结束。

      • ease-in-out:动画以低速开始和结束。

      • steps(int,start|end):指定了时间函数中的间隔数量(步长)。

        int 指定函数的间隔数,该参数是一个正整数(大于 0)。

        start|end 表示动画是从时间段的开头连续(start 直接开始)还是末尾连续(end 戛然而止)。

      • cubic-bezier(n,n,n,n):在 cubic-bezier 函数中自己的值。可能的值是从 0 到 1 的数值。

    • animation-delay(设置动画在启动前的延迟时间):time

    • animation-iteration-count(定义动画的播放次数或无限次):n | infinite

    • animation-direction(指定是否应该轮流反向播放动画。):normal | reverse | alternate | alternate-reverse | initial | inherit

      • normal:默认值。动画按正常播放。

      • reverse:动画反向播放。

      • alternate:动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放。

      • alternate-reverse:动画在奇数次(1、3、5...)反向播放,在偶数次(2、4、6...)正向播放。

      • initial:设置该属性为它的默认值。

      • inherit:从父元素继承该属性。

    • animation-fill-mode(当动画不播放时、完成时,或有延迟未开始播放时,要应用到元素的样式):none | forwards | backwards | both | initial | inherit

      • none:默认值。动画在动画执行之前和之后不会应用任何样式到目标元素。

      • forwards:在动画结束后(由 animation-iteration-count 决定),动画将应用该属性值。

      • backwards:动画将应用在 animation-delay 定义期间启动动画的第一次迭代的关键帧中定义的属性值。

      • both:动画遵循 forwards 和 backwards 的规则。也就是说,动画会在两个方向上扩展动画属性。

      • initial:设置该属性为它的默认值。

      • inherit:从父元素继承该属性。

    • animation-play-state(指定动画是否正在运行或已暂停):paused | running

/* 关键帧动画 */
@keyframes fadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
}
.element {
    animation: fadeIn 2s forwards; 
}
​
@keyframes slide {
    0% {
        transform: translateX(0); 
    }
    100% {
        transform: translateX(100px); 
    }
}
​
.animate {
    animation: slide 2s infinite;
}

 

7.9 CSS 的外边距折叠

区块的上下外边距有时会合并(折叠)为单个边距,其大小为两个边距中的最大值(或如果它们相等,则仅为其中一个),这种行为称为外边距折叠

注意:有设定浮动绝对定位的元素不会发生外边距折叠。

有三种情况会形成外边距折叠:

  • 相邻的兄弟元素

    相邻的同级元素之间的外边距会被折叠(除非后面的元素需要清除之前的浮动)。

  • 没有内容将父元素和后代元素分开

    如果没有设定边框(border)、内边距(padding)、行级(inline)内容,也没有创建区块格式化上下文间隙来分隔块级元素的上边距 margin-top 与其内一个或多个子代块级元素的上边距 margin-top

    或者没有设定边框、内边距、行级内容、高度 height 或最小高度 min-height 来分隔块级元素的下边距 margin-bottom 与其内部的一个或多个后代后代块元素的下边距 margin-bottom,则会出现这些外边距的折叠,重叠部分最终会溢出到父代元素的外面。

  • 空的区块

    如果块级元素没有设定边框、内边距、行级内容、高度height、最小高度min-height来分隔块级元素的上边距 margin-top 及其下边距 margin-bottom,则会出现其上下外边距的折叠。

7.10 现代 CSS 新特性

  • 滚动条样式scrollbar-gutterscrollbar-color

  • Ruby 排版ruby-alignruby-position(用于注音文本)。

  • 锚点定位(Anchor Positioning):简化动态定位(如弹出框)。

  • 嵌套(Nesting):支持类似 Sass 的嵌套语法(需浏览器支持)。

 


 

8 现代 CSS 技术

8.1 CSS 预处理器

如 Sass/Less,支持嵌套、变量、混合宏:

$primary: #3498db;
.button {
  background: $primary;
  &:hover { background: darken($primary, 10%); }
}

 

8.2 CSS 框架

Bootstrap、Tailwind CSS 等提供预设组件与工具类。

8.3 CSS-in-JS

在 JavaScript 中编写 CSS(如Styled Components)。

 


 

9 学习实践建议

  • 使用外部样式表:提升代码复用率与可维护性。

  • 避免滥用!important:防止优先级混乱。

  • 采用CSS预处理器:如 Sass/Less,支持变量、嵌套等高级功能。

  • 命名规范:使用BEM(Block__Element--Modifier)提高可维护性。

  • 性能优化

    • 减少选择器复杂度(避免div > ul > li

    • 使用 transform/opacity 触发GPU加速动画

  • 浏览器兼容性:通过 Autoprefixer 等工具自动添加厂商前缀(如-webkit-)。

 


 

10 学习资源

 


 

11 总结

CSS 是前端开发的基石之一,与 HTML(结构)、JavaScript(行为)并称网页三剑客。

CSS 作为网页设计的核心语言,通过简洁的语法实现对网页样式的精细控制。CSS 通过层叠、继承等机制实现样式与结构的分离,显著提升开发效率与用户体验。从基础的文本美化到复杂的响应式布局,其功能覆盖现代网页开发的全场景。掌握选择器、盒模型、布局技术等要点,是构建高性能、可维护网站的关键。

CSS 通过推动响应式设计与动态效果的普及,不断演进(如 CSS3 模块化、变量 --var()、容器查询 @container),持续提升开发者对样式的底层控制能力,是构建现代 Web 界面的基石,是构建现代 Web 界面不可或缺的工具。

 


 

内容目录

 


 

迪欧IT——dio智能科技

服务器_网站图标_dioIT_128x128

 

公众号_二维码_迪欧智慧_128x128

 

 

 

 

 
posted @ 2025-08-24 15:57  jason-wrj  阅读(12)  评论(0)    收藏  举报