六、CSS3的高级选择器

一、本课目标

  • 层次选择器
  • 结构伪类选择器
  • 属性选择器

二、层次选择器

层次选择器

2.1后代选择器

语法:body p{background:red}
示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body p{
            background: red;
        }
    </style>
</head>
<body>
    <p class="active">1</p>
    <p>2</p>
    <p>3</p>
    <ul>
        <li>
            <p>4</p>
        </li>     <li>
            <p>5</p>
        </li>     <li>
            <p>6</p>
        </li>
    </ul>
</body>
</html>

此时上面的这段代码的结构如下:


image.png

最终在浏览器中的结果如下:


image.png

在结果中,可以看到:所有的body下面的直接的、间接的p标签都变成了红色的,那就证明这个后代选择器选择的是所有的p标签,包括子,包括孙。

注:后代选择器两个选择符之间必须要以空格隔开,中间不能有任何其他符号插入。同时这个地方跟span标签的选择有相同之处,但要注意后代选择器的第二个选择器不能瞎定义,必须是这个软件里面有的标签。

推广代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Review2</title>
    <style>
        body p span{
            background: red;
        }
    </style>
</head>
<body>
<p class="active">
    <span>1</span>
</p>
<p><span>23</span>2</p>
<p>3</p>
<ul>
    <p><span>4</span></p>
    <p>5</p>
</ul>
<span>6</span>

</body>
</html>

示例结果:

image.png

分析:这个选择器的意思是body下面的所有直接间接p标签下面的span标签,而6的那一行,因为不在p标签里面,所以不会变色。(body p.active span,这个的意思是body下面的所有直接间接的类名是active的p标签,如果改变为这个的话,1和4会变红,23则不会变红了。)

2.2子选择器

示例代码一

语法:body>p{background:pink;}
实例代码还是如上,但是有一个地方改变:

 <style>
        body>p{
            background: red;
        }
    </style>

此时的运行结果如下:


image.png

分析:此时可以看到在最终的结果中只有直接的p标签的颜色发生了改变。

实例代码二

对子选择器做一下推广:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Review2</title>
    <style>
        body>p span{
            background: red;
        }
    </style>
</head>
<body>
<p class="active">
    <span>1</span>
</p>
<p><span>23</span>2</p>
<p>3</p>
<ul>
    <p class="active"><span>4</span></p>
    <p>5</p>
</ul>
<span>6</span>

</body>
</html>

结果如下:

image.png

分析:这个选择器的body下面的直接p标签下面的span标签才会变色,间接的p标签或者没在p标签下面的span标签都不行。(body>p.active span的意思是body下面的直接实现了avtive的p标签下面的span标签)。

注:包不包活间接的标签就是后代选择器和子选择器的区别。

2.3相邻兄弟选择器

语法:active+p{background:green;}
示例代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
      .active+p{
          background: green;
      }
    </style>
</head>
<body>
    <p>1</p>
    <p class="active">2</p>
    <p>3</p>
    <ul>
        <li>
            <p>4</p>
        </li>     <li>
            <p>5</p>
        </li>     <li>
            <p>6</p>
        </li>
    </ul>
</body>
</html>

最终的结果如下:


image.png

分析:因为设置的是body下面的p标签,而在程序结果中,ul不算是p的兄弟元素,另外两个p才是这个p的兄弟元素,但是也不是所有的p兄弟元素都会被选中,只有这个p的下一个p才会被选中。同时当我把class属性设置到第三个p标签上的时候,结果如下:


image.png

此时并没有任何的p标签会被选中并改变颜色。

2.4通用兄弟选择器

语法:.active~p{background:yellow}
实例代码的三种情况如下:
第一种情况:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Review2</title>
    <style>
       .active~p{
           background: red;
       }
    </style>
</head>
<body>
<p>0</p>
<p class="active"><span>1</span></p>
<p><span>2</span>3</p>
<p>4</p>
<ul>
    <p>5</p>
    <p class="active"><span>6</span></p>
    <p>7</p>
    <p>8</p>
</ul>
<span>9</span>

</body>
</html>

此时的运行结果:


image.png

第二种情况:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
      .active~p{
          background: green;
      }
    </style>
</head>
<body>
    <p>1</p>
    <p class="active">2</p>
    <p>3</p>
    <ul>
        <li>
            <p>4</p>
        </li>     <li>
            <p>5</p>
        </li>     <li>
            <p>6</p>
        </li>
    </ul>
</body>
</html>

此时运行结果如下:


image.png

第三中情况:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
      .active~p{
          background: green;
      }
    </style>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p class="active">3</p>
    <ul>
        <li>
            <p>4</p>
        </li>     <li>
            <p>5</p>
        </li>     <li>
            <p>6</p>
        </li>
    </ul>
</body>
</html>

运行结果如下:


image.png

结果分析:这个选择器跟上一个选择器的区别在于,这个选择器是目标标签后面的所有标签,而上一个标签只是目标标签后面的下一个标签。当目标标签后面没有标签的时候,则不会有任何的标签会被选中,包括其前面的标签。

