web-dev-qa-db-ja.com

CSS3遷移:* IN *と* OUT *の異なる遷移(または遷移状態からの復帰)

元の質問...以下の作業コードを更新:

Ajaxロードイベント中に表示されるロードイメージがあります。この画像は、body要素に「loading」クラスを追加または削除することで表示/非表示になっています。現在、読み込み中の画像はbackground-sizeを0から100%までアニメーション化し、不透明度をフェードインします(「戻り」遷移の場合はその逆)。

しかし、私が達成したいのは、フェードアウトで背景サイズのトランジションを(トランジションではなく)即座に実行させることです。

  • フェードイン:.2sで0から1の不透明度、.2sで0から100%の背景サイズ
  • フェードアウト:.2秒で1から0までの不透明度、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;
}
15

簡略化されたテストケースは次のとおりです。

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を使用してクラスを追加および削除する場合も同じように機能するはずです。

デモ

より具体的な例が必要な場合は、 縮小されたテストケース on dabblet または Jsfiddle を提供してください。

21
bookcasey