CSS样式-伪类 含:where(),:is(),:has())

:before

帮当前元素内部增加一个放置在最前面的子元素,一般用于在列表前面增加装饰条或圆点之类。


<ul>
    <li>内容1</li>
    <li>内容2</li>
</ul>
<style>
    li:before {
        content: "";
        display: inline-block;
        width: 8px;
        height: 8px;
        border-radius: 50%;
    }
</style>

:after

类似before,帮当前元素内部增加一个放置在最后面的子元素,一般用于清除浮动样式导致的错位。


<ul>
    <li>内容1</li>
    <li>内容2</li>
</ul>
<span>后续内容不会重叠</span>
<style>
    li {
        float: left;
        width: 50%;
    }

    ul:after {
        content: "";
        display: block;
        clear: both;
    }
</style>

:hover

若鼠标悬停在当前元素上则样式生效,一般用于按钮,链接,自动下拉菜单或者其他扩展显示内容的用途。
要注意触发方式在手机上体现的效果变成了只要点击过就会保持生效,直到你点击其他元素。


<button>鼠标悬停在按钮上将改变样式</button>
<style>
    button {
        background: black;
    }

    button:hover {
        background: red;
    }
</style>

:focus

若当前元素被聚焦,则样式生效,例如点击了按钮或者输入框,则当前元素被视为聚焦状态,直到点击其他元素或者网页外的内容。

一般用于点击搜索栏后,将输入框扩大使之显眼、显示历史热词提示等。

<input type="text"/>
<style>
    input[type=text]:focus {
        border: 2px solid black;
    }
</style>

:active

若当前元素被点击则样式在点击期间生效,用于例如按钮被点击后临时的变色或发光等,效果类似:hover的点击版:


<button>点击按钮时将改变样式</button>
<style>
    button {
        background: black;
    }

    button:hover {
        background: yellow;
    }
</style>

:visited

只对a标签有作用,若a标签上的href属性定义的网址已经被客户端访问过、有历史记录或缓存时,样式生效。

现在用途一般是将效果设置为与通常样式一致即可(不设置的话浏览器会自动修改颜色导致正常状态与浏览过的链接颜色不一致),例如:

a, a:visited {
    color: red;
}

:root

该伪类会作用于根元素(html中根元素即是标签),以下示例将根节点文字颜色改为红色:

:root {
    color: red;
}

但一般不会直接设置样式,而是配合--variablevar(--variable)语法用于提供全局作用域定义变量给其他样式值调用:

:root {
    --theme-color: red;
}

.main-theme-color {
    color: var(--theme-color);
}

.main-bg-color {
    background: var(--theme-color);
}

:not()

不存在括号里的条件时,样式生效,例如:


<div class="container">
    <p class="content"></p>
</div>
<style>
    .container :not(.title) {
        border-top: 1px solid #000
    }
</style>

由于.container所在的元素里没有被.title样式装饰的元素,因此:not样式会作用于.container元素

:is()

与not相反,当前元素满足括号里的选择条件时,样式生效:

.container:is(.loading, .waiting, .error, .tip) {
    background: yellow;
}

要注意用逗号隔开是[OR或者]的意思,即只要满足一个选择器要求即可。
注意此伪类优先级比一般写法要高,例如以下这种写法的样式即使放在:is()之后也无法覆盖掉原有的样式。

.container.loading,
.container.waiting,
.container.error,
.container.tip {
    background: red;
}

:where()

当前元素满足括号里的选择条件时,样式生效,一般用于作为父元素条件来定义子元素样式,例如判断当元素是否存在括号里任意一个父元素:


<div class="container">
    <h1 class="title">这是大标题</h1>
    <ul class="wrapper">
        <li class="title">这是小标题</li>
        <li class="item">这是内容</li>
    </ul>
</div>
<div class="contain">
    <h1 class="title">这是大标题</h1>
</div>
<style>
    :where(.container, .contain, .wrapper) .title {
        color: red;
    }
</style>

:has()

当前元素的子元素满足括号里的选择条件时,样式生效,一般用于子元素可能不存在的情况,例如判断元素是否存在标题子元素:


<div class="container">
    <h1 class="title">拥有此样式名将使样式生效</h1>
</div>
<style>
    .container:has(.title) {
        background: grey
    }
</style>

伪元素的作用是解决简单的CSS键值结构难以定义的各种动态关联,但是滥用伪元素也很容易造成修改困难,需要按照抽象思维的方式仔细考虑方可使用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿卢说他遇到阿玮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值