【发布时间】:2019-08-07 19:38:45
【问题描述】:
考虑以下 JavaScript、CSS 和 HTML 代码:
console.log(getComputedStyle(document.querySelector('p'), '::after').getPropertyValue('content'));
p::after {
content: "Hello" attr(data-after);
}
<p data-after=" World"></p>
Firefox 和 IE11 都返回 CSS 中定义的原始值:"Hello" attr(data-after),这正是我所需要的。
但是 Chrome 会返回 "Hello World",解析后的值。
当我使用 Chrome DevTools 检查元素时,我可以看到它在“样式”面板中显示以下信息:
p::after {
content: "Hello" attr(data-after);
}
所以看起来 Chrome 仍然有能力知道原始值。
是否有任何 JavaScript 解决方案可以让 Chrome 像 Firefox 和 IE11 一样返回 CSS 中定义的原始值?就算是 Chrome 独有的方法也可以,只要能在 JavaScript 中使用即可。
情况说明
针对某位会员提问的原因,情况如下:
我正在尝试在伪元素上为 CSS speak: never 创建一个“polyfill”。目前任何浏览器都不支持speak property。
CSS 伪元素可以被屏幕阅读器读取,但目前无法轻松地从屏幕阅读器中隐藏它们。解决这个问题的常用方法是使用 HTML 代码,例如 <span aria-hidden="true">...</span>,而不是方便的 CSS 伪元素和 speak: never,在我看来,这种方法既不方便,也令人失望。
所以这个 polyfill 主要是关于 web 可访问性的。
这个 polyfill 的工作原理需要 CSS 开发人员编写一些额外的 CSS 代码作为指标,例如 attr(speak-never):
p::after {
content: "please make me inaudible" attr(speak-never);
}
然后在 JavaScript 中,polyfill 循环遍历页面上的每个元素,并检查其伪元素 ::before 和 ::after 的 CSS content 属性值是否包含 attr(speak-never)。如果找到该指标字符串,则 polyfill 修复伪元素(通过以编程方式添加自定义元素 <before aria-hidden="true">...</before> 和 <after aria-hidden="true">...</after>)。
现在的问题是 Chrome 无法在 JavaScript 中返回上述attr(speak-never)。虽然 polyfill 也可以通过要求 CSS 开发人员再添加一个指示器来工作,例如 Chrome 的 --speak: never,但 polyfill 最好让 CSS 开发人员的工作尽可能简单,并且不需要额外的 --speak: never 指示器。
这就是创建这个问题的原因。
更新
我决定改用counter-reset: speak-never 作为指示器,因为它可以被所有浏览器用 JavaScript 读取。
【问题讨论】:
标签: javascript css google-chrome pseudo-element