CSS3简明教程之征服CSS3选择器

第6章 征服CSS3选择器

属性选择器

在HTML中,通过各种各样的属性可以给元素增加很多附加的信息。例如,通过id属性可以将不同div元素进行区分。

在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进行了扩展,新增了3个属性选择器,使得属性选择器有了通配符的概念,这三个属性选择器与CSS2的属性选择器共同构成了CSS功能强大的属性选择器。如下表所示:

属性选择器 功能描述
E[att^='val'] 选择匹配元素E,且E元素定义了属性att,其属性值以val开头的任何字符串
E[att$='val'] 选择匹配元素E,且E元素定义了属性att,其属性值以val结尾的任何字符串
E[att*='val'] 选择匹配元素E,且E元素定义了属性att,其属性值的任意位置包含了val

示例:

<a href="xxx.pdf">我链接的是PDF文件</a>
<a href="#" class="icon">我类名是icon</a>
<a href="#" title="我的title是more">我的title是more</a>
a[class^=icon]{
  background: green;
  color:#fff;
}
a[href$=pdf]{
  background: orange;
  color: #fff;
}
a[title*=more]{
  background: blue;
  color: #fff;
}

结构性伪类选择器 root

:root选择器,从字面上我们就可以很清楚的理解是根选择器,他的意思就是匹配元素E所在文档的根元素。在HTML文档中,根元素始终是<html>

通过“:root”选择器设置背景颜色

:root {
  background:orange;
}

结构性伪类选择器 not

:not选择器称为否定选择器,和jQuery中的:not选择器一模一样,可以选择除某个元素之外的所有元素。就拿form元素来说,比如说你想给表单中除submit按钮之外的input元素添加红色边框

form {
  width: 200px;
  margin: 20px auto;
}
div {
  margin-bottom: 20px;
}
input:not([type="submit"]){
  border:1px solid red;
}

结构性伪类选择器 empty

:empty选择器表示的就是空。用来选择没有任何内容的元素,这里没有内容指的是一点内容都没有,哪怕是一个空格

比如说,你的文档中有三个段落p元素,你想把没有任何内容的P元素隐藏起来。我们就可以使用:empty选择器来控制

p{
 background: orange;
 min-height: 30px;
}
p:empty {
  display: none;
}​

结构性伪类选择器 target

:target选择器称为目标选择器,用来匹配文档(页面)的url的某个标志符的目标元素

点击链接显示隐藏的段落

html代码:

<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">
    content for Brand
</div>

css代码:

.menuSection{
  display: none;
}
:target{  /*这里的:target就是指id="brand"的div对象*/
  display:block;
}

分析:

  1. 具体来说,触发元素的URL中的标志符通常会包含一个#号,后面带有一个标志符名称,上面代码中是:#brand

  2. :target就是用来匹配id为brand的元素(id="brand"的元素),上面代码中是那个div元素。

多个url(多个target)的处理:

同一个页面上有很多的url的时候你可以取不同的名字,只要#号后对的名称与id=""中的名称对应就可以了

html代码:

<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">
  content for Brand
</div>
<h2><a href="#jake">Brand</a></h2>
<div class="menuSection" id="jake">
  content for jake
</div>
<h2><a href="#aron">Brand</a></h2>
<div class="menuSection" id="aron">
   content for aron
</div>

CSS代码:

#brand:target {
  background: orange;
  color: #fff;
}
#jake:target {
  background: blue;
  color: #fff;
}
#aron:target {
  background: red;
  color: #fff;
}

结构性伪类选择器 first-child

:first-child选择器表示的是选择父元素的第一个子元素的元素E

示例演示:

通过:first-child选择器定位列表中的第一个列表项,并将序列号颜色变为红色。

html代码:

<ol>
 <li><a href="##">Link1</a></li>
 <li><a href="##">Link2</a></li>
 <li><a href="##">link3</a></li>
</ol>

CSS代码:

ol > li{
  font-size:20px;
  font-weight: bold;
  margin-bottom: 10px;
}

ol a {
  font-size: 16px;
  font-weight: normal;
}

ol > li:first-child{
  color: red;
}

结构性伪类选择器 last-child

:last-child选择器选择的是元素的最后一个子元素

html代码:

