前几天我经历了一个 **非常尴尬的** CSS 时刻。
我正在处理一个设计的前端代码,该设计有一个狭窄的图标侧边栏。那里没有足够的空间来显示图标的文本,所以我们的想法是使用可访问的(但默认情况下视觉隐藏的)文本,这些文本已经存在于“长悬停”上的 **工具提示** 中。也就是说,带光标的设备,以及光标悬停在元素上一段时间,比如三秒钟。
所以,我的想法是这样的…
- 我可以使用 **状态**:工具提示要么 **可见**,要么 **不可见**。我将管理状态,这将在 DOM 中表现为 HTML 元素上的类名。
- 然后我将处理更改该状态的 **逻辑**。
- **默认** 状态将为 **不可见**,但如果鼠标在元素内停留超过三秒钟,我将切换状态为 **可见**。
- 如果鼠标曾经离开元素,状态将保持(或变为) **不可见**。
这是一个 React 项目,所以状态只是 *浮现在脑海中*。结果是这样的
还不错,对吧?嗯。在 JavaScript 中管理状态可能会打开一些大门,但在这种情况下,这完全是过犹不及。除了我认为 mouseenter
和 mouseleave
有点挑剔之外,CSS 就可以完成整个事情,而且代码更少。
这就是尴尬的部分… 当我正在编写的 CSS 已经可以处理时,为什么我要向上到达 JavaScript 库来做这件事呢?
我将保留 React 中的 UI,但 **移除所有状态管理内容**。我将做的只是在 .icon
为 :hover
时添加 transition-delay: 3s
,以便在 *不* 悬停时为零秒,然后在鼠标光标离开时立即消失)。
长悬停在 CSS 中基本上是一行代码
.thing {
transition: 0.2s;
}
.thing:hover {
transition-delay: 3s; /* delay hover animation only ON, not OFF */
}
效果很好。
这里没有解决的一个问题是触摸屏问题。你可以说屏幕阅读器对可访问文本没问题,桌面浏览器也因为自定义工具提示而没问题,但使用纯触摸屏的用户可能无法发现图标标签。在我的情况下,我是在构建一个大型屏幕场景,假设有光标,但我认为触摸屏并非完全没有希望。如果元素是一个链接,:hover
可能会在首次点击时触发。如果链接带你到一个带有清晰标题的地方,这可能就足够了。你也可以随时回到更多的 JavaScript 并处理触摸事件。
如果你不关心样式,难道不能直接使用
title
属性吗?是的,你可以。正如你提到的,没有样式控制,也没有计时控制。而且它也不能解决任何可访问性问题或触摸屏问题。
谢谢 Chris,我假设因为它的年代久远,它对屏幕阅读器和触摸设备来说是可访问的。把它归档到“今天我学到了…”
提醒一下,
title
属性 *是* 可访问的;事实上,它构成出现在该属性的元素的“可访问名称”,除非有其他属性 (aria-label
或aria-labelledby
) 覆盖它。我认为 Chris 可能指的是其他一些可访问性问题(也许是某些浏览设备缺乏悬停支持?)。
有趣的是,我们获得的知识越多,越容易过度思考。
CSS 本质上很简单,但很棘手,但 JS 很火爆,为什么不试试呢,对吧?
我有一些来自后端的 JS 开发朋友,他们完全鄙视 CSS 的力量。另一方面,作为一名出生于视觉设计的 前端开发人员,CSS 就如同我的早餐。我们最近几次就 CSS x JS 展开了一些富有成效的讨论。
归根结底,我们只需要保持简单 :)
感谢你的反思,Chris
我在考虑触摸设备上的悬停状态,并想出了这个:https://codepen.io/petergoes/pen/BaQezGm
我
* 将 div 更改为按钮
* 为它添加了 role=”presentational”
* 复制了 :hover css 并将其添加到 :active
* 移除过渡延迟
这样,触摸设备就可以在按下按钮时显示工具提示。
它并不完美,但也许是一个朝着正确方向迈出的步伐?
我一直想做一个这样的悬停功能,但一直没有找到方法。感谢你的分享!
也许将悬停代码包装在
@media (hover: hover) {
}
这样触摸设备就不会受到影响
很容易忘记基础知识。我发现参与某种主题论坛通常对自己非常有益,因为我会不断地回答初学者问题,然后这些问题就会在我的脑海中保持清晰。
这就是“React 疫情”,没有人想学习 CSS,社区也不鼓励学习,事实上,通过 JSX 的样式替代方案的持续支持,它被阻止了,结果,我们编写的代码每次都越来越慢。代码全球化是巨大的,但我们却在以更大的方式倒退。
每次你们看到类似这样的内容
链接
我们不仅编写了 3 个不需要的组件,这些组件需要初始化并在幕后触发 10 多个函数,而且我们还通过建议这将是一个可接受的解决方案,而实际上存在一个完美的 CSS 解决方案,该解决方案可能涉及 5 个属性,几乎没有开销,但不幸的是,人们太懒了/害怕学习它。
那边那个链接应该是
我编写了一个小型脚本(和 CSS),它将“title”属性转换为更漂亮的工具提示,并且还支持自定义延迟
https://github.com/yairEO/title-tooltip
此解决方案旨在与任何框架或其他内容无关。只需导入脚本和 CSS,然后忘记它 :)
你可以在我最近创建的一个网站上看到它的实际效果,我专门为它创建了这个脚本,然后将其开源
https://future-fortune.com