【问题标题】:How to have multiple CSS transitions on an element?如何在一个元素上有多个 CSS 过渡?
【发布时间】:2011-10-26 06:33:24
【问题描述】:

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

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

如您所见,过渡属性正在相互覆盖。就目前而言,文本阴影将动画,但不是颜色。我如何让它们同时制作动画?感谢您的任何回答。

【问题讨论】:

标签: animation css css-transitions


【解决方案1】:

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

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

【讨论】:

  • 我假设因为 transform 是一个顺序很重要的链,所以如果你习惯于函数链,语法会感觉很好,而转换需要完全独立元素的无序列表,所以逗号是合适的跨度>
  • 作为关于 CSS 中的过渡的一般评论,应该记住,一个接一个地拥有多个过渡定义是行不通的,为了实现这一点,这些定义必须在相同的定义中(如这里的 SA)。根据 CSS 的基本规则,“最新”规则适用,因此如果在不同的行中有多个定义,则只会应用最后一个定义。仅供参考
【解决方案2】:

编辑:我很纠结是否要删除这篇文章。作为理解 CSS 语法的问题,人们知道all 的存在是一件好事,而且有时它可能比一百万个单独的声明更可取,这取决于你的 CSS 的结构。另一方面,它可能有性能损失,尽管我还没有看到任何支持该假设的数据。现在,我会留下它,但我希望人们意识到这是一个混合包。

原帖:

您也可以简单地使用:

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

FWIW:all 如果未指定则隐含,因此transition: .2s; 会将您带到同一个地方。

【讨论】:

  • 除非另有说明,否则您实际上可以删除“全部”,因为这是默认设置。
  • +1 是一个很好的观点,但我认为将其保留在那里是有用的,特别是对于跨团队的一致性和理解。
  • 当心这个!如果为移动设备开发,结合​​硬件加速元素,会使新设备出现故障,旧设备无法使用。
  • 谢谢,@CanerŞahin。您能给我们提供任何有助于人们理解这一点的文档或基准测试工具吗?另外,您是否看到证据表明“全部”比完全不使用说明符更糟糕?
  • @XML 解释它的方式有两个负面影响。 1、浏览器由于使用了'all'而增加了额外的资源。浏览器将密切监听该元素,等待任何性能较低的更改并可能造成页面卡顿。 2,如果开发人员稍后放入背景颜色,然后会进行过渡,这可能会产生意想不到的效果,这可能不是预期的或不需要的。
【解决方案3】:

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

-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

【讨论】:

    【解决方案4】:

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

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

    这里有更多关于它的信息:CSS transition shorthand with multiple properties?

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

    【讨论】:

      【解决方案5】:
      .nav a {
          transition: color .2s, text-shadow .2s;
      }
      

      【讨论】:

        【解决方案6】:

        可以使用不同的持续时间、延迟和计时功能值设置多个转换。要拆分不同的转换,请使用,

        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/

        【讨论】:

          【解决方案7】:

          这是一个 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;
          }
          

          【讨论】:

          • 自动前缀更好!
          • 自动前缀 + 手写笔 FTW。
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-05-25
              • 1970-01-01
              • 2012-05-29
              • 2013-07-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多