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

这是一个非常简单的问题,但是我找不到关于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);
}

正如您所看到的,转换属性正在相互覆盖。现在,文本阴影会动画化,但颜色不会。我如何让他们同时动画?谢谢你的回答。

401701 次浏览

下面的代码允许同时进行多个转换:

-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

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

.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;

编辑:我在犹豫是否要删除这篇文章。作为理解CSS语法的问题,人们知道all的存在是很好的,有时它可能比一百万个单独的声明更可取,这取决于你的CSS的结构。另一方面,它五月有一个性能惩罚,尽管我还没有看到任何数据支持这个假设。现在,我就不谈这个问题了,但我希望人们知道这是一个混合的袋子。

原来的帖子:

你也可以简单地显着:

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

FWIW:如果没有指定all是隐含的,所以transition: .2s;会让你到达相同的地方。

下面是一个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;
}
.nav a {
transition: color .2s, text-shadow .2s;
}

如果你让所有的属性动画相同,你可以分别设置每个,这将允许你不重复代码。

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

这里有更多关于它的信息:CSS转换与多个属性速记?

我将避免使用属性all (transition-property会覆盖'all'),因为您可能最终会出现不想要的行为和意想不到的性能损失。

这是可能的,使多个过渡设置不同的值持续时间,延迟和定时功能。要分割不同的过渡,请使用,

button{
transition: background 1s ease-in-out 2s, width 2s linear;
-webkit-transition: background 1s ease-in-out 2s, width 2s linear; /* Safari */
}

参考:https://kolosek.com/css-transition/

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

#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;
}

Sass中,你可以使用下面的代码来实现

@mixin transition($transitions...) {
$unfoldedTransitions: ();
@each $transition in $transitions {
$unfoldedTransitions: append($unfoldedTransitions, unfoldTransition($transition), comma);
}
  

-webkit-transition: $unfoldedTransitions;
transition: $unfoldedTransitions;
}


@function unfoldTransition ($transition) {
// Default values
$property: all;
$duration: .2s;
$easing: null; // Browser default is ease, which is what we want
$delay: null; // Browser default is 0, which is what we want
$defaultProperties: ($property, $duration, $easing, $delay);


// Grab transition properties if they exist
$unfoldedTransition: ();
@for $i from 1 through length($defaultProperties) {
$p: null;
@if $i <= length($transition) {
$p: nth($transition, $i)
} @else {
$p: nth($defaultProperties, $i)
}
$unfoldedTransition: append($unfoldedTransition, $p);
}


@return $unfoldedTransition;
}
// Usage:   @include transition(width, height 0.3s ease-in-out);

所有功劳归于tobiasahlin https://gist.github.com/tobiasahlin < / p >