有一个 HTML 属性可以准确地执行您认为它应该执行的操作
<div>I'm visible</div>
<div hidden>I'm hidden</div>
它甚至拥有 极佳的浏览器支持。它有用吗?嗯,也许吧。实际上并没有。
Adam Laki 喜欢它的语义
如果我们使用 hidden 属性,我们的语义会稍微好一些。任何人都能理解元素上“hidden”属性的含义。
Monica Dinculescu 称之为谎言
hidden
规则是用户代理样式,这意味着它比轻微的喷嚏还不太具体。这意味着您最喜欢的display
样式将覆盖它
<style>
div { display: block; }
</style>
<div hidden>
lol guess who's not hidden anymore
hint: it's this thing
</div>
因此有两个相关的问题……
- 它非常弱。实际上,对具有任何强度选择器的元素上的
display
属性的任何更改(除了none
值之外)都将覆盖它。就像任何其他显示属性(如width
或其他属性)一样,只不过在元素上主动使用hidden
属性且它实际上并没有隐藏时,感觉有点糟糕。 display
属性不幸地承担了过多的责任。如果hidden
是一个 CSS 属性,可以负责元素的可见性/访问性,而不是控制其块类型的相同属性,那将非常酷。但唉,网络的向后兼容性永远存在(这对网络的整体健康来说是一件好事)。
如果您真的喜欢该属性的语义,Monica 建议
[hidden] { display: none !important; }
这似乎是任何“重置”或基本样式表的一个不错的补充。
否则,使用类隐藏内容的经典技术绝对没问题。我通常有一个实用程序类
.hide, .hidden {
display: none;
}
但请记住,总是有无数种方法可以完成任务。我发现自己经常使用一次性隐藏/显示机制。例如,一个菜单,您需要用炫酷的方式切换其可见性,但始终保持可访问……
.menu {
opacity: 0;
visibility: hidden;
transition: 0.2s;
transform: translateX(20px);
&[data-open] {
opacity: 1;
visibility: visible;
transform: translateX(0);
}
}
我个人最喜欢的 CSS 代码片段之一来自 CSS Remedy
如果您将其与您的
[hidden] { display: none !important; }
结合使用,那么 DOM 的隐藏/视觉隐藏状态将变得非常明显。(不过,您需要将第一行也更改为 !important)。不幸的是,
aria-hidden=false
在不同浏览器中的行为不一致,并且不被 W3C 推荐:https://www.w3.org/TR/wai-aria-1.1/#aria-hidden 不确定这是否仍然适用,但请谨慎使用。@Jace Cotton
我认为这与用于取消隐藏内容有关,而不是最初将其标记为未隐藏。
w3 网站的另一部分声称浏览器将
aria-hidden="false"
视为该属性根本不存在:https://www.w3.org/WAI/PF/aria-implementation/#mapping_state-property_table此博客声称已测试“JAWS、Window Eyes 和 NVDA(Windows)、ChromeVox(Chrome OS)、VoiceOver(iOS 和 Mac OSX)以及 Orca(Linux)及其各自的操作系统支持的浏览器”,并发现
aria-hidden="false"
没有效果:https://developer.paciellogroup.com/blog/2012/05/html5-accessibility-chops-hidden-and-aria-hidden/您忘记了此属性的副作用:它认为该元素完全不存在于 DOM 树中,因此,它也会立即对辅助工具用户隐藏该元素。屏幕阅读器会自动跳转到下一个可见元素。
使用此属性是有意义的,可以通过简单的 CSS 覆盖它(并且可以很容易地修复此覆盖性 -抱歉-),这对我来说似乎并不相关。为什么要让您的 HTML 和 CSS 发生冲突呢?
&[data-open] 的含义是什么?
我建议:
&[aria-expanded=true]
我喜欢
hidden
属性的一点是您可以通过 JavaScript 访问它。element.hidden = true;
感觉比
element.classList[state ? 'add' : 'remove']('is-open');
更自然。但是的,我将其与
[hidden] { display: none !important; }
结合使用,并且您无法在状态之间进行过渡或动画,这一点需要注意。它是用于提高特异性的 Sass 嵌套选择器 - 具有 menu 类且具有“open”data 属性的元素。它的编译 CSS 将是 .menu[data-open]
如果您想了解更多信息:https://css-tricks.org.cn/the-sass-ampersand/
您真的没有认为“hidden”是一种安全措施,是吗?它用于导航(单页面应用程序和类似功能)和视觉效果,例如隐藏不可读的人类预填充表单数据。将敏感数据放在 HTML 中的任何位置都意味着您的网站安全性存在缺陷。
没关系。我误读了。但是,我的评论可能会帮助那些完全偏离轨道的人。
精彩的文章。很喜欢。