html - :read-only 伪元素所针对的非禁用复选框
问题描述
我正在尝试理解一个困扰我一段时间的问题,现在。
我想知道为什么复选框会被伪元素作为目标:read-only
,即使没有该disabled
属性。
请参阅下面的片段:
input:read-write + label {
background-color: green;
}
input:read-only + label {
background-color: red;
}
<!-- an active ( not disabled ) checkbox -->
<input type="checkbox" id="checkbox" />
<label for="checkbox">the checkbox</label>
<br />
<br />
<!-- a disabled text -->
<input type="text" disabled id="text"/>
<label for="text">the text</label>
<br />
<br />
<!-- an active ( not disabled ) text -->
<input type="text" id="text-active"/>
<label for="text-active">another text</label>
如您所见,复选框和第一个文本输入都是 的目标input:read-only
,即使只有第一个文本输入具有该disabled
属性。
我做了一些研究,发现了这篇关于这个主题的文章:
:read-only 是一个 CSS 伪类选择器,它匹配任何不匹配 :read-write 选择器的元素。
自然地,我随后对:read-write
伪选择器进行了研究,并最终进入了mdn 网络文档页面,其中指出:
:read-write CSS 伪类表示用户可编辑的元素(例如 input 或 textarea)。
我觉得,因为我可以切换复选框的值,它应该被认为是“用户可编辑”?
我在某些浏览器中进行了一些测试,Firefox ( 90.0 ) 和 Brave ( v. 1.27.109 Chromium: 92.0.4515.115 ) 都出现了问题。
我还在旧版 chrome(版本 89.0.4389.90)中进行了测试,但行为并不相同。两个元素都不受:read-only
伪元素的影响,第二个文本字段受到read-write
伪元素的影响,即使有disabled
属性也是如此。奇怪的。
也许我错过了一些明显的东西?
解决方案
我找到了为什么会发生这种行为。
根据HTML 标准
:read-only 伪类必须匹配所有其他 HTML 元素。
在这里,所有其他 HTML 元素是指该:read-write
属性不适用的 html 元素。
在同一页面上,我们可以看到定义了:read-write
-able的 html 元素。
:read-write 伪类必须匹配属于以下类别之一的任何元素,因此对于选择器而言,这些类别被认为是用户可更改的:
应用了 readonly 属性并且是可变的输入元素(即没有指定 readonly 属性并且没有被禁用)
没有 readonly 属性且未被禁用的 textarea 元素
正在编辑主机或可编辑的元素,既不是输入元素也不是文本区域元素
此处的相关部分是适用于 readonly 属性的输入元素。如果我们检查HTML 标准页面的 checkboxes,我们可以看到该readonly
属性确实不适用。
以下内容属性不得指定且不适用于元素:accept、alt、autocomplete、dirname、formaction、formenctype、formmethod、formnovalidate、formtarget、height、list、max、maxlength、min、minlength、multiple、pattern、占位符、只读、大小、src、步长和宽度。
:read-write
这使得该复选框属于无法应用该属性的 html 元素的类别。Hense 原始问题片段的行为。
虽然这并没有解释如何绕过这种行为(参见ADITYA 的回答),但它解释了它发生的原因,这是我最初感兴趣的部分。
作为附加说明,我仍然不确定为什么背景颜色:read-only
在 Chrome 89 中不起作用。
推荐阅读
- azure - 如何将 Azure 资源注册为 Azure Active Directory 中的应用程序?
- java - 在我的代码中实现可切换功能的适当方式?
- python-3.x - Colab AttributeError 中的 RAPIDS:模块“cudf”没有属性“_lib”
- angular -
: 未声明为可写或没有设置器 - bash - 使用 numfmt 来回转换数字时的不同数字
- flutter - Flutter:将数据从一个文件转移到另一个文件
- google-oauth - Google openID 客户端 userinfo 端点提供的 G Suite 自定义字段
- kotlin - 如何使用来自 kotlin 的第三方 jar 中的 internal 关键字访问类?
- python - Python非标准日期时间分组/选择
- node.js - “jest --watch”:错误:ENOSPC:已达到文件观察者数量的系统限制,请观看