语法

层叠样式表 (CSS) 语言的基本目标是允许浏览器引擎用特定的功能(如颜色、定位或装饰)来绘制页面的元素。CSS 语法反映了这一目标,它的基本构建块是

  • 属性,它是一个标识符,即一个人类可读的名称,它定义了要考虑的哪个功能。
  • ,它描述了引擎如何处理该功能。每个属性都有一组有效值,由正式语法定义,以及由浏览器引擎实现的语义含义。

CSS 声明

将 CSS 属性设置为特定值是 CSS 语言的核心功能。属性和值对被称为声明,任何 CSS 引擎都会计算哪些声明应用于页面的每个元素,以便适当地布局和设置样式。

默认情况下,CSS 中的属性和值都不区分大小写。这对用冒号“:”(U+003A COLON)分隔,属性和值之前、之间和之后有空格,但内部不一定有空格,空格将被忽略。

css syntax - declaration.png

CSS 中有数百种不同的属性,以及实际上无限数量的不同值。并非所有属性和值的组合都是允许的,每个属性都定义了哪些值是有效的。当某个值对于给定属性无效时,该声明被认为是无效的,并将被 CSS 引擎完全忽略。

CSS 声明块

声明被分组到中,即用一个左花括号“{”(U+007B LEFT CURLY BRACKET)和一个右花括号“}”(U+007D RIGHT CURLY BRACKET)分隔的结构中。块有时可以嵌套,因此必须匹配左花括号和右花括号。

css syntax - block.png

这种块自然被称为声明块,块中的声明用分号“;”(U+003B SEMICOLON)分隔。声明块可以为空,即包含空声明。声明周围的空格将被忽略。块中的最后一个声明不需要用分号结束,尽管通常认为良好的风格是这么做,因为它可以防止在用另一个声明扩展块时忘记添加分号。

下图显示了 CSS 声明块。

css syntax - declarations block.png

注意: CSS 声明块的内容,即一系列用分号分隔的声明,不包括初始和结束花括号,可以放在 HTML 的style 属性中。

CSS 规则集

如果样式表只能将声明应用于网页的每个元素,那么它们将毫无用处。真正的目标是将不同的声明应用于文档的不同部分。

CSS 通过将条件与声明块相关联来实现这一点。每个(有效的)声明块之前都有一个或多个用逗号分隔的选择器,这些选择器是选择页面中某些元素的条件。选择器列表和相关的声明块,合称为规则集,或通常称为规则

下图显示了 CSS 规则集(或规则)。

css syntax - ruleset.png

由于页面元素可能被多个选择器匹配,因此也可能被多个规则匹配,而这些规则可能包含相同属性但具有不同值。CSS 标准定义了优先级规则,确定哪个规则应优先应用,这就是所谓的级联算法。

注意:需要注意的是,即使由一组选择器组成的规则集类似于一种速记方式,它可以替代每个选择器只有一个的规则集,但这并不适用于规则集本身的有效性。

这会导致一个重要的后果:如果单个基本选择器无效,例如使用未知伪元素或伪类时,整个选择器将无效,因此整个规则也将被忽略(因为它也是无效的)。

CSS 语句

规则集是样式表的主要构建块,样式表通常只包含一个大型规则集列表。但是,网页作者希望在样式表中传达其他信息,例如字符集、要导入的其他外部样式表、字体面或列表计数器描述等等。它将使用其他特定类型的语句来实现这些功能。

语句是一种构建块,它以任何非空格字符开头,以第一个闭合括号或分号(在字符串之外,未转义且不包含在其他 {}、() 或 [] 对中)结束。

css syntax - statements Venn diag.png

语句有两种类型:

  • 规则集(或规则),如前所述,将一组 CSS 声明与通过选择器描述的条件关联。
  • @规则,以“@”(U+0040 COMMERCIAL AT)开头,后面跟一个标识符,然后一直延续到语句的结尾,即直到下一个分号(;)在块之外,或下一个块的结尾。每种类型的@规则(由标识符定义)可能具有其自己的内部语法和语义。它们用于传达元数据信息(例如@layer@import)、条件信息(例如@media@document)、或描述性信息(例如@font-face)。

任何不是规则集或 @规则的语句都是无效的,会被忽略。

嵌套语句

还有一组语句——嵌套语句。这些语句可以在 @规则的特定子集(条件组规则)中使用。这些语句仅在满足特定条件时才适用:@media @规则的内容仅在运行浏览器的设备满足表达的条件时才适用;@document @规则的内容仅在当前页面满足某些条件时才适用,等等。在 CSS1 和 CSS2.1 中,只有规则集可以在条件组规则内使用。这限制很大,并且该限制在CSS 条件规则级别 3中被取消。现在,尽管仍然是实验性的,并非所有浏览器都支持,但条件组规则可以包含更广泛的内容:规则集以及一些(但不是全部)@规则。

另请参阅