CSS中样式覆盖优先顺序详解

   层叠优先级是:

  浏览器缺省 < 外部样式表 < 内部样式表 < 内联样式

  其中样式表又有:

  类选择器 < 类派生选择器 < ID选择器 < ID派生选择器

  派生选择器以前叫上下文选择器,所以完整的层叠优先级是:

  浏览器缺省 < 外部样式表 < 外部样式表类选择器 < 外部样式表类派生选择器 < 外部样式表ID选择器 < 外部样式表ID派生选择器 < 内部样式表 < 内部样式表类选择器 < 内部样式表类派生选择器 < 内部样式表ID选择器 < 内部样式表ID派生选择器 < 内联样式...共12个优先级

  有时候在写CSS的过程中,某些限制总是不起作用,这就涉及了CSS样式覆盖的问题,如下

 代码如下  
#navigator {  
    height: 100%;  
    width: 200;  
    position: absolute;  
    left: 0;  
    border: solid 2 #EEE;  
}  
 
.current_block {  
    border: solid 2 #AE0;  
}

  查找一些教材中(w3schools等),只说css的顺序是“元素上的style” > “文件头上的style元素” >“外部样式文件”,但对于样式文件中的多个相同样式的优先级怎样排列,没有详细说明。经过测试和继续搜索,得知优先级如下排列:

  1. 样式表的元素选择器选择越精确,则其中的样式优先级越高。

  id选择器指定的样式 > 类选择器指定的样式 > 元素类型选择器指定的样式

  所以上例中,#navigator的样式优先级大于.current_block的优先级,即使.current_block是最新添加的,也不起作用。

  2. 对于相同类型选择器指定的样式,在样式表文件中,越靠后的优先级越高。

  注意,这里是样式表文件中越靠后的优先级越高,而不是在元素class出现的顺序。比如.class2 在样式表中出现在.class1之后:

 代码如下  
.class1 {  
    color: black;  
}  
 
.class2 {  
    color: red;  
}

  而某个元素指定class时采用 class=”class2 class1″这种方式指定,此时虽然class1在元素中指定时排在class2的后面,但因为在样式表文件中class1处于class2前面,此时仍然是class2的优先级更高,color的属性为red,而非black。

  3. 如果要让某个样式的优先级变高,可以使用!important来指定。

 代码如下  
.class1 {  
    color: black !important;  
}  
 
.class2 {  
    color: red;  
}

  解决方案:

  此时class将使用black,而非red。

  对于一开始遇到的问题,有两种解决方案:

  1. 将border从#navigator中拿出来,放到一个class .block中,而.block放到.current_block之前:

 代码如下  
#navigator {  
    height: 100%;  
    width: 200;  
    position: absolute;  
    left: 0;  
}  
 
.block {  
    border: solid 2 #EEE;  
}  
 
.current_block {  
    border: solid 2 #AE0;  
}

  需要默认为#navigator元素指定class=”block”

  2. 使用!important:

 代码如下  
#navigator {  
    height: 100%;  
    width: 200;  
    position: absolute;  
    left: 0;  
    border: solid 2 #EEE;  
}  
 
.current_block {  
    border: solid 2 #AE0 !important;  
}

  此时无需作任何其他改动即可生效。可见第二种方案更简单一些。

  补充一个例子

 代码如下  

