Сокращение перехода CSS с несколькими свойствами?

Кажется, я не могу найти правильный синтаксис для сокращения перехода CSS с несколькими свойствами. Это ничего не делает:

.element {
  -webkit-transition: height .5s, opacity .5s .5s;
     -moz-transition: height .5s, opacity .5s .5s;
      -ms-transition: height .5s, opacity .5s .5s;
          transition: height .5s, opacity .5s .5s;
  height: 0;
  opacity: 0;
  overflow: 0;
}
.element.show {
  height: 200px;
  opacity: 1;
}

Я добавляю шоу-класс с помощью javascript. Элемент становится выше и заметен, он просто не переходит. Тестирование в последних версиях Chrome, FF и Safari.

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: Чтобы быть ясным, я ищу сокращенную версию, чтобы уменьшить мой CSS. Достаточно раздуты со всеми приставками вендоров. Также расширен пример кода.


person Gregory Bolkenstijn    schedule 12.03.2012    source источник
comment
Проверьте эту документацию. developer.mozilla.org/en/CSS/CSS_transitions   -  person websymphony    schedule 12.03.2012
comment
Вы действительно меняете значения высоты и непрозрачности? В противном случае они не меняются   -  person yunzen    schedule 12.03.2012
comment
Я не слишком разбираюсь в переходах CSS - предназначены ли двойные значения .5s после opacity?   -  person BoltClock    schedule 12.03.2012
comment
В документации не приводится пример использования сокращенной версии с несколькими свойствами. Высота изменяется от 0 до 200 пикселей, непрозрачность от 0 до 1. Вторые 0,5 с - это задержка перехода непрозрачности. Я хочу, чтобы элемент увеличивался в высоту, и когда это будет завершено, увеличьте его.   -  person Gregory Bolkenstijn    schedule 12.03.2012
comment
Ах да, значение задержки.   -  person BoltClock    schedule 12.03.2012


Ответы (6)


Синтаксис:

transition: <property> || <duration> || <timing-function> || <delay> [, ...];

Обратите внимание, что длительность должна предшествовать задержке, если она указана.

Отдельные переходы объединены в сокращенные объявления:

-webkit-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-moz-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-o-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;

Или просто переместите их все:

-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;

Вот простой пример. Вот еще один со свойством задержки.


Изменить: здесь ранее были указаны совместимость и известные проблемы, касающиеся transition. Удалено для удобства чтения.

Итог: просто используйте это. Природа этого свойства не нарушает работу всех приложений, и в настоящее время совместимость во всем мире значительно превышает 94%.

Если вы все еще хотите быть уверены, обратитесь к http://caniuse.com/css-transitions

