码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何使用CSS伪类选择器


    总览

    CSS选择器允许你通过类型、属性、位于HTML文档中的位置来选择元素。本教程阐述了三个新选项:is()、:where()和:has()。

    选择器通常在样式表中使用。下面的示例会找到所有

    段落元素并将字重更改为粗体:

    p {
      font-weight: bold;
    }
    

    你也可以在JavaScript中使用选择器来找到DOM节点:

    • document.querySelector()返回首个匹配的HTML元素。
    • document.querySelectorAll()返回所有匹配的HTML元素,这些元素位于类数组NodeList中。

    伪类选择器根据HTML元素的当前状态来定位它们。也许最广为人知的是 :hover,它在光标移到一个元素上时应用样式,所以它被用来高亮可点击的链接和按钮。

    其他受欢迎的选项包括:

    • :visited:匹配访问过的链接
    • :target:匹配文档URL所指向的元素
    • :first-child:指向第一个子元素
    • :nth-child:选择指定子元素
    • :empty:匹配没有内容或子元素的元素
    • :checked:匹配已勾选的复选框或单选按钮
    • :blank:选择用户输入为空的输入框
    • :enabled:匹配一个被启用的输入框。如果一个元素能够被激活(如选择、点击或接受文本输入),或者能够获取焦点,则该元素是启用的
    • :disabled:匹配一个被禁用的输入框。在被禁用时,元素不能被激活或获取焦点
    • :required:指向必填的输入框。所谓必填,就是在提交所属表单之前,用户必须为输入框指定一个值
    • :valid:匹配一个内容验证正确的输入框
    • :invalid:匹配一个内容未通过验证的输入框
    • :playing:指向一个正在播放的audio或video元素

    浏览器最近又收到了三个伪类选择器…

    :is伪类选择器

    注意:这最初被指定为:matches()和:any(),但:is()已经成为CSS标准。

    MDN解释::is()CSS伪类函数将选择器列表作为参数,并选择该列表中任意一个选择器可以选择的元素。这对于以更紧凑的形式编写大型选择器非常有用。

    你经常需要在不止一个元素上面应用相同的样式。比如说,

    段落文本颜色默认为黑色,但是当它位于

    ,
    ,
    里面时,文本颜色为灰色:

    /* default black */
    p {
      color: #000;
    }
    
    /* gray in 
    ,
    , or
    */ article p, section p, aside p { color: #444; }

    这是一个简单的例子,但更复杂的页面将导致更复杂和更冗长的选择器字符串。任何选择器的语法错误都会破坏所有元素的样式。

    像Sass这样的CSS预处理器允许嵌套(这也将出现在原生CSS中)。

    article, section, aside {
    
      p {
        color: #444;
      }
    
    }
    

    这可以创建相同的CSS代码,减少打字的工作量,并可以防止错误。但是:

    • 在原生嵌套到来之前,你仍需要一个CSS构建工具。你可能想使用像Sass这样的方案,但这可能给一些开发团队引入复杂性。
    • 嵌套可能会导致其他问题。构建深度嵌套的选择器是很容易的,但它会变得越来越难以阅读以及输出冗长的CSS。

    :is() 提供了一个原生CSS解决方案。该特性已被所有现代浏览器支持(IE除外)。

    :is(article, section, aside) p {
      color: #444;
    }
    

    单个选择器可以包含任意数量的:is()伪类。比如说,下面的复杂选择器将绿色文本颜色应用于所有

    、

    和

    元素,这些元素是

    的子元素,其包含类.primary或.secondary,并且不是
    的第一个子元素。

    article section:not(:first-child):is(.primary, .secondary) :is(h1, h2, p) {
      color: green;
    }
    

    没有 :is() 的同等代码需要六个CSS选择器。

    article section.primary:not(:first-child) h1,
    article section.primary:not(:first-child) h2,
    article section.primary:not(:first-child) p,
    article section.secondary:not(:first-child) h1,
    article section.secondary:not(:first-child) h2,
    article section.secondary:not(:first-child) p {
      color: green;
    }
    

    注意,:is()无法匹配::before和::after伪元素,因此下面示例代码会不起作用:

    /* NOT VALID - selector will not work */
    div:is(::before, ::after) {
      display: block;
      content: '';
      width: 1em;
      height: 1em;
      color: blue;
    }
    

    :where伪类选择器

    :where()选择器语法与:is()相同,也被所有现代浏览器支持(IE除外)。这往往会导致相同的样式。比如:

    :where(article, section, aside) p {
      color: #444;
    }
    

    不同点在于优先级。优先级是用来决定哪个CSS选择器应该覆盖所有其他选择器的算法。在下面的例子中,article p比单独的p更加具体,因此所有位于

    内的p元素的字体颜色将会是灰色:

    article p { color: #444; }
    p { color: #000; }
    

    在:is()的情况下,优先级是在其参数中找到的最具体的选择器。在:where()的情况下,优先级为零。

    考虑下面的CSS:

    article p {
      color: black;
    }
    
    :is(article, section, aside) p {
      color: red;
    }
    
    :where(article, section, aside) p {
      color: blue;
    }
    

    让我们将这个CSS应用到下面的HTML中:

    <article>
      <p>paragraph textp>
    article>
    

    段落文本将被渲染为红色,点击链接查看CodePen示例。

    :is()选择器与article p具有相同的优先级,但它在样式表的后面,所以文本变成了红色。如有必要可以同时删除article p和:is()选择器来应用蓝色,因为:where()选择器的优先级比两者都低。

    更多的代码库会使用:is()而不是:where()。然而,:where()的零优先级对CSS重置来说是很实用的,它在没有特定样式的情况下应用标准样式的基线。通常情况下,重置会应用一个默认的字体、颜色、内边距和外边距。

    这个CSS重置代码对

    标题应用了1em的上外边距,除非它们是
    元素的首个子元素。

    /* CSS reset */
    h2 {
      margin-block-start: 1em;
    }
    
    article :first-child {
      margin-block-start: 0;
    }
    

    试图在样式表的后面设置一个自定义的

    上外边距是没有效果的,因为article :first-child有更高的优先级:

    /* never applied - CSS reset has higher specificity */
    h2 {
      margin-block-start: 2em;
    }
    

    你可以用一个更高优先级的选择器来解决这个问题,但这需要更多的代码,而且对其他开发者来说不并不明显。你最终会忘记你为什么需要它。

    /* styles now applied */
    article h2:first-child {
      margin-block-start: 2em;
    }
    

    你也可以通过对每个样式应用!important来解决这个问题,但请避免这样做!它使进一步的样式定义和开发变得更具挑战性。

    /* works but avoid this option! */
    h2 {
      margin-block-start: 2em !important;
    }
    

    一个更好的选择是在你的CSS重置中采用:where()的零优先级。

    /* reset */
    :where(h2) {
      margin-block-start: 1em;
    }
    
    :where(article :first-child) {
      margin-block-start: 0;
    }
    

    现在,你可以覆盖任何CSS重置样式,无论其优先级如何;不需要进一步的选择器或!important:

    /* now works! */
    h2 {
      margin-block-start: 2em;
    }
    

    :has()伪类选择器

    :has()选择器使用了类似于:is()和:where()的语法,但它的目标是一个包含其他元素的元素。比如说,这里是为任何包含一个或多个或

    标签的链接添加蓝色、两像素宽的边框的CSS:

    /* style the  element */
    a:has(img, section) {
      border: 2px solid blue;
    }
    

    这是几十年来最激动人心的CSS进展!开发者们终于有了一种针对父元素的方法。

    难以捉摸的"父选择器"一直是人们请求最多的CSS特性之一,但它给浏览器供应商带来了性能上的麻烦。因此,它已经即将到来了很长时间。简而言之:

    • 浏览器在页面上绘制元素时将CSS样式应用于该元素。因此,在进一步添加子元素时,整个父元素必须重新绘制。
    • 在JavaScript中添加、删除或修改元素可能会影响整个页面的样式,直到闭合的 标签为止。

    假设供应商已经解决了性能问题,:has()的引入允许过去没有JavaScript就不可能实现的成为可能。例如,当任何必填的内部字段没有校验通过时,你可以设置外部表单

    和下面的提交按钮的样式。

    /* red border when any required inner field is invalid */
    fieldset:has(:required:invalid) {
      border: 3px solid red;
    }
    
    /* change submit button style when invalid */
    fieldset:has(:required:invalid) + button[type='submit'] {
      opacity: 0.2;
      cursor: not-allowed;
    }
    

    form-fields.png

    这个例子添加了一个导航链接子菜单指示器,其中包含一个子菜单项的列表:

    /* display sub-menu indicator */
    nav li:has(ol, ul) a::after {
      display: inlne-block;
      content: ">";
    }
    

    或者,你可以添加调试样式,比如高亮显示所有没有内部img的

    元素。

    /* where's my image?! */
    figure:not(:has(img)) {
      border: 3px solid red;
    }
    

    missing-image.png

    在打开你的编辑器和重构你的CSS代码库之前,请注意:has()是很新的,支持比:is()和:where()更有限。它在Safari 15.4+和Chrome 105+可用,但是到2023年应该可以广泛使用。

    总结

    :is() 和 :where() 伪类选择器简化了 CSS 语法。你对嵌套和CSS预处理器的需求会减少。

    :has()更具革命性和令人激动。父级选择将迅速流行起来,我们将忘记黑暗时代。

    以上就是本文的所有内容,如果对你有所帮助,欢迎点赞收藏转发~

  • 相关阅读:
    【flask进阶】Flask实现自定义分页(python web通用)
    【Java分享客栈】我有一个朋友,和前端工程师联调接口被狠狠鄙视了一番。
    大一学生Web课程设计 红酒美食主题网页制作(HTML+CSS+JavaScript)
    gpgcheck介绍
    牛客月赛c(简单推理,以及对set的灵活运用)
    驱动开发:内核LDE64引擎计算汇编长度
    时序数据库 TimescaleDB 安装与使用
    利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读
    基于Prometheus生态的集群化监控指标收集应用系统
    rm The parameter list is too long argument list too long
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16639217.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号