Переходы CSS: странная нежелательная задержка в браузерах Webkit (Chrome и Safari)

Я надеялся, что кто-нибудь сможет помочь объяснить странное поведение, которое я испытываю в браузерах Webkit с нежелательными задержками в переходах CSS.

Вот ссылка на страницу, над которой я работаю: http://demo.daised.com/help-me

Желаемый результат состоит в том, чтобы строка меню сжималась, когда пользователь прокручивает страницу вниз. Это отлично анимируется в Firefox.

Однако в браузерах Webkit переход для размера шрифта элементов навигации задерживается на 6 (!) секунд.

Спасибо, что помогли мне лучше понять это.


person user3360547    schedule 27.02.2014    source источник
comment
Кажется, что Chrome выполняет переход для каждого дочернего элемента по одному, отсюда и большое ожидание. Я не уверен, что это ожидаемое поведение. Не кажется правильным...?   -  person user3360686    schedule 27.02.2014
comment
Жаль, что этот пример не был приведен в виде JSBin, контекст принятого ответа теперь отделен, поскольку оригинал не виден. Просто к сведению на будущее.   -  person Ben Everard    schedule 02.05.2017
comment
Хорошо, эта проблема от меня повторяется, но содержит JSFiddle и фрагменты кода для всех, кто заинтересован.   -  person Simon    schedule 30.04.2020


Ответы (4)


user3360686 прав, ваши переходы как-то сложены. Я не уверен, почему это происходит так, как не должно.

В любом случае то, что вы сделали в заголовке, опасно и может вызвать странное поведение:

header * {
  transition: all 0.8s;
  -moz-transition: all 0.8s; 
  -webkit-transition: all 0.8s;
  -o-transition: all 0.8s;

  transition-delay: 0.2s;
  -moz-transition-delay: 0.2s;
  -webkit-transition-delay: 0.2s;
  -o-transition-delay: 0.2s;
}

У вас в шапке около 25 элементов, к каждому из них будут применены переходы и задержки. Используйте определенные элементы для большей эффективности (и элегантности).

Использование «всех» с переходом, как правило, плохая идея, это хорошее средство для создания конфликтов. Используйте определенные свойства.

Этот быстрый и хороший ответ суммирует почти все: CSS3 , Порядок перехода на WebKit? Как поставить очередь на переходы?

person kursus    schedule 27.02.2014
comment
Спасибо за совет. - person user3360547; 28.02.2014

Проблема вызвана многоуровневыми переходами для элементов, которые наследуют свойство transition.

a, span {
  transition: 0.5s;
}

a {
  padding: 0.5em 0.75em;
  border: 1px solid red;
  color: #000;
  display: inline-block;
}

a:hover{
  color: #f00;
  background-color: #0f0;
}
<a>
  <span>Text Content</span>
</a>

The section of css a, span applies the transition to both elements. The span inherits the color from the a, but does not apply the animation color until the a has finished its animation.

Лучшим решением для приведенного выше примера было бы удалить правило для a, span и поместить transition: 0.5s; в правило для a:

a {
  transition: 0.5s;
  padding: 0.5em 0.75em;
  border: 1px solid red;
  color: #000;
  display: inline-block;
}

a:hover{
  color: #f00;
  background-color: #0f0;
}
<a>
   <span>Text Content</span>
</a>

person Lawrence_NT    schedule 13.01.2016

Я столкнулся с той же проблемой. Моя проблема заключалась в том, что я пытался передать свойства, которые изначально были унаследованы от родителя. Оказывается, браузеры Webkit (не Firefox) требуют, чтобы каждое свойство, к которому вы переходите, действительно применялось к этому элементу. Кажется, они не могут передавать свойства, которые были унаследованы.

Например, я пытался сделать это:

HTML

<div class="parent">
    <div class="child"></div>
</div>

CSS

.parent {
    color: #000;
}

.child {
    transition: background-color 0.2s ease 0s, color 0.2s ease 0s;
    border-top: 10px #000 solid;
 }

.child.active {
    border-color: #ff0000;
    color: #ff0000;
}

Firefox удалось это сделать, но это требовалось и для Chrome, и для Safari:

.child {
    transition: background-color 0.2s ease 0s, color 0.2s ease 0s;
    border-top: 10px #000 solid;
    // even though the color property is inherited,
    // webkit requires it for transitions
    color: #000;
 }
person Michael Lynch    schedule 21.04.2016
comment
отличный анализ. это решение оперативного вопроса. - person NinjaOnSafari; 01.09.2016

Другая причина нежелательных задержек связана с overflow: hidden;. Например, если у вас есть раскрывающаяся панель навигации с переключателем: когда она открыта, а max-height установлено на 1000px, а также имеет свойство CSS overflow: hidden;, переход от max-height к закрытому займет больше времени.

person Tom    schedule 27.03.2016
comment
Этот ответ фактически решил мою проблему, так как я имел дело именно с максимальной высотой. - person scott.schaffer; 19.02.2021