私は<div>
をスライドショー画像コンテナとして使用しています。容器内に表示される画像は、異なるサイズであり、そのよう背景画像ではなく、容器内部<img>
要素として適用される:必要に応じて、メディアは CSSアニメーション中に背景画像のサイズを変更せずにちらつきを取り除く
- 背景私は
background-size:cover
とbackground-clip:content-box
を有するスライドショー効果
を生成するようにアニメーション化することができ、これらは正しく過剰が正しく切り取られることを確実に、容器の所望の領域内の画像を保持しています。
最初の問題は、CSSアニメーション中に、あるイメージが別のイメージに移行するときに、そのイメージがそのキーフレームのタイミングでリサイズされることです。私が望むのは、次の画像がサイズ変更されずに(適切なサイズで)ただちに移行されることです。
実際には、最初にクロスフェードビジュアリゼーションがあるのかどうかはわかりません。なぜなら、私はこれを行うような指示がないからです(おそらく-webkit-
アニメーションが内蔵されていますか?)。私はあなたがちょうど1つのイメージから次へとすぐに変化を見ると思ったでしょう。私は実際にクロスフェードが好きですが、どこから来ているのかわからないと、サイズ変更の問題に関係していると思います。
第2の問題は、スライドショーの最初の反復(のみ)中に画像のちらつきがあり、コンテナ要素の白地色が短く表示されることです。これは最初の反復でのみ発生するので、おそらく画像の最初のダウンロード時間に問題があったと思います。そのため、後続の反復で消えてしまうのです。しかし、スライドショーが始まる前に画像をプリロードするためにJavaScriptを追加して同じ問題を発見した場合、それは当てはまりませんでした。また、ショーを実行すると、キャッシュにイメージがあり、ページを更新すると(キャッシュからイメージを取得するだけです)、自分のテストサーバーからファイルを取得することでテストしていますキャッシュが正しく)、フリッカーが再び発生します。
私は、さまざまなCSSのプロパティ設定でフリッカーを除去することについての投稿を見てきましたが、preserve3d
などを使用していますが、それでも役立たないものはありません。私は、Windows 10
#outerFrame {
background-color: #22130c;
box-shadow: inset 0 1px 1px 1px hsla(0,0%,100%,.2),
inset 0 -2px 1px hsla(0,0%,0%,.4),
0 5px 50px hsla(0,0%,0%,.25),
0 20px 20px -15px hsla(0,0%,0%,.2),
0 30px 20px -15px hsla(0,0%,0%,.15),
0 40px 20px -15px hsla(0,0%,0%,.1);
padding: 1.5em;
overflow: auto;
float: left;
margin: 0 1em 1em 0;
}
#innerFrame {
background-color: #fff5e5;
box-shadow: 0 2px 1px hsla(0,0%,100%,.2),
0 -1px 1px 1px hsla(0,0%,0%,.4),
inset 0 2px 3px 1px hsla(0,0%,0%,.2),
inset 0 4px 3px 1px hsla(0,0%,0%,.2),
inset 0 6px 3px 1px hsla(0,0%,0%,.1);
padding: 1.5em;
}
/* This is the relevant style: */
#innermostFrame {
padding: .75em;
background-color: #fff;
box-shadow: 0 -1px 0 2px hsla(0, 0%, 0%,.03);
background-position: 50% 50%;
background-repeat: no-repeat;
background-size:cover;
background-clip: content-box;
animation: cycle 8s ease-in-out infinite;
width: 30vw;
height:40vh;
min-width: 200px;
max-width: 900px;
}
@keyframes cycle {
0% { background-image: url("https://picsum.photos/200/300/?random"); }
25% { background-image: url("https://picsum.photos/640/480/?random"); }
50% { background-image: url("https://picsum.photos/1900/1200/?random"); }
75% { background-image: url("https://picsum.photos/480/200/?random"); }
100% { background-image: url("https://picsum.photos/600/300/?random"); }
}
<div id="outerFrame">
<div id="innerFrame">
<div id="innermostFrame"></div>
</div>
</div>
にクローム62.0.3202.94デスクトップを使用してい
は私がサイドステップができ、他の様々な技術を用いてこれらの問題を実現する(すなわちJavaScriptは、<img>
要素を積み重ねますopaccity
などを管理していますが)、私は実際にこれらの2つの問題の原因を理解しようとしています。
これは本当に面白いです:D白い背景は間違いなく時間的にロードされていないイメージのためですが、サイズ変更のフリッカーは私にとって新しいものです...そのフリッカーは正確なバックグラウンドサイズ。コードを確認してくださいhttps://codepen.io/mnikolaus/pen/YEexNX 私はそれがあなたの敏感なアイデアに直面していないことを知っていますが、あなたはおそらくそれを回避しようとすることができます。私は画像サイズの計算は、ブラウザが特定の時間に処理するための多くのものだと思う... –
@MarioNikolausありがとう、残念ながら、静的なサイズは動作しません。これは、敏感な解決策でなければなりません。また、私の記事で述べたように、白い背景は、実際にはダウンロードされていない画像からではありません。私は、スライドショーを開始する前にJavaScriptがそれらをロードし、何も変わらないテストを実行しました。 –
画像を表示するための要素が1つ必要ですか?どのようにスケーラブルなソリューションが必要ですか? –