CSS-переходы не работают при назначении через JavaScript - PullRequest
27 голосов
/ 21 ноября 2011

У меня большая головная боль при попытке применить переходы CSS3 к слайд-шоу через JavaScript.

В основном JavaScript получает все слайды в слайд-шоу и применяет классы CSS к нужным элементам, чтобы получить хорошийанимированный эффект, если нет поддержки переходов CSS3, он просто применяет стили без перехода.

Теперь моя «маленькая» проблема.Все работает как положено, все слайды получают правильные стили, код работает без ошибок (пока).Но указанные переходы не работают, даже если применяются правильные стили.Кроме того, стили и переходы работают, когда я сам применяю их через инспектора.

Так как я не мог найти логическое объяснение сам, я думал, что кто-то здесь может ответить на него, довольно пожалуйста?Мы собрали небольшой пример того, что код сейчас: http://g2f.nl/38rvma Или используйте JSfiddle (без изображений): http://jsfiddle.net/5RgGV/1/

Ответы [ 3 ]

48 голосов
/ 21 ноября 2011

Чтобы заставить transition работать, должны произойти три вещи.

  1. элемент должен иметь явно определенное свойство, в этом случае: opacity: 0;
  2. элемент должен иметь определенный переход: transition: opacity 2s;
  3. новое свойство должно быть установлено: opacity: 1

Если вы назначаете 1 и 2 динамически, как в вашем примере, должна быть задержка до 3, чтобы браузер мог обработать запрос.Причина, по которой он работает при отладке, заключается в том, что вы создаете эту задержку, шагая через нее, давая браузеру время на обработку.Задержите присвоение .target-fadein:

window.setTimeout( function() { slides[targetIndex].className += " target-fadein"; }, 100 ); 

или вставьте .target-fadein-begin непосредственно в ваш HTML, чтобы он анализировался при загрузке и был готов к переходу.

Добавление transitionэлемент не запускает анимацию, а изменение свойства.

Демо: http://jsfiddle.net/ThinkingStiff/QNnnQ/

HTML:

<div id="fade1" class="fadeable">fade 1 - works</div>
<div id="fade2">fade 2 - doesn't work</div>
<div id="fade3">fade 3 - works</div>

CSS:

.fadeable {
    opacity: 0;
}

.fade-in {
    opacity: 1;
    transition:             opacity 2s;
        -moz-transition:    opacity 2s;
        -ms-transition:     opacity 2s;
        -o-transition:      opacity 2s;
        -webkit-transition: opacity 2s;
}

Сценарий:

//works
document.getElementById( 'fade1' ).className += ' fade-in';

//doesn't work
document.getElementById( 'fade2' ).className = 'fadeable';
document.getElementById( 'fade2' ).className += ' fade-in';

//works
document.getElementById( 'fade3' ).className = 'fadeable';
window.setTimeout( function() {

    document.getElementById( 'fade3' ).className += ' fade-in';

}, 100);
5 голосов
/ 13 августа 2015

Обмани двигатель раскладки!

function finalizeAndCleanUp (event) {
    if (event.propertyName == 'opacity') {
        this.style.opacity = '0'
        this.removeEventListener('transitionend', finalizeAndCleanUp)
    }
}
element.style.transition = 'opacity 1s'
element.style.opacity = '0'
element.addEventListener('transitionend', finalizeAndCleanUp)
// next line's important but there's no need to store the value
element.offsetHeight
element.style.opacity = '1'

Как уже упоминалось, transition s работает путем интерполяции из состояния A в состояние B . Если ваш скрипт вносит изменения в одну и ту же функцию, механизм компоновки не может разделиться, когда заканчивается состояние A и начинается B . Если вы не дадите ему подсказку.

Поскольку не существует официального способа сделать подсказку, вы должны полагаться на побочные эффекты некоторых функций. В этом случае .offsetHeight getter, который неявно заставляет механизм размещения останавливаться, оценивать и вычислять все установленные свойства и возвращать значение. Как правило, этого следует избегать из-за влияния на производительность, но в нашем случае это именно то, что нужно: консолидация состояний.

Добавлен код очистки для полноты.

1 голос
/ 20 января 2015

Некоторые люди спрашивают, почему происходит задержка. Стандарт хочет, чтобы несколько переходов, известных как событие изменения стиля, происходили одновременно (например, элемент исчезал в то же самое время, когда он поворачивался в поле зрения). К сожалению, он не определяет явный способ группировки переходов, которые вы хотите выполнить одновременно. Вместо этого он позволяет браузерам произвольно выбирать, какие переходы происходят одновременно, по тому, как далеко они называются. Большинство браузеров, похоже, используют частоту обновления для определения этого времени.

Вот стандарт, если вы хотите больше деталей: http://dev.w3.org/csswg/css-transitions/#starting

...