三、结构伪类选择器

结构伪类选择器的内容:

image.png

分析:这个表的主要问题在第一个到底是个什么意思?其实,第一个选择器是说所有的父元素下面的第一个E元素,只要是某个(不确定)父元素下面的第一个元素并且这个元素是E,那这个元素就会被选中。
示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        p:first-child{
            background: red;
        }
        ul li:nth-child(2){
            background: green;
        }
    </style>
</head>
<body>
<p>p1</p>
<p>p2</p>
<p>p3</p>
<div>
   <p>p</p>
    <div>
        <p>p</p>
    </div>
    <p>
        <p>p</p>
    </p>
</div>
<ul>
    <li>li1</li>
    <li>li2</li>
    <li>li3</li>
</ul>
</body>
</html>

运行结果:


image.png
image.png

但是这个地方的疑问在于最后一个p标签为什么没有被选中?理论上应该被选中的。
示例:


image.png

上面代码的结构如下:
image.png

前三个示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
       p:first-child{
           background: red;
       }
       ul li:nth-child(2){
            background: green;
        }
    </style>
</head>
<body>
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
     <ul>
         <li>li1</li>
         <li>li2</li>
         <li>li3</li>
     </ul>
</body>
</html>

运行结果如下:


image.png

后三个示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        p:first-child{
            background: red;
        }
        p:first-of-type{
              background: blue;
          }
    </style>
</head>
<body>
    <h2>mmp</h2>
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
     <ul>
         <li>li1</li>
         <li>li2</li>
         <li>li3</li>
     </ul>
</body>
</html>

结果:


image.png

此时可以看出,是蓝色。
当我把style里面第二个p注释掉了以后:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        p:first-child{
            background: red;
        }
    /*      p:first-of-type{
              background: blue;
          }*/
    </style>
</head>
<body>
    <h2>mmp</h2>
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
     <ul>
         <li>li1</li>
         <li>li2</li>
         <li>li3</li>
     </ul>
</body>
</html>

结果如下:


image.png

分析:可以发现颜色并没有发生改变。这里就可以看出来两者的区别:

  • first-child:父级里面第一个子元素的p元素。这个标签的位置和标签类型是定死的。首先在这个位置上,其次还要是我这个类型的标签才能生效。
  • first-of-type:父级里面第一个类型是p的元素。这个标签只有类型是定死的,然后我就去找相对应的位置就行了。

因为在上面这段代码中,p的父元素是body,body的第一个子元素是h2,h2里面并没有p元素,所以first-child失效了。
同时,像下面这样:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        p:first-child{
            background: red;
        }
    /*      p:first-of-type{
              background: blue;
          }*/
    </style>
</head>
<body>
    <h2>mmp
        <h3>df</h3>
        <p>s</p>
    </h2>
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
     <ul>
         <li>li1</li>
         <li>li2</li>
         <li>li3</li>
     </ul>
</body>
</html>

输出结果:


image.png

也是失效的,只有当在h2元素中p元素作为第一个子元素出现的时候,才会生效。

两者的区别:


image.png

四、属性选择器

image.png

4.1E[attr]属性选择器

语法:a[id]{background:yellow;}
示例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        a[id]{
            background: red;
        }
    </style>
</head>
<body>
<p class="demo">
    <a href="" class="" id="first">1</a>
</p>

</body>
</html>

结果:


image.png

4.2E[attr=first]属性选择器

语法:a[id=first]{background:yellow;}
示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        a[id=first]{
            background: red;
        }
    </style>
</head>
<body>
<p class="demo">
    <a href="" class="" id="first">1</a>
    <a href="" class="" id="second">2</a>
</p>

</body>
</html>

结果:


image.png

4.3E[atr^=val]属性选择器

语法:a[id^=http]{background:yellow;}
属性代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        a[id^=fir]{
            background: red;
        }
    </style>
</head>
<body>
<p class="demo">
    <a href="" class="" id="first:1">1</a>
    <a href="" class="" id="first:2">2</a>
    <a href="" class="" id="second">3</a>
</p>

</body>
</html>

运行结果:


image.png

4.3E[atr$=val]属性选择器

语法:a[id$=http]{background:yellow;}
示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        a[id$=t]{
            background: red;
        }
    </style>
</head>
<body>
<p class="demo">
    <a href="" class="" id="first:1">1</a>
    <a href="" class="" id="first:2t">2</a>
    <a href="" class="" id="secondt">3</a>
</p>

</body>
</html>

运行结果:


image.png

4.4E[atr*=val]属性选择器

语法:a[id*=http]{background:yellow;}
示例代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>

        a[id*=con]{
            background: red;
        }
    </style>
</head>
<body>
<p class="demo">
    <a href="" class="" id="first:1">1</a>
    <a href="" class="" id="first:2t">2</a>
    <a href="" class="" id="secondt">3</a>
</p>

</body>
</html>

运行结果:

image.png

五、总结

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

推荐阅读更多精彩内容