CSS选择器

伪类

类名 说明
:link 未访问过的链接
:visited 访问过的连接
:hover 鼠标悬停的元素
:focus 获取焦点的元素
:active 激活的元素(例如一个被单击的链接元素)
:first-child 作为其它元素第一个子元素的元素
:lang() 根据元素的lang属性确定的元素

CSS3

类名 说明
:target 当通过锚点跳转到页面指定位置时,调用该样式突出显示
:root
:nth-child()
:nth-of-type()
:nth-last-of-type()
:first-of-type
:last-of-type
:only-of-type
:only-child
:last-child
:empty
:not()
:enabled
:disabled
:checked

伪元素

元素名 说明
::first-line
::first-letter
::before
::after

区别:影响文档的方式不同,伪类的表现有点像给文档添加类,而伪元素的效果就好像有元素被插入到了文档中。

特殊性

问题

ui li {font-style:normal;}
html li {font-style:italic;}

此时他们当中的哪个属性会『赢』,被应用呢?

特殊性是一个选择器『特殊程度』的数字表示。

确定选择器的特殊性的三样东西

  • 每个元素描述符贡献0,0,0,1
    • div ul ul li 0,0,0,4
  • 每个类、伪类或者属性描述符贡献0,0,1,0
    • div.aside ul li 0,0,1,3
    • a:hover 0,0,1,1
    • div.navlinks a:hover 0,0,2,2
  • 每个ID描述符贡献0,1,0,0
    • #title em 0,1,0,1
    • h1 #title em 0,1,0,2
  • 行内样式 1,0,0,0

现在回顾下刚才的问题,他们的特殊性都为0,0,0,2,是一样的。此时,后写的赢,被应用。(即文字会变为斜体)

重要性

利用重要性可以忽略特殊性,关键字 !important

DEMO



此时,文字是绿色的。

【注意】

当不同的css属性都声明了!important关键字时,就需要按照前面提到的优先级方式去选择了。所以,平时写代码时,并不鼓励使用此关键字。因为当一处修改后,会发现还有其它地方也需要修改。不久,通篇都是!important关键字了。

省略简写属性值的关键字

Demo1

strong{
  font:blod italic small-caps medium/1.2 Verdana, sans-serif;
}

当省略了部分简写属性值的时候,却是的部分就会使用该属性的默认值。

Demo2

// 全站样式表
body {
  background:#FCC url(/i/bg.gif) 10px 25% no-repeat fixed;
}
// 某页面的嵌入样式表
body {
  background:url(/i/bg2.gif);
}

此时该页面的样式相当于(因为省略的部分用默认的值代替了)

body{
  background: transparent url(/i/bg2.gif) 0 0 repeat scroll;
}

那么,如果我们想要复用全站样式表,只单纯的改变其中的背景图片怎么办呢?此时,只需要改变其中的特定属性就好了

body {
  background-image:url(/i/bg2.gif);
}

【 注意】

大部分简写属性的工作方式是这样的,部分属性除外,例如,margin padding border-style border-width border-color等,当省略这些值时,会从已给出的值中复制一份。

技巧:选择性的覆盖简写属性

Demo1 实现一个3px的点线边框,除了左边的线框是红色的之外,其它的都是黑色的。

div {
  border:3px dotted black;
  border-left-color:red; // 选择性的覆盖左侧的属性
}

通用选择

Demo1 选择div1下的全部元素

div1 *{
  ...
}

【注意】

通用选择器的特殊性贡献值为0,0,0,0

id与class共用




  

多类



  

【注意】

IE6及早期版本不支持多类写法,尽管依然支持多类的写法,但是在.panel.weather在IE6中知会是别成.weather

简单的属性选择

属性选择器是CSS2中引入的,并在CSS3中得到了扩展。其最基本的思路就是可以通过元素已有的属性选择元素。或者基于元素属性值的某个方面进行选择。

demo

a[href]{
  // 选择所有具有href属性的a元素。这样的话,就可以过滤调锚点
}
a[href="https://objectBoy.github.io"]{
  // 筛选某个链接指向的a标签,像这样的精确匹配,使用时,就像ID差不多,需要确定那个属性值是不变的,不然..会  // 很尴尬
}

类的属性选择

div[class~="panel"]

~ 号的作用:改属性选择器会选择以空格分隔的类名列表中包含该词的元素。如果去掉后(class=panel)则只能选择class属性为panel的div元素。如果某个div的class属性为panel weather就不行了。

div[class~="panel"] === div.panel

demo

img[alt~="figure"]{}
table[summary~="data"]{}
*[title~="2009"]{}

【注意】

属性选择器的特殊贡献值为0,0,1,0

demo

p#lead-in{font-weight:bold;} //0,1,0,1
p[id="lead-in"]{ //0,0,1,1
  font-weight:normal;
  font-style:italic;
}
//结果是加粗的斜体

部分属性值选择

a[href*="w3.org"]{font-weight:bold;}  //选择所有href中包含w3.org的a标签
a[href^="http"]{}  //所有以http开头的元素
a[href$=".pdf"]{}  //以.pdf结尾的元素

选择后代元素

ol > li {list-style-type:upper-alpha;}

>限定了只能选择有序列表的子元素,如果把它去掉的话,改style则会作用在有序列表后代的任何列表项上,包括嵌套的列表项。

兄弟选择器

h2{margin-bottom:0;}
h2 + p {
  // 任何紧跟在h2标签**后面**的段落元素取消边距
  margin-top:0;
}
h1 ~ ul {
  // 选择后续的兄弟元素,但不包括紧邻的兄弟元素
  list-style-type:lower-alpha;
}

生成内容

通过伪元素:before :after以及它们的content属性,实现css生成内容并将其插入到文档中的方法

demo 在所有的li元素前加入"Item:"有下划线的字段

li:before{
  content:"Item: ";
  border-bottom:1px solid gray;
}

【注意】

content只能加入纯文本,而不能加入dom结构标签

content可以插入浏览器支持的字符或图像字符,需要知道它们的十六进制字符编码,并且在前面加一个反斜杠li:before{content:"\BB";}

demo 在文章中被标签涵括的元素后,显示链接地址

a[href]:after{content:"["attr(href)"]";font-size:smaller;"}

你可能感兴趣的:(CSS选择器)