<html>
<head>
    <title></title>
    <style type="text/css">
        div { color: #00FF00 } /* 绿色 */
        .a1 { color: #0000FF } /* 蓝色 */
        .a1 div { color: #00FFFF } /* 青色 */
        .a2 { color: #FF0000 } /* 红色 */
        #a2 { color: #FFFF00 } /* 黄色 */
        #a2 div { color: #FF00FF } /* 紫色 */
    </style>
</head>
<body>
  <div>我是绿色,内部样式表优先于浏览器缺省</div>
  <div class="a2">我是红色,类选择器优先于内部样式表</div>
  <div class="a2" id="a2">我是黄色,ID选择器优先于类选择器</div>
  <div class="a1">
      <span>我是蓝色,类选择器优先于内部样式表</span>
      <div>我是青色,类派生选择器优先于类选择器</div>
      <div class="a2">我还是青色,类派生选择器优先于所有类选择器</div>
      <div id="a2">
          <span>我是黄色,ID选择器优先于类派生选择器</span>
          <div>我是紫色,ID派生选择器优先于类派生选择器</div>
          <div class="a1">我还是紫色,ID派生选择器优先于所有类选择器</div>
          <div class="a1" id="a1">我还是紫色,ID派生选择器优先于所有ID选择器</div>
          <div class="a1" id="a1" style="color:#000000;">我是黑色,内联样式驾到闲杂人等退下</div>
      </div>
  </div>
</body>
</html>

  效果


  另外,如果同一个元素在没有其他样式的作用影响下,其Class定义了多个并以空格分开,其优先级顺序为:

  一个元素同时应用多个class,后定义的优先(即近者优先),加上!important者最优先!

 代码如下  

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title></title>
<style type="text/css">
.a2 {
 font-size: 18pt;
 color: #0000FF!important;
}
.a1 {
 font-size: 9pt;
 color: #FF0000;
}
</style>
</head>

<body>
<br />
<span class="a1">a1</span><br />
<span class="a2">a2</span><br />
<span class="a2 a1">a2 a1</span><br />
<span class="a1 a2">a1 a2</span><br />
</body>
</html>

  运行后的效果图:

时间: 2024-08-23 19:37:35

CSS中样式覆盖优先顺序详解的相关文章

CSS中的层分离编程详解

  随着CSS的发展,使用CSS有语义化的命名约定和CSS层的分离,将有助于它的可扩展性,性能的提高和代码的组织管理. 在我前面的文章中讨论很多关于CSS的问题都可以通过使用一个适当的CSS策略来避免.在这篇文章里,我将着重于讨论使用一种方法或者一个命名规则所带来的好处. 这里有很多可供使用的前端方法和命名规则,每个都有自己的优缺点.在几乎所有的案例中CSS被分割成更易于管理的代码"块".CSS的这种分割方式定义了每一种方法. 命名规则 一个可靠命名规则的重要性是不可忽视的.就像组织结

CSS中的元素定位方法详解

  1.盒模型 盒模型,就是 浏览器为页面中的每个 HTML 元素生成的矩形盒子. 这些盒子们都要按照 可见版式模型(visual formatting model)在页面上排布.可见的页面版式主要由三个属性控制: position 属性. display 属性和 float 属性.其中,position 属性控制页面上元素间的位置关系, display 属性控制元素是堆叠.并排,还是根本不在页面上出现, float 属性提供控制的方式,以便把元素组成成多栏布局. 盒子属性分三组: 边框(bor

css中z-index 属性与用法详解

z-index规范参考 •在 W3C CSS2.1 规范中,每个元素都具有三维的空间位置,除我们所熟悉的水平和垂直位置外,元素还可在 "Z轴" 方向上层层相叠.依次向前排开: •元素在 "Z 轴" 方向上的呈现顺序,由层叠上下文和层叠级别决定.在文档中,每个元素仅属于一个层叠上下文.在给定的层叠上下文中,每个元素都有一个整型的层叠级别,它描述了在相同层叠上下文中元素在 "Z轴" 上的显示顺序: •同一个层叠上下文中,层叠级别大的显示在上,层叠级别

CSS中IE6浮动模型Bug详解

CSS浮动模型可以说是标准布局中不可或缺的组成部分,可是对于浮动模型在IE6的表现症状你是否已经完全了解或者掌握呢?如果你的答案是肯定的,那恭喜你不用听我的嗦了,如果你的答案是模糊的,那么下面的讨论或许对你以后的学习有所帮助. 首先看一下W3C对浮动模型部分解释(http://www.w3.org/TR/REC-CSS2/visuren.html): Since a float is not in the flow, non-positioned block boxes created befo

CSS中display各属性语法参数详解 附实例

这里向大家描述一下HTML DOM display属性的定义和用法,HTML DOM display属性主要用来设置元素如何显示,比如当此属性值为none时,表示此元素不会被显示,而block则表示此元素将显示为块级元素,此元素前后会带有换行符. HTML DOM display属性定义和用法 此属性主要用来设置元素如何显示. 语法: Object.style.display=value 可能的值 HTML DOM display属性实例 本例设置不显示元素: <html> <head&

HTML中的CSS盒子模型边界(box-model)问题详解

HTML中的元素我们把他分为一个一个的盒子,盒子里面可以再放盒子,也可以放置文本,默认情况下,我们给盒子设置maring.padding和border的时候,不管设置的是什么单位的值,这些值都会计算在盒子的总体面积以内,这虽然是很基础的CSS技术,但是很多编写代码的人却不甚了解,导致网页错位却不知道怎么解决. HTML中的CSS盒子模型边界(box-model)问题详解 我一直到很不喜欢CSS和填充间距边框的关系,你忙着去定义宽度来满足你的网格布局比例,然后接下来你开始添加文本和设置适量的间距和

JavaScript中浅讲ajax图文详解_javascript技巧

1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 对于JavaWeb项目而言,ajax主要用于浏览器和服务器之间数据的传输. 如果是单单地堆砌知识点,会显得比较无聊,那么根据惯例,我先不继续介绍ajax,而是来写一个案例吧. 打开

jQueryUI中的datepicker使用方法详解_jquery

jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等. 之前做的一个排班考勤系统,跟时间打交道较多,对时间控件做过一些对比,觉得jqueryUI里的这个datepicker更为实用,下面抽点时间给大家整理,方便以后查阅,同时也希望能帮助到大家! 1,引入js,css <link rel="stylesheet" href="http://code.

Python中的推导式使用详解

  这篇文章主要介绍了Python中的推导式使用详解,本文分别讲解了列表推导式.字典推导式.集合推导式使用实例,需要的朋友可以参考下 推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,速度快等优点.推导式包括: 1.列表推导式 2.字典推导式 3.集合推导式 嵌套列表推导式 NOTE: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下: [列表推导式] 列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到