2016-04-08 13 views
0

CSS変換でvwとvhの値を使用しています。これはCSSアニメーションに実際のウィンドウ幅を使用させます。この場合、クラウドイメージは画面の左から右に移動します。サイズ変更後にCSS vwとvhの値を再計算するには?

これは、CSSの読み込み後にウィンドウのサイズを変更した場合を除いて、どのウィンドウサイズでも正常に機能します。サイズ変更後にvwの値を再計算する方法はありますか?

transform:translateでは機能しないため、パーセンテージは使用できません。

cloud { 
    animation: cloudanimation 2s linear infinite; 
} 

@keyframes cloudanimation { 
    0% { 
    transform: translateX(10vw); 
    } 

    100% { 
    transform: translateX(90vw); 
    /* percentages don't work correctly with translate */ 
    /* transform : translateX(90%);*/ 
    } 
} 
+0

これはバグのようです。異なるブラウザ - >異なる結果。 – zeroflagL

答えて

1

アニメーションに相対値を渡すと、絶対値に変換されますが、サイズを変更すると更新されません。

解決策の1つは、サイズ変更イベントが発生したときにアニメーションを再開することです。 jQueryを使って

$(window).resize(function() { 
    //remove animation 
    $('div').removeClass('cloud') 

    //reflow width 
    let w = $('div').outerWidth(); 
    $('div').outerWidth(w); 

    // add animation class back 
    $('div').addClass('cloud') 
}); 

fiddle

CSSクラスの追加や削除、アニメーションを再起動するには、十分なhereが説明したように、あなたも幅をリフローする必要はありません。


あなたがinline-blockとして、あなたの要素を表示することができれば、これらは、アニメーション、fiddleの追加と削除せずに一貫振る舞うように見えます。

+0

はい、javascriptを使用して、クラスを削除して追加することでアニメーションをリセットできます。 (ただし、現在実行中のアニメーションも停止します)。しかし、私は実際にCSSでこれを完全に行う方法を探しています:ウィンドウの幅にかかわらず、左から右にdivをアニメーション化させます。 – Kokodoko

+0

最後のフィドルを見て – maioman

+0

ありがとう!その最新のフィドルはChromeで動作しますブラウザのプレフィックスを追加しても、Safariではまだ変わっています。それからサファリバグでなければならない? – Kokodoko

1

VWとVHは、ウィンドウのサイズ変更で自動的に再計算されます。

transform: translateX(10vw); 
transform: translateX(90vw); 

多分問題はどこか他にありますか? ここをクリックFiddle

+0

実際、フィドルのアニメーションは、サイズ変更後に新しい幅を使用していないようです!ウィンドウを小さくすると、クラウドのdivが左側に再び表示されるまで時間がかかります。これは、画面の外でまだアニメーションが行われているためです。 – Kokodoko

+0

Chromeはあなたのフィドルを正しく表示することが分かりました。サファリのバグでなければなりません。ブラウザのプレフィックスを追加することで違いはありません。 – Kokodoko

+1

http://caniuse.com/#feat=viewport-unitsそれは変ですが、CanIUseはSafariでサポートされるユニットを報告します。私はVWとVHのiPhone用Safariと同様にいくつかの問題を抱えていましたが、たぶんバグかもしれません。 –

関連する問題