person Community    schedule 12.03.2012
comment
Вы пробовали это? У меня это не работает. Я также не могу использовать свойство all, так как у меня задержка по второму свойству. - person Gregory Bolkenstijn; 12.03.2012
comment
Он работает в Chrome 17, Firefox 10, Safari 5. Нет возможности попробовать IE прямо сейчас :(. Вот jsfiddle: jsfiddle.net/remibreton/qAxnK - person Rémi Breton; 12.03.2012
comment
Я обновил jsfiddle для работы с задержками: jsfiddle.net/remibreton/qAxnK/1 - person Rémi Breton; 12.03.2012
comment
Кажется, это работает, я загляну в свой проект и посмотрю, смогу ли я заставить его работать. Спасибо. - person Gregory Bolkenstijn; 13.03.2012
comment
Есть ли какие-либо последствия для производительности / памяти / других аспектов использования all вместо перечисления конкретных свойств? Например, если я планирую перейти только на background и color - лучше ли мне указать оба или просто использовать all? Кроме того, учитывая, что IE6-9 не поддерживает переходы, а IE10 поддерживает их без префиксов, есть ли какие-либо преимущества / недостатки включения директив ms-transition:? - person mattstuehler; 15.01.2013
comment
При переносе всех свойств, а не только одного, которое вам нужно, определенно сказывается влияние на производительность. Это может нанести серьезный ущерб, если у вас есть много элементов, передающих все свойства одновременно. Насчет ms-transition, я не знаю ни одной причины, теперь, когда IE10 отсутствует, почему кто-то все еще будет использовать ms-transition вместо стандартного transition. И то, и другое не вызовет никаких проблем, но это, особенно в таблице стилей с большим количеством переходов, приведет к раздуванию вашего CSS. Что еще более важно, размер файла также пострадает. - person Rémi Breton; 15.01.2013
comment
Большое спасибо, очень полезно - person Farzan Balkani; 15.04.2013
comment
У меня была такая же проблема, и оказалось, что использование transition: opacity 1s .5s, max-height .5s 0 не работало, в то время как transition: opacity 1s .5s, max-height .5s 0s было. Впервые я вижу единицу, необходимую для нулевого значения в css! - person mlarcher; 06.05.2013
comment
Стоит отметить, что использование «все» медленнее, чем указание конкретных свойств. - person Nathan; 20.05.2014

Если у вас есть несколько определенных свойств, которые вы хотите преобразовать таким же образом (потому что у вас также есть некоторые свойства, которые вы специально не хотите преобразовывать, скажем opacity), другой вариант - сделать что-то вроде этого (префиксы для краткости опущены):

.myclass {
    transition: all 200ms ease;
    transition-property: box-shadow, height, width, background, font-size;
}

Второе объявление отменяет all в сокращенном объявлении над ним и делает (иногда) более сжатый код.

/* prefixes omitted for brevity */
.box {
    height: 100px;
    width: 100px;
    background: red;
    box-shadow: red 0 0 5px 1px;
    transition: all 500ms ease;
    /*note: not transitioning width */
    transition-property: height, background, box-shadow;
}

.box:hover {
  height: 50px;
  width: 50px;
  box-shadow: blue 0 0 10px 3px;
  background: blue;
}
<p>Hover box for demo</p>
<div class="box"></div>

Демо

person Jason    schedule 14.06.2013
comment
Это полезно! Не только из-за переопределения transition-property, но и потому, что, например, transition-delay необходимо указать после сокращения (по крайней мере, в webkit). Другими словами, сокращение подразумевает transition-delay 0 и установку отдельной задержки до того, как сокращение вернет ее к 0. - person duncanwilcox; 21.07.2013
comment
@duncanwilcox вы можете использовать transition: [props] [duration] [easing] [delay] в любом современном браузере - person Jason; 24.10.2013
comment
Предпочитаю этот ответ НАМНОГО больше, чем принятый ответ. - person Erutan409; 26.07.2017
comment
прекрасный! очень нравится подход! - person wasddd_; 09.10.2018

Я заставил это работать с этим:

.element {
   transition: height 3s ease-out, width 5s ease-in;
}
person Haydar C.    schedule 19.04.2018
comment
Это то, что я искал - сокращение для нескольких свойств. Спасибо! - person Adam Moisa; 12.10.2018

Имея задержку 0,5 с при переходе свойства непрозрачности, элемент будет полностью прозрачным (и, следовательно, невидимым) все время, пока изменяется его высота. Так что единственное, что вы действительно увидите, - это изменение непрозрачности. Таким образом, вы получите тот же эффект, что и оставив свойство высоты вне перехода:

"переход: непрозрачность .5s .5s;"

Вы этого хотите? Если нет, и вы хотите видеть переход высоты, у вас не может быть нулевой непрозрачности в течение всего времени перехода.

person J.B.    schedule 03.04.2015
comment
Это тоже не работает, так как высота останется 0 во время перехода непрозрачности. - person Xesau; 06.08.2015

Это помогло мне понять / оптимизировать только то, что мне нужно было анимировать:

// SCSS - Multiple Animation: Properties | durations | etc.
// on hover, animate div (width/opacity) - from: {0px, 0} to: {100vw, 1}

.base {
  max-width: 0vw;
  opacity: 0;

  transition-property: max-width, opacity; // relative order
  transition-duration: 2s, 4s; // effects relatively ordered animation properties
  transition-delay: 6s; // effects delay of all animation properties
  animation-timing-function: ease;

  &:hover {
    max-width: 100vw;
    opacity: 1;

    transition-duration: 5s; // effects duration of all aniomation properties
    transition-delay: 2s, 7s; // effects relatively ordered animation properties
  }
}

~ Это относится ко всем свойствам перехода (длительность, функция времени перехода и т. Д.) В классе .base.

person gav_aus_web    schedule 20.05.2020

Я думаю, что это должно сработать:

.element {
   -webkit-transition: all .3s;
   -moz-transition: all .3s;
   -o-transition: all .3s;
   transition: all .3s;
}
person Thomas Lamothe    schedule 05.09.2015