<div class="post">
 <p>第一段落</p>
 <p>第二段落</p>
 <p>第三段落</p>
 <p>第四段落</p>
 <p>第五段落</p>
</div>​

CSS代码:

.post {
  padding: 10px;
  border: 1px solid #ccc;
  width: 200px;
  margin: 20px auto;
}
.post p {
  margin:0 0 15px 0;
}

.post p:last-child {
  margin-bottom:0;
}

结构性伪类选择器 nth-child(n)

:nth-child(n)选择器用来定位某个父元素的一个或多个特定的子元素。其中n是其参数,而且可以是整数值(1,2,3,4),也可以是表达式(2n+1、-n+5)和关键词(oddeven),但参数n的起始值始终是1,而不是0。也就是说,参数n的值为0时,选择器将选择不到任何匹配的元素。

html代码:

<ol>
 <li>item1</li>
 <li>item2</li>
 <li>item3</li>
 <li>item4</li>
 <li>item5</li>
 <li>item6</li>
 <li>item7</li>
 <li>item8</li>
 <li>item9</li>
 <li>item10</li>
</ol>​

CSS代码:

ol > li:nth-child(2n){
  //将偶数行列表背景色设置为橙色
  background: orange;
}

结构性伪类选择器 nth-last-child(n)

:nth-last-child(n)选择器和前面的:nth-child(n)选择器非常的相似,只是这里多了一个last,所起的作用和:nth-child(n)选择器有所区别,从某父元素的最后一个子元素开始计算,来选择特定的元素。

html代码:

<ol>
 <li>item1</li>
 <li>item2</li>
 <li>item3</li>
 <li>item4</li>
 <li>item5</li>
 <li>item6</li>
 <li>item7</li>
 <li>item8</li>
 <li>item9</li>
 <li>item10</li>
 <li>item11</li>
 <li>item12</li>
 <li>item13</li>
 <li>item14</li>
 <li>item15</li>
</ol>​

CSS代码:

ol > li:nth-last-child(5){
  background: orange;
}

first-of-type选择器

:first-of-type选择器类似于:first-child选择器,不同之处就是指定了元素的类型,其主要用来定位一个父元素下的某个类型的第一个子元素。

html代码:

<div class="wrapper">
 <div>我是一个块元素,我是.wrapper的第一个子元素</div>
 <p>我是一个段落元素,我是不是.wrapper的第一个子元素,但是他的第一个段落元素</p>
 <p>我是一个段落元素</p>
 <div>我是一个块元素</div>
</div>

CSS代码:

.wrapper {
  width: 500px;
  margin: 20px auto;
  padding: 10px;
  border: 1px solid #ccc;
  color: #fff;
}
.wrapper > div {
  background: green;
}
.wrapper > p {
  background: blue;
}
/*我要改变第一个段落的背景为橙色*/
.wrapper > p:first-of-type {
  background: orange;
}

nth-of-type(n)选择器

:nth-of-type(n)选择器和:nth-child(n)选择器非常类似,不同的是它只计算父元素中指定的某种类型的子元素。当某个元素中的子元素不单单是同一种类型的子元素时,使用:nth-of-type(n)选择器来定位于父元素中某种类型的子元素是非常方便和有用的。在:nth-of-type(n)选择器中的n:nth-child(n)选择器中的n参数也一样,可以是具体的整数,也可以是表达式,还可以是关键词。

html代码:

<div class="wrapper">
 <div>我是一个Div元素</div>
 <p>我是一个段落元素</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
 <p>我是一个段落</p>
</div>

CSS代码:

.wrapper > p:nth-of-type(2n){
  background: orange;
}

last-of-type选择器

:last-of-type选择器和:first-of-type选择器功能是一样的,不同的是他选择是父元素下的某个类型的最后一个子元素。

html代码:

<div class="wrapper">
 <p>我是第一个段落</p>
 <p>我是第二个段落</p>
 <p>我是第三个段落</p>
 <div>我是第一个Div元素</div>
 <div>我是第二个Div元素</div>
 <div>我是第三个Div元素</div>
</div>

CSS代码:

.wrapper > p:last-of-type{
  background: orange;
}

nth-last-of-type(n)选择器

