在:after/:before伪类中实现CSS过渡属性的动画效果

34

是否可能对 CSS 伪类进行动画效果?

比如我有这样的代码:

#foo:after {
    content: '';
    width: 200px;
    height: 200px;
    background: red;
    display: block;
    -webkit-transition: all 1s ease-in-out;
    -moz-transition: all 1s ease-in-out;
    -o-transition: all 1s ease-in-out;
}

#foo:hover:after {
    width: 250px;
    height: 250px;
}

这个有可能吗?我一直在测试,但迄今为止似乎找不到解决方案。 我正在尝试通过使用Modernizr减少所需的JavaScript支持。

我已经有一个JavaScript方法了,所以请不要提供JavaScript替代方案。

演示http://jsfiddle.net/MxTvw/


好问题。你正在使用 ::after元素做什么? - Ry-
@minitech 不管我用它做什么,这个上下文不会改变它是否能工作。我已经有了一个JS注入div等的替代方案,但我想,如果我不需要使用JS,为什么要使用它呢?这就是神奇的Modernizr ;) - daryl
不,我的意思是“显然它不起作用,所以可能有一种更好的CSS3替代方案,你不知道而已” :) - Ry-
这个问题基本上是我正在做的最简化解释,我需要悬停来使伪元素动画化,不确定是否有替代方案?哈哈 - daryl
这个与 WebKit 相关的 bug 已于昨天修复:http://trac.webkit.org/changeset/138632 - Jonathan Marzullo
4个回答

12

谷歌Chrome在版本27.0.1453.110 m中加入了WebKit的错误修复。

这个WebKit的错误已经被修复:http://trac.webkit.org/changeset/138632

可以对伪元素:before:after进行动画处理,以下是关于动画处理:before:after的一些示例。

在你上面的示例上进行修改后,对其进行编辑,使其在悬停时不需要模拟的mouseleave/mouseout延迟更平滑地进出:

http://jsfiddle.net/MxTvw/234/

尝试在第二个:hover伪类规则中添加主选择器#foo和分组:hover伪类。还要添加transition属性,而不仅仅是供应商特定的前缀属性,来设置transition

#foo:after{
   display: block;
   content: '';
   width: 200px;
   height: 200px;
   background: red;
   -webkit-transition: all .4s ease-in-out;
   -moz-transition: all .4s ease-in-out;
   -o-transition: all .4s ease-in-out;
   transition: all .4s ease-in-out;
} 

#foo,
#foo:hover:after,
#foo:hover:before{
   width: 250px;
   height: 250px;
}

请注意,从现在开始,任何伪元素如 :before:after 都应该使用双冒号语法 ::before::after。本示例利用悬停时的覆盖 background-colorbackground-image 模拟淡入淡出效果:

http://jsfiddle.net/MxTvw/233/

本示例模拟了一个旋转动画的效果:

http://jsfiddle.net/Jm54S/28/

当然,如果遵循 CSS3 标准,我们可以使用 ::before::after

此方法适用于最新版的 Firefox、Chrome、Safari、Opera 18+、IE10 和 IE11(IE9 及以下版本不支持 CSS3 transitions 或 animate)。


伪类不是伪元素。引入双冒号语法的整个目的就是为了让人们不会混淆这两者。哦,而且这已经被建议很多次了,但在WebKit中都不起作用。 - BoltClock
这个 WebKit 的 bug 修复已经在最新版的 Chrome 中添加了:版本号为 27.0.1453.110 m - 很不错! - Jonathan Marzullo
@Benjamin 感谢你的提醒... 它在 Opera 18+ 中可以工作.. Opera 在版本18中切换了它们的渲染引擎,现在使用webkit。Opera 18+及以上版本支持动画::before和::after伪元素,就像Google Chrome一样。 - Jonathan Marzullo
-ms-transition 前缀在任何稳定版本的 IE 中都未被使用,应将其删除(一开始没有出现是有原因的)。未加前缀的声明应放在最后。 - BoltClock
@BoltClock 我改变了顺序..删除了毫秒,感谢..我的回答是在2012年写的..所以很抱歉我的回答有一些微软当时推荐的旧方法..关于属性的顺序..我没有看到厂商前缀和标准属性的顺序有任何不同,当您的带前缀的属性只包含一个值时。但如果属性有多个值,则我注意到顺序对具有多个值的属性很重要..但我同意你说的非前缀属性应该最后出现..但感谢你的反馈 :) - Jonathan Marzullo
显示剩余3条评论

12

在Firefox中,您的fiddle对我有效。据我所知,并且如果这篇文章是最新的,则这是唯一可以动画化伪元素的浏览器。


编辑:截至2016年,文章链接已损坏,相关的WebKit bug4年前修复。请继续阅读其他答案,此答案已过时。


你知道现代浏览器是否支持动画的检测方法吗? - daryl
如果我正确理解现代浏览器检测库 Modernizr 的工作原理,它会测试元素样式对象中的属性。要测试伪元素,您需要一种获取伪元素样式对象的方法,但我认为这不可能。但是我可能(也希望)错了。如果是这样,请有人纠正我。 - Litek
1
这个与WebKit相关的bug已于昨天修复:http://trac.webkit.org/changeset/138632 - Jonathan Marzullo
@mik01aj,现在可以在这里找到链接。 - syoels

0

-3

我刚刚发现你可以为 :after 和 :before 添加动画效果 (:

代码示例-

  .model-item {
    position: relative;

    &:after {
      content: '';
      position: absolute;
      width: 100%;
      height: 100%;
      top: 0;
      right: 0;
      background: transparent;
      transition: all .3s;
    }
  }

  .opc {
    &:after {
      content: '';
      position: absolute;
      width: 100%;
      height: 100%;
      top: 0;
      right: 0;
      background: rgba(0, 51, 92, .75);
    }
  }

我有一个名为.model-item的div,我需要对它的:after进行动画处理。 因此,我添加了另一个类来更改背景,并将过渡代码添加到主要的:after(在动画之前)。

同样适用于Chrome浏览器。 - Netanel Perez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接