如何在一个元素上有多个CSS过渡?


327

这是一个非常简单的问题,但是我找不到关于CSS过渡属性的很好的文档。这是CSS代码段:

    .nav a
{
    text-transform:uppercase;
    text-decoration:none;
    color:#d3d3d3;
    line-height:1.5 em;
    font-size:.8em;
    display:block;
    text-align:center;
    text-shadow: 0 -1.5em 0 rgba(255, 255, 255, 0.15);
    -webkit-transition: color .2s linear;
    -moz-transition: color .2s linear;
    -o-transition: color .2s linear;
    transition: color .2s linear;
    -webkit-transition: text-shadow .2s linear;
    -moz-transition: text-shadow .2s linear;
    -o-transition: text-shadow .2s linear;
    transition: text-shadow .2s linear;
}

.nav a:hover
{
    color:#F7931E;
    text-shadow: 0 1.5em 0 rgba(247, 147, 30, 0.15);
}

如您所见,过渡属性相互覆盖。就目前而言,文本阴影将设置动画,但颜色将不设置动画。如何让它们同时进行动画处理?感谢您的任何答复。


不要忘了,transition: all是狩猎/ iPad的非常错误:joelglovier.com/writing/...
的OguzhanKahyaoğlu

Answers:


583

在所有支持转换的浏览器中,转换属性以逗号分隔:

.nav a {
  transition: color .2s, text-shadow .2s;
}

ease是默认的计时功能,因此您无需指定它。如果确实需要linear,则需要指定它:

transition: color .2s linear, text-shadow .2s linear;

这开始变得重复,因此,如果要在多个属性中使用相同的时间和计时功能,则最好继续使用各种transition-*属性,而不是简写形式:

transition-property: color, text-shadow;
transition-duration: .2s;
transition-timing-function: linear;

11
我认为因为转换是顺序重要的链条,所以如果您习惯使用功能链,那么语法会很不错,而转换则需要一个完全独立元素的无序列表,因此逗号是合适的
mirichan 16'Mar

1
作为对CSS过渡的一般性评论,应该记住,一个接一个的多个过渡定义将不起作用,并且要实现这一点,这些定义必须具有相同的定义(如此处的SA)。根据CSS的基本规则,“最新”规则适用,因此,如果在单独的行中有多个定义,则仅应用最后一个定义。仅供参考
-TheCuBeMan

37

您还可以简单地通过以下方式显着地:

.nav a {
    -webkit-transition: all .2s;
}

44
实际上,您可以删除“全部”,因为除非另有说明,否则这是默认设置。
joshnh 2012年

13
+1是一个很好的观点,但我认为将其保留在其中非常有用,特别是对于团队之间的一致性和理解。
XML

4
当心!如果针对移动设备进行开发,则结合硬件加速元素会使新设备出现故障,旧设备无法使用。
Ilya Karnaukhov 2014年

2
谢谢,@CanerŞahin。您能给我们提供任何文档或基准测试工具来帮助人们理解这一点吗?另外,您是否看到证据表明“全部”要比根本不使用任何说明符更糟糕?
XML

3
@XML的解释方式有两个负面影响。1,由于使用“ all”,浏览器添加了额外的资源。浏览器将仔细听该元素,以等待性能不佳的任何更改,并可能造成页面混乱。2,如果开发人员以后放入背景颜色,则可能会产生意想不到的效果,然后将背景颜色转换为预期或不需要的颜色。
Stefan Burt

29

类似以下内容将允许同时进行多个转换:

-webkit-transition: color .2s linear, text-shadow .2s linear;
   -moz-transition: color .2s linear, text-shadow .2s linear;
     -o-transition: color .2s linear, text-shadow .2s linear;
        transition: color .2s linear, text-shadow .2s linear;

示例:http//jsbin.com/omogaf/2


24

如果将所有属性设置为相同的动画,则可以分别设置每个属性,这样就不必重复代码。

 transition: all 2s;
 transition-property: color, text-shadow;

这里有更多相关信息:具有多个属性的CSS过渡简写?

我会避免使用all属性(过渡属性会覆盖“ all”),因为您最终可能会遇到不良行为和意外的性能损失。


2
.nav a {
    transition: color .2s, text-shadow .2s;
}

1

这是一个LESS mixin,用于一次转换两个属性:

.transition-two(@transition1, @transition1-duration, @transition2, @transition2-duration) {
 -webkit-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
    -moz-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
      -o-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
          transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
}

autoprefixer更好!
重写

自动前缀+手写笔FTW。
杰森·莱登


0

也可以避免完全指定属性。

#box {
  transition: 0.4s;
  position: absolute;
  border: 1px solid darkred;
  bottom: 20px; left: 20px;
  width: 200px; height: 200px;
  opacity: 0;
}

#box.on {
  opacity: 1;
  height: 300px;
  width: 500px;
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.