用 CSS 的伪类 hover 轻易实现 js 的 mouseover/mouseout 功能

原来做过一个在 html 表格中,当鼠标悬停在某行时,该行出行操作按钮,其他行的操作按钮隐藏。那时候的实现思想是当 onmouseover 在某行时,循环所有行,全隐藏掉按钮,再显示该行的。偶尔还得用下 onmouseourt 事件,现在想来这种实现会很影响页面效率的。

前几日看 WordPress 的后台列表,对相应记录的操作也使用了该功能,鼠标停在哪一行就只出现该行的可操作按钮,曾以为是用 js 实现的,看到要隐现的元素是 <div class="row-actions">edit|trash...</div>,还在 js 文件里搜索过 row-actions 字符串。忙了一会儿才把目光转移到了 css 中找实现,在 wp-admin/css/wp-admin.css 中找到像下面的样式:

原来它是用 css 的 hover 伪类来实现了平常想用 js 来实现的功能。从前只知道像 hover、link、visited 和 active 这样的伪类只能应用到 a 标签,即要写成 a:hover、a:link、a:visited、a:active。其实这四个玩意是可以应用到其他的 html 标签、指定给其他定义的 class 上。

有关于 CSS 伪类可参考:http://www.w3school.com.cn/css/css_pseudo_classes.asp

像 link、visited 和 active 好像不能用来作较好的动态效果,而 hover 就不一样了,它本身就暗含了 onmouseover/onmouseout 这样一种行为,就是鼠标悬停时应用某个样式,而鼠标离开时不应用某个样式。通过这一伪类便无需用 js 的事件来判断切换 css 了。

下面来看个对 hover 伪类的完整的应用,如下 html 代码:

上面代码执行的效果就是,鼠标停在表格中的哪一行,哪行才会显示出操作按钮来。注意要隐现的操作按钮是放在 class="row-actions" 中的,留意 tr:hover 的控制。

最后强调一下,如果把第一行: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 这个 DTD 声明去掉,也不会有鼠标悬停哪行才显示 <div class="row-action"> 中内容的效果,其实是 IE 的要求,甚至只给个声明,如 <!DOCTYPE>,IE 就满足,可以出效果来,在其他浏览器中不用 <!DOCTYPE ... 这段声明都行。

本文链接 https://yanbin.blog/css-a-hover-js-over-out/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments