Префикси на браузъра като променливи чрез @each sass

Планирали сме много анимации и търсим по-чист начин за справяне с всички браузъри. Нещо нахално като това би било страхотно:

@each $browser in '-webkit-', '-moz-', '-o-', '-ms-' {
  @#{$browser}keyframes rotate {
    from { #{$browser}transform: rotate(0deg);}
    to { #{$browser}transform: rotate(360deg);}
  }
}

С изключение на това, че @#{$vendor}keyfr... създава грешка, очаквайки число или функция след @. Има ли начин да принудите @ да премине към css?

В противен случай някой измислил ли е по-чист начин да постигне това с @each, @mixin или нещо друго, което би спестило изброяването на всяка анимация за всеки браузър (т.е. по-долу)?

@-webkit-keyframes rotate {
  from { -webkit-transform: rotate(0deg);}
  to { -webkit-transform: rotate(360deg);}
}

@-moz-keyframes rotate {
  from { -moz-transform: rotate(0deg);}
  to { -moz-transform: rotate(360deg);}
}

@-o-keyframes rotate {
  from { -o-transform: rotate(0deg);}
  to { -o-transform: rotate(360deg);}
}

@-ms-keyframes rotate {
  from { -ms-transform: rotate(0deg);}
  to { -ms-transform: rotate(360deg);}
}

person cormiston    schedule 16.11.2013    source източник
comment
Ако използвате Compass: stackoverflow.com/a/17621055/557612 Лично аз предпочитам да използвам autoprefixer във фаза на последваща обработка.   -  person steveax    schedule 17.11.2013


Отговори (2)


Можете да направите това с миксин, където предварително дефинирате ключовите кадри на доставчика, вместо динамично генериране на доставчиците в цикъл. Може би нещо в този дух:

@mixin keyframes($animationName) {
    @-webkit-keyframes #{$animationName} {
        $browser: '-webkit-'; @content;
    }
    @-moz-keyframes #{$animationName} {
        $browser: '-moz-'; @content;
    }
    @-o-keyframes #{$animationName} {
        $browser: '-o-'; @content;
    }
    @keyframes #{$animationName} {
        $browser: ''; @content;
    }
} $browser: null;

@include keyframes('rotate') {
    from { #{$browser}transform: rotate(0deg);}
    to { #{$browser}transform: rotate(360deg);}
}

ДЕМО

person Martin Turjak    schedule 17.11.2013
comment
Чудесно решение! За да се съобразим с новия синтаксис 3.4, трябва да добавим !global към локални версии на $browser вътре в миксин: sassmeister.com /gist/7ed6237f0e7f0aa89935 За съжаление, няма да работи в SASS преди 3.3 (но работи в libsass 2.0!) - person bonflash; 07.10.2014

Само за да продължат модовете...

http://sassmeister.com/gist/554597ba07c49dbd92ce

@include makeKeyframes('badgeGlow') {
  from { @include box-shadow(0px 0px 10px rgba($glowToColor, 0.3), 0px 1px 2px rgba(0, 0, 0, .80));color:$glowBaseColor;border-color: $glowBaseColor;}
  50% { @include box-shadow(0px 0px 16px rgba($glowToColor, 0.8), 0px 1px 2px rgba(0, 0, 0, .80));color:white;border-color: lighten($glowBaseColor, 20);}
  to { @include box-shadow(0px 0px 10px rgba($glowToColor, 0.3), 0px 1px 2px rgba(0, 0, 0, .80));color:$glowBaseColor;border-color: $glowBaseColor;}
}

button.glow {
  @include setKeyframeType('badgeGlow',1.5s,infinite);
}

Имайте предвид, че извиквате генератора на keyFrame веднъж и можете да препращате към ключовите кадри от всяко друго място във вашите класове с миксина setKeyframeType и да предоставите някои основни параметри. Страхотно, когато имате много елементи, които могат да споделят един и същи тип преходи.

person beauXjames    schedule 16.05.2014