:nth-last-of-type(n)选择器和:nth-of-type(n)选择器是一样的,选择父元素中指定的某种子元素类型,但它的起始方向是从最后一个子元素开始

html代码:

<div class="wrapper">
 <p>我是第一个段落</p>
 <p>我是第二个段落</p>
 <p>我是第三个段落</p>
 <p>我是第四个段落</p>
 <p>我是第五个段落</p>
 <div>我是一个Div元素</div>
 <p>我是第六个段落</p>
 <p>我是第七个段落</p>
</div>

CSS代码:

.wrapper > p:nth-last-of-type(3){
  background: orange;
}

only-child选择器

:only-child选择器选择的是父元素中只有一个子元素,而且只有唯一的一个子元素。也就是说,匹配的元素的父元素中仅有一个子元素,而且是一个唯一的子元素。

html代码:

<div class="post">
  <p>我是一个段落</p>
  <p>我是一个段落</p>
</div>
<div class="post">
  <p>我是一个段落</p>
</div>

CSS代码:

.post p {
  background: green;
  color: #fff;
  padding: 10px;
}
.post p:only-child {
  background: orange;
}

only-of-type选择器

:only-of-type选择器用来选择一个元素是它的父元素的唯一一个相同类型的子元素。这样说或许不太好理解,换一种说法。:only-of-type是表示一个元素他有很多个子元素,而其中只有一种类型的子元素是唯一的,使用:only-of-type选择器就可以选中这个元素中的唯一一个类型子元素。

html代码:

<div class="wrapper">
 <p>我是一个段落</p>
 <p>我是一个段落</p>
 <p>我是一个段落</p>
 <div>我是一个Div元素</div>
</div>
<div class="wrapper">
 <div>我是一个Div</div>
 <ul>
   <li>我是一个列表项</li>
 </ul>
 <p>我是一个段落</p>
</div>

CSS代码:

.wrapper > div:only-of-type {
  background: orange;
}

:enabled选择器

在Web的表单中,有些表单元素有可用:enabled和不可用:disabled状态,比如输入框,密码框,复选框等。在默认情况之下,这些表单元素都处在可用状态。那么我们可以通过伪选择器:enabled对这些表单元素设置样式。

html代码:

<form action="#">
 <div>
   <label for="name">Text Input:</label>
   <input type="text" name="name" id="name" placeholder="可用输入框"  />
 </div>
  <div>
   <label for="name">Text Input:</label>
   <input type="text" name="name" id="name" placeholder="禁用输入框"  disabled="disabled" />
 </div>
</form> 

CSS代码:

div{
  margin: 20px;
}
input[type="text"]:enabled {
  background: #ccc;
  border: 2px solid red;
}

:disabled选择器

:disabled选择器刚好与:enabled选择器相反,用来选择不可用表单元素。要正常使用:disabled选择器,需要在表单元素的HTML中设置disabled属性。

html代码:

<form action="#">
 <div>
   <input type="text" name="name" id="name" placeholder="我是可用输入框" />
 </div>
 <div>
   <input type="text" name="name" id="name" placeholder="我是不可用输入框" disabled />
 </div>
</form>  

CSS代码:

form {
  margin: 50px;
}
div {
  margin-bottom: 20px;
}
input {
  background: #fff;
  padding: 10px;
  border: 1px solid orange;
  border-radius: 3px;
}
input[type="text"]:disabled {
  background: rgba(0,0,0,.15);
  border: 1px solid rgba(0,0,0,.15);
  color: rgba(0,0,0,.15);
}

:checked选择器

在表单元素中,单选按钮和复选按钮都具有选中和未选中状态。(大家都知道,要覆写这两个按钮默认样式比较困难)。在CSS3中,我们可以通过状态选择器:checked配合其他标签实现自定义样式,而:checked表示的是选中状态。

html代码:

<form action="#">
 <div class="wrapper">
   <div class="box">
     <input type="checkbox" checked="checked" id="usename" /><span>√</span>
   </div>
   <lable for="usename">我是选中状态</lable>
 </div>
 
 <div class="wrapper">
   <div class="box">
     <input type="checkbox"  id="usepwd" /><span>√</span>
   </div>
   <label for="usepwd">我是未选中状态</label>
 </div>
</form> 

CSS代码:

form {
  border: 1px solid #ccc;
  padding: 20px;
  width: 300px;
  margin: 30px auto;
}

.wrapper {
  margin-bottom: 10px;
}

.box {
  display: inline-block;
  width: 20px;
  height: 20px;
  margin-right: 10px;
  position: relative;
  border: 2px solid orange;
  vertical-align: middle;
}

.box input {
  opacity: 0;
  position: absolute;
  top:0;
  left:0;
}

.box span {
  position: absolute;
  top: -10px;
  right: 3px;
  font-size: 30px;
  font-weight: bold;
  font-family: Arial;
  -webkit-transform: rotate(30deg);
  transform: rotate(30deg);
  color: orange;
}

input[type="checkbox"] + span {
  opacity: 0;
}

input[type="checkbox"]:checked + span {
  opacity: 1;
}

::selection选择器

::selection伪元素是用来匹配突出显示的文本(用鼠标选择文本时的文本)

html代码:

<p>“::selection”伪元素是用来匹配突出显示的文本。浏览器默认情况下,选择网站文本是深蓝的背景,白色的字体,</p>

CSS代码:

::-moz-selection {
  background: red;
  color: green;
}
::selection {
  background: red;
  color: green;
}

:read-only选择器

:read-only伪类选择器用来指定处于只读状态元素的样式。简单点理解就是,元素中设置了readonly=’readonly’

html代码:

<form action="#">
 <div>
   <label for="name">姓名:</label>
   <input type="text" name="name" id="name" placeholder="大漠" />
 </div>
 <div>
   <label for="address">地址:</label>
   <input type="text" name="address" id="address" placeholder="中国上海" readonly="readonly" />
 </div>
</form>  

CSS代码:

form {
  width: 300px;
  padding: 10px;
  border: 1px solid #ccc;
  margin: 50px auto;
}
form > div {
  margin-bottom: 10px;
}

input[type="text"]{
  border: 1px solid orange;
  padding: 5px;
  background: #fff;
  border-radius: 5px;
}

input[type="text"]:-moz-read-only{
  border-color: #ccc;
}
input[type="text"]:read-only{
  border-color: #ccc;
}

:read-write选择器

:read-write选择器刚好与:read-only选择器相反,主要用来指定当元素处于非只读状态时的样式。

html代码:

<form action="#">
 <div>
   <label for="name">姓名:</label>
   <input type="text" name="name" id="name" placeholder="大漠" />
 </div>
 <div>
   <label for="address">地址:</label>
   <input type="text" name="address" id="address" placeholder="中国上海" readonly="readonly" />
 </div>
</form>  

CSS代码:

form {
  width: 300px;
  padding: 10px;
  border: 1px solid #ccc;
  margin: 50px auto;
}
form > div {
  margin-bottom: 10px;
}

input[type="text"]{
  border: 1px solid orange;
  padding: 5px;
  background: #fff;
  border-radius: 5px;
}

input[type="text"]:-moz-read-only{
  border-color: #ccc;
}
input[type="text"]:read-only{
  border-color: #ccc;
}

input[type="text"]:-moz-read-write{
  border-color: #f36;
}
input[type="text"]:read-write{
  border-color: #f36;
}

::before和::after

::before::after这两个主要用来给元素的前面或后面插入内容,这两个常和content配合使用,使用的场景最多的就是清除浮动。

.clearfix::before,
.clearfix::after {
    content: ".";
    display: block;
    height: 0;
    visibility: hidden;
}
.clearfix:after {clear: both;}
.clearfix {zoom: 1;}

当然,我们还可以使用它们来实现阴影效果

.effect::before, .effect::after{
    content:"";
    position:absolute;
    z-index:-1;
    -webkit-box-shadow:0 0 20px rgba(0,0,0,0.8);
    -moz-box-shadow:0 0 20px rgba(0,0,0,0.8);
    box-shadow:0 0 20px rgba(0,0,0,0.8);
    top:50%;
    bottom:0;
    left:10px;
    right:10px;
    -moz-border-radius:100px / 10px;
    border-radius:100px / 10px;
}

上面代码作用在class名叫.effect上的div的前(before)后(after)都添加一个空元素,然后为这两个空元素添加阴影特效。

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

推荐阅读更多精彩内容