Как сделать несколько переходов 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/…
Огужан Кахяоглу

Ответы:

584

Свойства переходов разделяются запятыми во всех браузерах, которые поддерживают переходы:

.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;
coreyward
источник
11
Я полагаю, потому что преобразование - это цепочка, в которой порядок важен, поэтому синтаксис будет приятным, если вы привыкли к функциональной цепочке, тогда как для перехода требуется неупорядоченный список полностью независимых элементов, поэтому запятые уместны
mirichan
1
В качестве общего комментария о переходах в CSS следует иметь в виду, что наличие нескольких определений переходов одно за другим не будет работать, и для достижения этого они должны быть в том же определении (как в SA здесь). По основным правилам CSS применяется «последнее» правило, поэтому, если в отдельных строках есть несколько определений, будет применяться только последнее определение. К вашему сведению
TheCuBeMan
37

Вы также можете просто значительно:

.nav a {
    -webkit-transition: all .2s;
}
XML
источник
44
Вы можете фактически удалить «все», так как это значение по умолчанию, если не указано иное.
Joshnh
13
+1 за отличный балл, но я думаю, что это полезно, чтобы сохранить его, особенно для последовательности и понимания между командами.
XML
4
Остерегайтесь этого! Если разработка для мобильных телефонов, в сочетании с элементами аппаратного ускорения, делает новые устройства затруднительными, а старые устройства непригодными для использования.
Илья Карнаухов
2
Спасибо, @ CanerŞahin. Можете ли вы дать нам какую-либо документацию или инструменты для сравнительного анализа, которые помогут людям понять этот момент? Кроме того, вы видите доказательства того, что «все» хуже, чем вообще не использовать спецификатор?
XML
3
@XML Как это было объяснено, есть два негативных эффекта. 1, браузер добавляет дополнительные ресурсы из-за использования «все». Браузер будет внимательно прислушиваться к этому элементу, ожидая каких-либо изменений, которые менее производительны и могут создать скачки страницы. 2. Может создавать неожиданные эффекты, если разработчик позже добавляет цвет фона, который затем будет изменен, что может не ожидаться или не потребоваться.
Стефан Берт
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 (свойство transition перезаписывает 'all'), так как это может привести к нежелательному поведению и неожиданному снижению производительности.

Кори Янг
источник
2
.nav a {
    transition: color .2s, text-shadow .2s;
}
LocoRoco
источник
1

Вот LESS миксин для перехода двух свойств одновременно:

.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.
Джейсон Лидон
1

Можно сделать множество переходов с разными значениями длительности, задержки и функции синхронизации. Для разделения разных переходов используйте,

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/

Неша Зорич
источник
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;
 }
jerblack
источник