最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • [译] Chrome 浏览器的自定义状态伪类

    正文概述 掘金(半醒土豆)   2021-06-05   604

    Chrome 浏览器的自定义状态伪类

    Web 平台上的“自定义”功能越来越多,比如自定义属性(--my-property)、自定义元素(<my-element>)和自定义事件(new CustomEvent('myEvent'))。我们一度甚至还能使用自定义媒体查询 (@media (--my-media))。

    但那还没完!有个新的“自定义”功能你可能错过了,因为这篇 Google 发布的 “New in Chrome 90” 文章中并没有提到(公平地说,声明性(declarative) shadow DOM 在这次发布中占尽了风头),但是 Chrome 刚刚增加了对另一个“自定义”功能的支持:自定义状态伪类(:--my-state)。

    内置状态

    在讨论自定义状态之前,我们先快速查看下内置 HTML 元素定义的内置状态。HTML 标准的 CSS 选择器模块和“伪类”章节指定了许多可以用于匹配不同状态元素的伪类。下面提到的所有伪类都在当今的浏览器中得到了广泛的支持:

    用户操作

    类型描述
    :hover鼠标光标悬停在元素上:active该元素被用户激活:focus该元素获得焦点:focus-within该元素或者后代元素获得焦点

    定位

    类型描述
    :visited该链接之前被用户访问过:target该元素被页面的 URL 片段指定

    输入

    类型描述
    :disabled表单元素被禁用:placeholder-showninput 元素正在展示 placeholder 文本:checked复选框或单选按钮被选中:invalid表单元素的值不合法:out-of-rangeinput 元素的值超出指定范围:-webkit-autofillinput 元素的值被浏览器自动填充

    其他状态

    类型描述
    :defined该自定义元素已被注册

    自定义状态

    与内置元素类似,自定义元素也可以有不同的状态。使用自定义元素的网页可能想给这些状态设置不同的样式。自定义元素可以通过它的宿主元素的 CSS 类(class 属性)来暴露状态,但这被认为是一种反模式。

    Chrome 现在支持将内部状态添加到自定义元素的 API。这些状态通过自定义状态伪类暴露出来。例如:使用 <live-score> 元素的页面可以给这个元素自定义的 --loading 状态声明样式。

    live-score {
      /* 元素的默认样式 */
    }
    
    live-score:--loading {
      /* 新内容加载时的样式 */
    }
    

    让我们给 <labeled-checkbox> 元素添加 --checked 状态

    自定义状态伪类规范包含一个完整的代码示例。我将用这个示例解释 API。此功能的 JavaScript 部分位于自定义元素的类定义中。在构造函数中,为自定义元素创建“元素内部”对象,之后可以在 states 内部对象上设置或取消设置自定义状态。

    请注意 ElementInternals API 可确保自定义状态在元素外部只读。换句话说,元素外部不能修改自定义元素的内部状态。

    class LabeledCheckbox extends HTMLElement {
      constructor() {
        super();
    
        // 1. 创建“元素内部”对象
        this._internals = this.attachInternals();
    
        // (其他代码)
      }
    
      // 2. 设置自定义状态
      set checked(flag) {
        if (flag) {
          this._internals.states.add("--checked");
        } else {
          this._internals.states.delete("--checked");
        }
      }
    
      // (其他代码)
    }
    

    网页现在可以通过同名的自定义伪类来给自定义元素的内部状态设置样式。在我们的例子中,--checked 状态以 :--checked 伪类的形式暴露出来。

    labeled-checkbox {
      /* 默认状态下的样式 */
    }
    
    labeled-checkbox:--checked {
      /* --checked 状态下的样式 */
    }
    

    [译] Chrome 浏览器的自定义状态伪类

    用 Chrome 浏览器打开这个 demo

    此功能尚未成为标准

    过去三年来,浏览器厂商一直在讨论如何通过自定义伪类来暴露自定义元素的内部状态。Google 的自定义状态伪类规范目前托管在 WICG 名下,仍然处于一个非官方的状态。该功能由 W3C 技术架构组(TAG)进行设计审查并移交给 CSS 工作组。在 Chrome 的“出货意向”讨论中,Mounir Lamouri 写道:

    我们现在需要等待 Firefox 和 Safari 浏览器实现这个功能。对应的补丁已经以文件形式提交到 Mozilla #1588763 和 WebKit #215911,但还没有得到太多关注。



    起源地下载网 » [译] Chrome 浏览器的自定义状态伪类

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元