CSS选择器、优先级以及!important知识总结

一、CSS选择器

关于CSS选择器,首先请看这里:CSS 选择器参考手册

通过以上,我们可以将CSS选择器分为以下几种:

<script async src="//jsfiddle.net/hysunny/3gwbeu3v/embed/html,css,result/"></script>

基本选择器

  1. ID选择器(#footer),匹配所有id属性等于footer的元素。
  2. 类选择器(.info),匹配所有class属性中包含info的元素。
  3. 通用选择器(*),匹配任何元素。
  4. 标签选择器(E),匹配所有使用E标签的元素。
  5. 同级元素选择器(E~F ),匹配任何在E元素之后的同级F元素(CSS3)。

示例:

#footer { background: #999;}
.info { background: #000;}
* { margin: 0;padding: 0; }
div { border: 1px #000000 solid; }
p ~ ul { background: #000000; }

属性选择器

说明:以下E表示元素,attr表示属性,val表示属性的值。

  1. E[attr]选择器

    匹配所有具有attr属性的E元素,不考虑它的值。(注:E在此处可以省略,比如“[checked]”.)

    示例1:匹配所有含有title属性的div元素

    示例2:匹配所有含有title属性的元素

    看出区别了么~ 示例2就是比示例1省略了元素名div~

  2. E[attr=val]

    匹配所有attr属性值为val的E元素。(注:同上,这里的E也可以省略。)

    示例:匹配所有class值为test的p元素

  3. E[attr~=val]

    匹配具有attr属性且属性值用空格分隔的字符列表。

    示例:匹配具有class属性且其中一个属性值为name的div元素

    运行代码,我们可以看到第一个div会应用上面的样式~

  4. E[attr|=val]

    匹配具有attr属性且属性值为用连接符(-)分隔的字符串,并以val开头的E元素。

    示例: 匹配所有以test开头并以-连接的具有class属性的div元素

    运行代码,可以看出第二个div会应用上面的样式~

  5. E[attr^="val"],属性attr的值以"val"开头的元素(CSS3)。

  6. E[attr$=“val”],属性attr的值以"val"结尾的元素(CSS3)。

  7. E[attr*="val"],属性attr的值包含"val"字符串的元素(CSS3)。

组合选择器

  1. 多元素选择器(E, F),同时匹配多有E元素或F元素。

    示例

  2. 后代选择器(E F),匹配所有属于E元素后代的F元素,E和F之间用空格分隔。

    示例

  3. 子元素选择器(E > F), 匹配所有E元素的子元素F。

    示例

  4. 相邻选择器(E + F),匹配所有紧随E元素之后的同级元素F。

    示例

    可以发现,我们的样式只对紧跟div的第一个p元素起作用~

伪类选择器

说明:以下E表示元素

CSS2.1中的伪类:

  1. E:first-child, 匹配父元素的第一个元素。
  2. E:link, 匹配所有未被点击的链接.
  3. E:visited, 匹配所有已被点击的链接。
  4. E:active, 匹配鼠标已经将其按下,还没释放的E元素。
  5. E:hover, 匹配鼠标悬停其上的E元素。
  6. E:focus, 匹配获得当前焦点的E元素。
  7. E:lang(c), 匹配lang属性等于c的E元素。

示例:

p:first-child {
  font-style: italic;
}
input[type=text]:focus {
  color: #000;
  background: #ffe;
}
input[type=text]:focus:hover {
  background: #fff;
}
q:lang(sv) {
  quotes: "\201D" "\201D" "\2019" "\2019";
}

CSS2.1中的伪元素

  1. E:first-line, 匹配E元素的第一行。
  2. E:first-letter, 匹配E元素的第一个字母。
  3. E:before, 在E元素之前插入生成的内容。
  4. E:after, 在E元素之后插入生成的内容。

示例:

p:first-line { 
  font-weight: bold; 
  color: #600;
}
.preamble:first-letter { 
  font-size: 1.5em; 
  font-weight: bold; 
}
.cbb:before {
  content: "";
  display: block;
  height: 17px;
  width: 18px;
  background: url(top.png) no-repeat 0 0;
  margin: 0 0 0 -18px;
}
a:link:after {
 content: " (" attr(href) ") "; 
}

CSS3中与用户界面有关的伪类

  1. E:enabled, 匹配表单中激活的元素。
  2. E:disabled, 匹配表单中禁用的元素。
  3. E:checked, 匹配表单中被选中的radio(单选框)或checkbox(复选框)元素。
  4. E::selection, 匹配用户当前选中的元素。

示例:

input[type="text"]:disabled { background: #ddd; }

CSS3中的结构性伪类

  1. E:root, 匹配文档的根元素,对于HTML文档,就是HTML元素。
  2. E:nth-child(n), 匹配其父元素的第n个子元素,第一个编号为1。
  3. E:nth-last-child(n), 匹配其父元素的倒数第n个子元素,第一个编号为1。
  4. E:nth-of-type(n), 与:nth-child()作用类似,但是仅匹配使用同种标签的元素。
  5. E:nth-last-of-type(n), 与:nth-last-child()作用类似,但是仅匹配使用同种标签的元素。
  6. E:last-child, 匹配父元素的最后一个子元素,等同于:nth-last-child(1)。
  7. E:first-of-type, 匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1).
  8. E:last-of-type, 匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)。
  9. E:only-child, 匹配父元素下仅有的一个子元素,等同于:first-child:last-child或:nth-child(1):nth-last-child(1).
  10. E:only-of-type, 匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或:nth:first-of-type(1):nth-last-of-type(1).
  11. E:empty, 匹配一个不包含任何子元素的元素,注意:文本节点也被看作子元素。

示例:

p:nth-child(3) { color: #f00; }
p:nth-child(odd) { color: #f00;}
p:nth-child(even) { color: #f00; }
p:nth-child(3n+0) { color: #f00; }
p:nth-child(3n) { color: #f00; }
tr:nth-child(2n+11) { background: #ff0; }
tr:nth-last-child(2) { background: #ff0; }
p:last-child { background: #ff0; }
p:only-child { background: #ff0; }
p:empty { background: #ff0; }

CSS3的反选伪类

E:not(s),匹配不符合当前选择器的任何元素

示例:

:not(p) {
  border: 1px solid #ccc;
}

CSS3中的:target伪类

E:target,匹配文档中特定"id"点击后的效果

示例:

h2:target {
  color: white;
  background: #f60;
}

后代元素选择器和子元素选择器的区别

这里我们简单讨论下后代元素选择器和子元素选择器的区别

  1. 写法不一样:

    后代元素选择器标识:空格

    如:ul li{ width:150px; },ul和li之间用空格隔开

    子元素选择器标识:>

    如:ul>li{ width:150px; },ul和li之间用>隔开

  2. 功能不一样
    接着上例来说:

    后代选择器是选择ul包围的,所以元素中的所有li元素,包括子元素、孙元素、曾孙元素等等等。

    子选择器仅仅选择ul包围的 子元素中的 li元素,不包括孙元素、曾孙元素等等等。

  3. 兼容性不一样:

    后代选择器是所有浏览器都兼容的,都可使用。

    子选择器在IE6、IE7、IE8中则是不被支持的选择器,各自bug!

示例

二、CSS优先级

什么是CSS优先级?

CSS优先级是指CSS样式在浏览器中被解析的先后顺序

样式的优先级

多重样式(Mutiple Styles):如果外部样式、内部样式和内联样式同时应用于同一个元素,就是多重样式的使用情况。

一般情况下,(外部样式)External style sheet <(内部样式)Internal style sheet <(内联样式)Inline style

例外:如果外部样式放在内部样式的后面,则外部样式将会覆盖内部样式。

示例:

<!DOCTYPE html>
<html>
  
<head>
    <meta charset=utf-8>
    <style type="text/css">
      /* 内部样式 */
      h3{color:green;}
    </style>
 
    <!-- 外部样式 style.css -->
    <link rel="stylesheet" type="text/css" href="style.css"/>
    <!-- 设置:h3{color:blue;} -->
</head>
<body>
    <h3>测试!</h3>
</body>
</html>

选择器的优先级

给不同的选择器分配不同的权值

选择器 内联样式(style="") id选择器 类选择器/属性选择器/伪类选择器 标签选择器
权重 1000 100 10 1

解释:

  1. 内联样式表的权值最高1000;
  2. id选择器权值100;
  3. 类选择器/属性选择器/伪类选择器权值10;
  4. HTML标签选择器权值为1.

示例

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
        #redP p {
             /* 权值 = 100+1=101 */
             color:#F00;  /* 红色 */
        }
 
        #redP .red em {
             /* 权值 = 100+10+1=111 */
             color:#00F; /* 蓝色 */
 
        }
 
        #redP p span em {
             /* 权值 = 100+1+1+1=103 */
             color:#FF0;/*黄色*/
        }
    </style>
  </head>
  <body>
     <div id="redP">
        <p class="red">red
           <span><em>em red</em></span>
        </p>
        <p>red</p>
     </div>
  </body>
</html>

结果:标签内的数据显示为蓝色。

CSS优先级法则

比较样式的优先级是,只需统计不同选择器的个数,然后与对应的权值相乘即可。根据结果便可得出优先级。

  1. 结果较大的优先级较高;
  2. 结果相同,则后定义的优先级较高
  3. 创作者的优先级高于浏览者,网页编写者设置的CSS样式的优先权高于浏览器所设置的样式。
  4. 继承的CSS样式优先级低于后来指定的CSS样式
  5. 若样式值中含有!important,则该值优先级最高

看到这里,有些同学是不是对!important有点迷惑呀为什么有了它,就优先级最高呐下面我们再来详细讲一讲!important~

三、!important知识点

!important简介

!important 是CSS1就定义的语法,作用是提高指定样式的应用优先权。

语法格式:{cssRule !important},即写在定义的最后面,例如:box { color: red !important}

声明了!important的样式,具有最高的优先级,相当于写在最下面(最后定义)

IE 6.0下的!important

IE 6.0不完全支持!important

IE支持重定义中的!important,例如:

.yuanxin { color:#e00 !important; }
.yuanxin { color:#000; }

你将会发现定义了样式class="yuanxin"时,在IE下,字体显示为红色(#e00)。
但不支持同一定义中的!important。例如:

.yuanxin { color: #e00 !important; color: #000; }

此时在IE6下不支持,你将会发现定义了样式class="yuanxin"时,字体显示为黑色(#000)。

解释

important的样式属性和覆盖它的样式属性单独使用时(不在一个{}里),IE 6.0认为!important优先级较高,否则当含!important的样式属性被同一个{}里的样式覆盖时,IE 6.0认为!important较低!
再举一个例子:

/*样式1*/
#a{width:100 !important;} /*有效*/
#a{width:50px;} /*无效*/
/*样式2*/
#a{width:100px !important; width:50px;} /*width:100px无效,width:50px 有效*/

因为IE 6.0一直都不完全支持这个语法,而其他的浏览器都支持。因此我们就可以利用这一点来分别利用!important,我们可以针对IE和非IE浏览器设置不同的样式,只要在非IE浏览器样式的后面加上!important。

完。


总结内容参考以下:

w3school_CSS 选择器参考手册
阮一峰_CSS选择器笔记
css选择器优先级深入理解
CSS 的优先级机制[总结]

十分感谢你们的分享n(*≧▽≦*)n

注:原文章首发于:CSS选择器、优先级以及!important知识总结,现迁移至此。

<script async src="//jsfiddle.net/hysunny/3gwbeu3v/embed/html,css,result/"></script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容