Divがホバーされると、CSSトランジション効果によってdivが移動します。
例からわかるように、問題は 'translate'トランジションがdivのイメージを1px下/右に移動させる(そしておそらくはサイズ変更される可能性があるため)というひどい副作用があることです。場所がずれていて焦点が合っていません...
グリッチはホバー効果が適用されている間ずっと適用されているようで、試行錯誤の過程から変換トランジションがdivを移動させたときにのみ発生しているように思えます(ボックスシャドウと不透明度も適用されますが削除されたときのエラー).
JSFiddleを作成する際に、興味深い観察に出会った問題を説明しました。ページにスクロールバーがある場合にのみ問題が発生します。したがって、divのインスタンスが1つだけの例は問題ありませんが、同一のdivが追加されるとページにスクロールバーが必要になるため、この問題が再び発生します。
これをCSSで試しましたか?
.yourDivClass {
/* ... */
-webkit-backface-visibility: hidden;
-webkit-transform: translateZ(0) scale(1.0, 1.0);
}
これが何をするかということは、部門が「より二次元的」に振舞うようにするということです。
編集
Chromeはbackface-visibility
プレフィックスなしで-webkit-
とtransform
を処理するようになりました。私は現在、これが他のブラウザのレンダリング(FF、IE)にどのように影響するかわからないので、接頭辞のないバージョンを使用する場合は注意してください。
3D変換を要素に適用する必要があるので、それはそれ自身の複合層を取得します。例えば:
.element{
-webkit-transform: translateZ(0);
transform: translateZ(0);
}
または
.element{
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
レイヤ作成基準の詳細については、こちらをご覧ください。 Chromeでの高速レンダリング
説明:
例(ホバーグリーンボックス):
要素にトランジションを使用すると、ブラウザはスタイルを再計算し、transitionプロパティが視覚的な場合でもコンテンツを再レイアウトし(私の例では不透明度になります)、最後に要素をペイントします。
ここでの問題は、トランジションが発生している間にページ上の「ダンス」または「点滅」要素の効果をもたらす可能性があるコンテンツの再レイアウトです。設定に行き、「複合レイヤーを表示する」チェックボックスをチェックしてから、要素に3D変換を適用すると、オレンジ色の枠で囲まれた独自のレイヤーになります。
要素がそれ自身のレイヤを取得した後、ブラウザは再レイアウトやPaint操作さえもせずに遷移時にレイヤを合成する必要があるので問題は解決されなければなりません:
埋め込まれたYouTubeのiframeで同じ問題を抱えていました(翻訳はiframe要素をセンタリングするために使用されていました)。上記の解決策はどれもcssフィルタをリセットする試してみるまでうまくいきませんでした。
構造:
<div class="translate">
<iframe/>
</div>
スタイル[前]
.translate {
transform: translateX(-50%);
-webkit-transform: translateX(-50%);
}
スタイル[後]
.translate {
transform: translateX(-50%);
-webkit-transform: translateX(-50%);
filter: blur(0);
-webkit-filter: blur(0);
}
私は最新のブラウザでテストした実験的な新しい属性CSSを推奨しました。
image-rendering: optimizeSpeed; /* */
image-rendering: -moz-crisp-edges; /* Firefox */
image-rendering: -o-crisp-edges; /* Opera */
image-rendering: -webkit-optimize-contrast; /* Chrome (and Safari) */
image-rendering: optimize-contrast; /* CSS3 Proposed */
-ms-interpolation-mode: nearest-neighbor; /* IE8+ */
これでブラウザはレンダリングのためのアルゴリズムを知るでしょう
変換されたときに要素がぼやけてしまう別の理由を見つけたところです。ロードされた要素を再配置するためにtransform: translate3d(-5.5px, -18px, 0);
を使用していましたが、その要素はぼやけました。
上記のすべての提案を試してみましたが、翻訳値の1つに10進値を使用していることが原因であることがわかりました。全体の数がぼやけを引き起こすことはありません、そして、私が全体の数から離れるほど、ぼやけは悪化しました。
すなわち5.5px
は要素を最もぼかし、5.1px
は最もぼかします。
誰かに役立つ場合に備えて、ここでこれをチャックすると思いました。
スムーズではなく、段階的な移行を使用して問題をだましました
transition-timing-function: steps(10, end);
それは解決ではありません、それは不正行為であり、どこにでも適用することはできません。
説明できませんが、うまくいきます。他の答えはどれも私を助けません(OSX、Chrome 63、Non-Retinaディスプレイ)。
zoom
を2倍に縮小して半分にすることが私のために働きました。
transform: scale(2);
zoom: 0.5;
filter: blur(0);
をお試しください
それは私のために働いた
私は約10の解決策を試しました。それらを混同しても、まだ正しく機能しませんでした。最後には常に1pxの揺れがありました。
フィルタの遷移時間を短くすることで解決策を見つけます。
これはうまくいきませんでした。
.elem {
filter: blur(0);
transition: filter 1.2s ease;
}
.elem:hover {
filter: blur(7px);
}
溶液:
.elem {
filter: blur(0);
transition: filter .7s ease;
}
.elem:hover {
filter: blur(7px);
}
これを試してみてください。
.blur {
border: none;
outline: none;
width: 100px; height: 100px;
background: #f0f;
margin: 30px;
-webkit-filter: blur(10px);
transition: all .7s ease-out;
/* transition: all .2s ease-out; */
}
.blur:hover {
-webkit-filter: blur(0);
}
.blur2 {
border: none;
outline: none;
width: 100px; height: 100px;
background: tomato;
margin: 30px;
-webkit-filter: blur(10px);
transition: all .2s ease-out;
}
.blur2:hover {
-webkit-filter: blur(0);
}
<div class="blur"></div>
<div class="blur2"></div>
これが誰かに役立つことを願っています。
私のために、2018年になりました。私の問題(ホバー上の画像を通る白いグリッチフリッカーライン)を修正した唯一のことは、transform: scale(1.05)
を持つimage要素を保持する私のlink要素にこれを適用することでした
a {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform: translateZ(0) scale(1.0, 1.0);
transform: translateZ(0) scale(1.0, 1.0);
-webkit-filter: blur(0);
filter: blur(0);
}
a > .imageElement {
transition: transform 3s ease-in-out;
}
filter: blur(0)
transition: filter .3s ease-out
transition-timing-function: steps(3, end) // add this string with steps equal duration
移行期間の値.3s
を等しい移行タイミングステップ.3s
に設定することで助けられました