Переход CSS3: различные переходы для * IN * и * OUT * (или возврат из переходного состояния) - PullRequest
13 голосов
/ 20 января 2012

Оригинальный вопрос ... обновленный рабочий код ниже:

У меня есть изображение загрузки, которое появляется во время события загрузки AJAX. Изображение показывает / скрывает, добавляя или удаляя класс «loading» к элементу body. В настоящее время загружаемое изображение анимирует размер фона от 0 до 100% и затухает при непрозрачности (наоборот, для перехода «возврат»).

Что я хочу сделать, так это сделать так, чтобы переход размера фона происходил мгновенно (не переход) при исчезновении, поэтому:

  • Fade in: непрозрачность от 0 до 1 в .2s, размер фона от 0 до 100% в .2s
  • Исчезновение: непрозрачность от 1 до 0 в .2 с, размер фона от 100% до 0 должен произойти мгновенно

    #loader {
        width: 100%;
        height: 100%;
        position: fixed;
        top: 0;
        left: 0;
        z-index: -1;
        opacity: 0;
        -moz-opacity: 0;
        transition: all .2s ease-in-out
    }
    
    
    #loader .image {
        width: 400px;
        height: 138px;
        display: block;
        position: absolute;
        z-index: 2000; 
        top: 50%; 
        left: 50%; 
        margin: 0;
        background: url(assets/images/loading.png) no-repeat;
        background-size: 0 0;
        transition: all .2s ease-in-out;
        -webkit-animation: pulse 400ms ease-out infinite alternate;
        -moz-animation: pulse 400ms ease-out infinite alternate;
        -o-animation: pulse 400ms ease-out infinite alternate;
        animation: pulse 400ms ease-out infinite alternate
    }
    
    .loading #loader {z-index: 1000; background-color: rgba(255,255,255,.7)}
    
    .loading #loader .image {
        background-size: 100% 100%; 
        margin: -69px 0 0 -200px;
        transition: opacity .2s ease-in-out
    }
    

Я изменил свойство перехода для этого селектора .loading #loader .image на «непрозрачность», а не на «все», но он по-прежнему выполняет переход размера фона.

Кто-нибудь знает, как добиться различных переходов постепенного появления и исчезновения, описанных выше с помощью css3? Спасибо!


Обновленный рабочий код

Проблема заключалась в разделении отдельных свойств (поля, фона) в список через запятую. Я считаю, что с помощью перехода: все помешает вам сделать различные переходы IN и OUT .

#loader {
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    z-index: -1;
    opacity: 0;
    -moz-opacity: 0;
    .transition(opacity,.4s);
}

#loader .image {
    width: 400px;
    height: 138px;
    display: block;
    position: absolute;
    z-index: 2000; 
    top: 50%; 
    left: 50%; 
    margin: 0;
    background: url(assets/images/loading.png) no-repeat;
    background-size: 0 0;

    -webkit-transition: margin .4s ease-in-out;
    -moz-transition: margin .4s ease-in-out;
    -o-transition: margin .4s ease-in-out;
    -ms-transition: margin .4s ease-in-out;
    transition: margin .4s ease-in-out;

    -webkit-animation: pulse 400ms ease-out infinite alternate;
    -moz-animation: pulse 400ms ease-out infinite alternate;
    -o-animation: pulse 400ms ease-out infinite alternate;
    animation: pulse 400ms ease-out infinite alternate
}

.loading #loader {z-index: 1000; background-color: rgba(255,255,255,.7)}

.loading #loader .image {
    background-size: 100% 100%; 
    margin: -69px 0 0 -200px;

    -webkit-transition: background .4s ease-in-out, margin .4s ease-in-out;
    -moz-transition: background .4s ease-in-out, margin .4s ease-in-out;
    -o-transition: background .4s ease-in-out, margin .4s ease-in-out;
    -ms-transition: background .4s ease-in-out, margin .4s ease-in-out;
    transition: background .4s ease-in-out, margin .4s ease-in-out;
}

1 Ответ

20 голосов
/ 20 января 2012

Вот упрощенный тестовый пример:

div {
    background: blue;
    opacity: 0;
    transition: opacity 2s ease-in-out;
}

div.loading {
    opacity: 1;
    background: red;
    transition: opacity 2s ease-in-out, background 1s ease-in;
}

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

Я использовал :hover в качестве примера, но он должен работать одинаково при добавлении и удалении классов с помощью JavaScript.

Демо

Если вы хотите более конкретный пример, предоставьте сокращенный тестовый пример на dabblet или Jsfiddle .

...