是的,这是可能的。
.boo {
position: relative;
width: 20em; min-height: 10em;
background: rgba(0,0,0,0) url(http://placekitten.com/320/160);
transition: background-color 1s;
}
.boo:hover {
background-color: rgba(0,0,0,.5);
}
.boo:before {
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
background-color: inherit;
content: ' ';
}
我在这里做什么?
我在这里的目的是在 div
元素的 background-image
后面设置一个 RGBa background-color
,并将此 background-color
(alpha 值)在 :hover
时进行过渡。所有这些都发生在 background-image
的“后面”。但是,我还在伪元素上使用了 background-color: inherit
,这意味着在任何给定时刻,位于其父元素 div
上方(因此在 div
的 background-image
上方)的伪元素将具有相同的 background-color
(这意味着伪元素的 background-color
将从 rgba(0,0,0,0)
过渡到 rgba(0,0,0,.5)
)。
为什么要这样做?
我之所以不直接过渡伪元素的 background-color
,是因为对于伪元素的过渡支持仍然不太好。
伪元素过渡的支持情况
✓ Firefox 支持伪元素过渡,并且已经支持了相当长一段时间,我们先把这个说清楚。
✗ 当前版本的 Safari 和 Opera 不支持伪元素过渡。
Chrome 仅从版本 26 开始支持伪元素过渡。
IE10 支持它们的方式有点奇怪,这意味着像:
.boo:before { color: blue; transition: 1s; }
.boo:hover:before { color: red; }
这样不起作用,你还需要在元素本身上指定悬停状态。像这样:
.boo:hover {}
.boo:before { color: blue; transition: 1s; }
.boo:hover:before { color: red; }
了解更多关于如何使用 inherit
技巧来转换伪元素的各种属性的信息和示例:http://vimeo.com/51897358
编辑
自从转换到 Blink 引擎以来,Opera 和 Safari 6.1 以上版本现在都支持直接在伪元素上进行过渡。
transition: background-color 1s;
。 - Andrey Mikhaylov - lolmaus