`
天梯梦
  • 浏览: 13635310 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

CSS语法和CSS优先级

 
阅读更多

语法

层叠样式表( Cascading Stylesheet ,简称CSS ), 其基本目标是让浏览器以指定的特性去绘制页面元素,比如颜色,定位,装饰。CSS的语法反映了这个目标,由下面两个部分构建:

  • 属性( property)是一个标识符,用可读的名称来表示其特性。
  • 值(value)则描述了浏览器引擎如何处理该特性。每个属性都包含一个有效值的集合,它有正式的语法和语义定义,被浏览器引擎实现。

CSS 声明

CSS的核心功能是将CSS属性设定为特定的值。一个属性与值的键值对被称为”声明“(declaration) 。CSS引擎会计算页面上每个元素都有哪些声明,并且会根据结果绘制元素,排布样式。

在CSS中,属性和值对大小写都是敏感的。属性与值之间以英文冒号 ':' (U+003A COLON)隔开。属性与值前面、后面与两者之间的空白不是必需的,会被自动忽略。

CSS语法和CSS优先级
CSS语法和CSS优先级

目前CSS中有 100 多个属性 , 并且几乎有无限多个不同的值。并非所有的属性与值的配对都是被允许的, 每个属性都定义了它的合法值。如果值对给定的属性而言非法时,声明就会被视为无效的,整个声明就会被CSS引擎忽略。

CSS 声明块

声明会按照的形式被组合。声明块(declaration block)以英文左大括号('{' U+007B LEFT CURLY BRACKET)开始,以英文右大括号 '}' (U+007D RIGHT CURLY BRACKET)结束。块有时会嵌套,所以开始与结束大括号必须要匹配。

CSS语法和CSS优先级
CSS语法和CSS优先级

声明块里面的声明之间使用英文分号(';'  U+003B SEMICOLON)隔开。声明块可能为空,也就是包含空的声明。声明之间的空格会被忽略,声明块里最后一个声明可以不用分号,不过建议加上,以方便扩展声明块。

CSS语法和CSS优先级
CSS语法和CSS优先级
声明块的内容—开始与结束大括号之间的声明,可以放在HTML style 特性里。

CSS 规则

如果样式表只能为每个页面元素添加一个声明,那就没有真正发挥出它的价值。其真正的目标是为文档不同部分添加不同的声明。

为此,CSS可以在声明块前面放置选择器(selector),选择器用来选择页面多个元素的条件。一对选择器与声明块称为规则集(ruleset),常简称为规则(rule)。

CSS语法和CSS优先级
CSS语法和CSS优先级

一个元素可能被多个选择器选中,因此会有多个规则,有可能以不同的值去设置同一属性。CSS标准会规定哪个优先级最高并生效, 称之为 层叠(cascade) 算法。

有一点需要注意的是,尽管用一组选择器来定义的单个规则集,比用多个单一选择器来定义的多个规则集更加简洁,但这却不适用于规则集的有效性。

这会导致一个重要的后果:如果其中的一个选择器是无效的,如使用了一个未知的伪元素或伪类,会导致整个选择器都会无效,同时对应的规则都会被忽略。

CSS 语句

规则是样式表的主体,通常样式表会包括大量的规则列表。但有时候网页的作者也希望在样式表中包括其他的一些信息,比如字符集,导入其它的外部样式表,字体等,这些需要专门的语句表示。

语句以非空格的字符开头,以第一个反花括号或分号结束。

CSS语法和CSS优先级
CSS语法和CSS优先级

语句类型:

  • 规则。如上,将一组CSS声明与用选择器定义的条件相关联。
  • at规则(at-rules)。 以@ (U+0040 COMMERCIAL AT) 开始,随后是标识符,一直到以分号或右大括号结束。每个at规则由其标识符定义,可能有它自己的语法。at规则涵盖了meta信息(比如 @charset  @import),条件信息(比如@media  @document), 描述信息(比如@font-face)。

不是上面类型的语句则是非法的,被忽略。

条件规则组(conditional group rules)是特殊的at规则,可以嵌套语句。它里面的语句只有在特定条件下才生效。
CSS1 与 CSS2.1 下, 条件规则组里面只能用规则。CSS3 下还可以用一些但不是全部的at规则,见CSS Conditionals Level 3

其它

优先级

概念

浏览器通过优先级来判断哪一些属性值与一个元素最为相关,从而在该元素上应用这些属性值。优先级基于 由各种选择器组成的匹配规则。

优先级是如何计算的?

优先级就是一个 应用于指定的CSS声明的 权重,它由 匹配的选择器中的 每一种选择器类型的 数值 决定。

而当优先级与多个CSS声明中任意一个声明的优先级相等的时候,CSS中最后的那个声明将会被应用到元素上。

当同一个元素有多个声明的时候,优先级才会有意义。因为每一个直接作用于元素的CSS规则总是会接管/覆盖(take over)该元素从祖先元素继承而来的规则。

注意: 元素在文档树中的位置是不会影响优先级的。

选择器类型

下列是一份 优先级逐级增加的 选择器列表:

①此列表是从英文版搬过来的:

0. 元素(类型)选择器(type selectors)(例如:h1)和 伪元素选择器(pseudo-elements)(例如::before)

1. 类选择器(class selectors) (例如:.example),属性选择器(attributes selectors)(例如:[type="radio"]),伪类选择器(pseudo-classes)(例如::hover)

2. ID选择器(例如:#example)

 

②此列表是在我翻译之前,中文版本来的面目:

  • 通用选择器(*)
  • 元素(类型)选择器(type selectors)
  • 类选择器
  • 属性选择器
  • 伪类
  • ID 选择器
  • 内联样式

通用选择器(universal selector)(*), combinators (+>~, ' ')  和 否定伪类(negation pseudo-class)(:not()) 不会影响优先级(但是,在 :not() 内部声明的选择器是会影响优先级的)。

!important 规则例外

当在一个样式声明上使用 !important 规则时,该样式声明会覆盖CSS中任何其他的声明,。尽管技术上 !important 与优先级毫无关系,但是它们之间直接相互影响。使用 !important 是一个坏习惯,应该尽量避免,因为这打断了样式表中的固有的级联规则 使得调试找bug变得更加困难了。当两条相互冲突的带有!important 规则的声明被应用到相同的元素上时,拥有更大优先级的声明将会被采用。

 

一些经验法则:

  • Never 永远不要在全站范围的 css 上使用 !important
  • Only 只在需要覆盖全站或外部 css(例如引用的 ExtJs 或者 YUI )的特定页面中使用   !important
  • Never 永远不要在你的插件中使用 !important
  • Always 要优化考虑使用样式规则的优先级来解决问题而不是 !important
  • 取而代之,你可以:
  1. 善用 CSS 的级联属性
  2. 使用更多具体的规则。比如在你需要选定的对象元素前加上更多的元素,使选择的范围缩小,你的选择器就变得更有针对性,从而提高优先级:
    <div id="test">
      <span>Text</span>
    </div>
     
#test span { color: green }
span { color: red }
div span { color: blue }

 无论你css语句的顺序是什么样的,文本都会是绿色的(green),因为这一条规则是最有针对性、优先级最高的。(同理,无论语句顺序怎样,蓝色(blue)的规则都会覆盖红色(red)的规则)

什么时候应该使用:

A) 一种情况

  1. 你的网站上有一个设定了全站样式的CSS文件,
  2. 同时你(或是你同事)写了一些很差的内联样式。

在这种情况下,你就可以在你全局的CSS文件中写一些!important的样式来覆盖掉那些直接写在元素上的行内样式。

活生生的例子比如:一些写得很糟糕的 jQuery插件里面使用的内联样式。

 

B) 另一种情况

#someElement p {
    color: blue;
}

p.awesome {
    color: red;
}

 

在外层有 #someElement 的情况下,你怎样能使 awesome 的段落变成红色呢?这种情况下,如果不使用 !important ,第一条规则永远比第二条的优先级更高

 

怎样覆盖掉 !important

很简单,你只需要再加一条 !important 的CSS语句,将其应用到更高优先级的选择器(在原有基础上添加额外的标签、类或 ID 选择器)上;或是保持选择器一样,但添加的位置需要在原有声明的后面(优先级相同的情况下,后边定义的会覆盖前边定义的)。

 

一些拥有更高优先级的例子:

table td    {height: 50px !important;}
.myTable td {height: 50px !important;}
#myTable td {height: 50px !important;}

 

或者使用相同的选择器,但是置于已有的样式之后:

td {height: 50px !important;}

 

更多关于important的帖子:

http://stackoverflow.com/questions/3706819/what-are-the-implications-of-using-important-in-css

http://stackoverflow.com/questions/9245353/what-does-important-in-css-mean

http://stackoverflow.com/questions/5701149/when-to-use-important-property-in-css

http://stackoverflow.com/questions/11178673/how-to-override-important

http://stackoverflow.com/questions/2042497/when-to-use-important-to-save-the-day-when-working-with-css

 

:not 伪类例外

:not 否定伪类在优先级计算中不会被看作是伪类. 事实上, 在计算选择器数量时还是会把其中的选择器当做普通选择器进行计数.

 

这是一块CSS代码:

div.outer p {
  color:orange;
}
div:not(.outer) p {
  color: lime;
}

 

当它被应用在下面的HTML时:

<div class="outer">
  <p>This is in the outer div.</p>
  <div class="inner">
    <p>This text is in the inner div.</p>
  </div>
</div>

 

会在屏幕上出现以下结果:

This is in the outer div.

This text is in the inner div.

基于形式的优先级(Form-based specificity)

优先级是基于选择器的形式进行计算的。在下面的例子中,尽管选择器*[id="foo"] 选择了一个ID,但是它还是作为一个属性选择器来计算自身的优先级。

有如下样式声明:

* #foo {
  color: green;
}
*[id="foo"] {
  color: purple;
}

 

将其应用在下面的HTML中:

<p id="foo">I am a sample text.</p>

 

最终会出现下面的效果:

I am a sample text.

虽然匹配了相同的元素,但是 ID 选择器拥有更高的优先级。所以第一条样式声明生效。

无视DOM树中的距离

有如下样式声明:

body h1 {
  color: green;
}
html h1 {
  color: purple;
}

 

当它应用在下面的HTML时:

<html>
<body>
  <h1>Here is a title!</h1>
</body>
</html>

 

浏览器会将它渲染成:

Here is a title!

相关

 

参考:

https://developer.mozilla.org/zh-CN/docs/Web/CSS/Syntax

https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity

 

 

本文转自: CSS语法和CSS优先级

分享到:
评论

相关推荐

    div+css页面布局,新手入门教材,2天学会div+css

    CSS概述 CSS设置方式 CSS语法 样式规则注释和样式规则优先级 CSS的属性分类介绍

    div+css有实例,易学易懂

    3.1.2 CSS 的语法 3.1.3 选择符 3.1.4 属性 3.1.5 伪类和伪元素 3.1.6 默认值 3.1.7 继承性 3.2 CSS 编码规范 3.2.1 CSS 基本书写规范 3.2.2 CSS 样式表书写顺序 3.3 怎样更好地应用CSS 3.3.1 块元素和内联元素 ...

    精通CSS+DIV网页样式与布局全集

    1.2.3 链接式 1.2.4 导入样式 1.2.5 各种方式的优先级问题 1.3 体验CSS 1.3.1 从零开始 1.3.2 加入CSS控制 1.3.3 控制图片 1.3.4 CSS的注释 第2章 CSS的基本语法 2.1 CSS选择器 2.1.1 标记选择...

    Java面试宝典2017版

    目录 HTML&CSS;部分... 1、HTML中定义表格的宽度用80px和80%的区别是什么?...5、用Css3语法中,如何实现一个矩形框的圆角效果和50%红色透明效果?,请写出关键脚本. ...............................

    精通CSS+DIV网页样式与布局视频教材

    第2章 CSS的基本语法 2.1 CSS选择器 2.1.1 标记选择器 2.1.2 类别选择器 2.1.3 ID选择器 2.2 选择器声明 2.2.1 集体声明 2.2.2 选择器的嵌套 2.3 CSS的继承 2.3.1 父子关系 2.3.2 ...

    精通CSS+DIV网页样式与布局PART3

    1.2.3 链接式 1.2.4 导入样式 1.2.5 各种方式的优先级问题 1.3 体验CSS 1.3.1 从零开始 1.3.2 加入CSS控制 1.3.3 控制图片 1.3.4 CSS的注释 第2章 CSS的基本语法 2.1 CSS选择器 2.1.1 标记选择...

    精通CSS+DIV网页样式与布局PART2

    1.2.3 链接式 1.2.4 导入样式 1.2.5 各种方式的优先级问题 1.3 体验CSS 1.3.1 从零开始 1.3.2 加入CSS控制 1.3.3 控制图片 1.3.4 CSS的注释 第2章 CSS的基本语法 2.1 CSS选择器 2.1.1 标记选择...

    CSS中提升优先级属性!important的用法问题总结

    本文介绍了CSS中提升优先级属性!important的用法问题总结,分享给大家,具体如下: 一、语法 选择器{样式:值!import;} 二、说明 提升指定样式规则的应用优先权,即!important为开发者提供了一个增加样式权重的方法,...

    css入门笔记

    2.css的语法规范 1.使用css样式方式 1.内联样式 行内样式 特点:将css样式定义在HTML标记中 语法: 样式声明:用样式属性和值组成(属性:值;) 常用的样式属性: 1.颜色 属性 :color 颜色 取值:颜色...

    HTML (css样式规范)必看篇

    3.类选择器语法格式 .类名 (点加类名) 写的位置:在css样式的标记中调用方法在HTML标签内部写上 class=类名 4.命名规范 建议是纯字母或字母后面加数字,请勿数字开头,其它虽然可以使用请问使用 5.为什么要把

    超经典的Web前端与移动开发基础视频 Web前端基础开发视频教程 移动开发基础视频教程

    66前端开发基础视频-CSS特殊性即CSS优先级(上).avi 67前端开发基础视频-CSS特殊性即CSS优先级(中).avi 68前端开发基础视频-CSS特殊性即CSS优先级(下).avi 69前端开发基础视频-CSS设置标签模式display属性...

    candy:ail JS中的Tailwind CSS

    但是,在使用TailwindCSS的过程中,我遇到了PurgeCSS和类优先级规则的问题。 阅读有关Atomic CSS-in-JS的更多信息 因此,我创建了一个CSS-in-JS框架: :eyes: 支持所有现有的Tailwind速记语法。 :hammer_and_...

    leetcode答案-Interview:大前端开发面试题汇总收集,持续更新中~

    css选择器的优先级 css实现图片自适应宽高 flex,flex常用属性,以及相关作用 BFC是什么 Node 项目里面用nodejs做了啥 express框架的设计思想 nodejs的eventEmitter的实现 express的中间件系统是如何设计的 express ...

    HTML开发王

    8.2.7 图片的水平间距和垂直间距(hspace属性和vspace属性) 8.3 为图片建立超链接(img元素) 8.4 创建图像映射 8.4.1 了解热点和图像映射 8.4.2 关于客户端图像映射和服务端图像映射 8.4.3 创建图像映射(map元素、area...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    css的存在形式及优先级 css边框以及其他常用样式 css之float样式 css之float实现作业实例 css之display样式 css之内外边距 本周作业以及思路 第15周 上节内容答疑 上节内容回顾 CSS内容补充之position CSS内容补充...

    JavaScript详解(第2版)

     5.1.2 优先级和结合性   5.2 运算符类型   5.2.1 算术运算符   5.2.2 快捷赋值运算符   5.2.3 递增运算符和递减运算符   5.2.4 拼接运算符   5.2.5 比较运算符   5.2.6 逻辑运算符   ...

    ASP.NET3.5从入门到精通

    2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if 语句的使用方法 2.5.2 switch 选择语句的使用 2.6 使用循环语句 2.6.1 for 循环语句 2.6.2 while 循环语句 2.6.3 do while 循环语句 2.6.4 foreach 循环语句 2.7 ...

    ASP.NET 3.5 开发大全11-15

    2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 2.5.2 switch选择语句的使用 2.6 使用循环语句 2.6.1 for循环语句 2.6.2 while循环语句 2.6.3 do while循环语句 2.6.4 foreach循环语句 2.7 异常处理...

Global site tag (gtag.js) - Google Analytics