CSS3之伪类选择器

268 阅读4分钟

这是我参与更文挑战的第15天,活动详情查看:更文挑战

前两天学习了关于CSS选择器的一些知识点,对于伪类选择器感觉还是一知半解,遂查询网上资料学习,特此进行总结。

关于伪类选择器,其实就是匹配确定状态的元素,也就是在特定状态下才能呈现对应的样式。其他选择器的话可以看这篇《一次性搞懂CSS的选择器》

1、链接伪类:作用域链接元素

:visited:表示作为超链接,指向一个已经访问过的地址的所有锚

a:visited {
  color: red;
}

当鼠标点击超链接之后,该a标签会变成红色。

:link:表示超链接指向一个未访问的地址的所有锚

a:link {
  color: hotpink;
}

鼠标还没被访问超链接的时候是粉色。

:target :表示跳转到某个片段,其中id是URI的片段标识符

此时的target要对应id。比如我们通过:target实现一个简单的选项卡

简单CSS选项卡demo:

首先书写html代码,注意此时的a标签href要对应内容div的id。

<body>
    <a href="#left">选项卡left</a>
    <a href="#middle">选项卡middle</a>
    <a href="#right">选项卡right</a>
    <div id="left">内容left</div>
    <div id="middle">内容middle</div>
    <div id="right">内容right</div>
</body>

然后我们先把内容的三个div隐藏起来,

    div {
        width: 275px;
        height: 200px;
        display: none;
    }

接着使用:target

    :target {
         display: block;
    }

当我们点击选项卡a标签的时候,注意看URI,会加上id,

image.png

然后点击的这个选项卡的内容通过display会显示出来。效果如下:

CSS实现选项卡demo.gif

这样一个简单的纯CSS实现的选项卡就做好了,但是这个还是有一点缺陷,就是默认的时候选项卡没有内容,需要我们点击某个选项才会显示。因为默认情况下所有的div都是隐藏起来的。如果大家有想到什么好的办法解决的话欢迎指正我~~

具体代码👇:

<body>
    <a href="#left">选项卡left</a>
    <a href="#middle">选项卡middle</a>
    <a href="#right">选项卡right</a>
    <div id="left">内容left</div>
    <div id="middle">内容middle</div>
    <div id="right">内容right</div>
</body>
<style>
    * {
        margin: 0;
        padding: 50px;
    }
    
    a {
        text-decoration: none;
        color: indigo;
        border: 1px gray solid;
        padding: 10px;
        margin: 10px;
    }
    
    a:link {
        color: black;
    }
    
    a:visited {
        color: gray;
    }
    
    div {
        width: 275px;
        height: 200px;
        background-color: green;
        display: none;
        text-align: center;
        font: 30px/200px "微软雅黑";
        margin-top: 30px;
        margin-left: 10px;
    }
    
     :target {
        display: block;
    }
</style>

2、动态伪类

:hover 表示悬浮到元素上

    a:hover {
       color: black;
    }

当鼠标移到元素上时,元素颜色会变成黑色。

:active 表示用户点击时的状态

    a:hover {
       color: green;
    }

当鼠标点击元素上时,元素颜色会变成绿色。

此处还需要注意,由于a标签的:link和:visited可以覆盖了所有a标签的状态,所以当:link,:visited,:hover,:active都作用在a标签时,:link和:visited不能放在最后。我们知道,当有同样的选择器的时候,后面的会覆盖前面的。

另外,对于:visited选择器,出于隐私,只有color,background-color,border-color才该可以改动,不信大家可以尝试一下。

3、表单伪类:

:enabled 匹配可编辑的表单

:disable 匹配被禁用的表单

:checked 匹配被选中的表单

:focus 匹配获焦的表单

    <span>可编辑的表单</span>
    <input id="input1" type="text" />
    <br/>
    <span>被禁用的表单</span>
    <input id="input2" type="text" disabled/>
    <br/>
    <span>聚焦的表单</span>
    <input id="input3" type="text" />
    <br/>
    <span>被选中的表单</span>
    <input id="input4" type="checkbox" />
    <br/>
     #input1:enabled {
        background-color: green;
    }
    
    #input2:disabled {
        background-color: yellow;
    }
    
    #input3:focus {
        background-color: pink;
    }
    
    #input4:checked {
        width: 100px;
        height: 100px;
    }

演示效果👇

伪类.gif

有时候原始的单选按钮样式不满足我们的需求时,我们可以通过表单伪类来实现自定义单选按钮。

- 自定义单选按钮demo

    <label>
      <input type="radio" name="abaaba">
      <span></span>
    </label>
    <label>
      <input type="radio" name="abaaba">
      <span></span>
    </label>
    <label>
      <input type="radio" name="abaaba">
      <span></span>
    </label>
   * {
        margin: 0;
        padding: 0;
    }
    
    label {
        float: left;
        position: relative;
        width: 50px;
        height: 50px;
        border: red 2px solid;
        overflow: hidden;
        border-radius: 50%;
    }
    
    label>span {
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        right: 0;
    }
    
    input {
        position: absolute;
        left: -50px;
        top: -50px;
    }
    
    input:checked+span {
        background-color: firebrick;
    }

实现效果如下👇

自定义单选按钮.gif

4、结构性伪类

:nth-child(n)

首先n是从1开始的数,n=1,2,3,4

比如下面这段代码:

    <div class="container">
        <ul>
            <p>p标签</p>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
    </div>

可以看到在ul当中有很多li,并且前面还有个p标签。 再看看我们这个伪类选择器

    ul li:nth-child(1) {
        font-size: 60px;
    }

代表在ul标签下,选中第一个元素,并且这个元素必须是li,样式才会生效。而现在在ul标签下第一个元素并不是li,而是p标签。所以这段代码不会生效。

image.png

如果我们换成li:nth-child(2),代表ul下的第二个元素必须是li,才会生效,可以看到确实生效了。

image.png

:nth-of-type(n)

:nth-of-type(n) 代表找到父元素底下的子元素,并且选中第一个该元素的子元素。

同样的,我们按照刚刚那段代码,

    ul li:nth-of-type(1) {
        font-size: 60px;
    }

那么现在这个样式就可以越过P标签,有效了。

image.png

:first-child

代表选中第一个子元素。

    ul :first-child {
        font-size: 60px;
    }

image.png

:last-child

代表选中最后一个元素。

    ul :last-child {
        font-size: 60px;
    }

image.png

那么对伪类选择器就总结到这里啦~如有问题欢迎批评指出。