ホバーで画像が動く-クロムの不透明度の問題


92

ここの私のページに問題があるようです:http//www.lonewulf.eu

サムネイルにカーソルを合わせると、画像が少し右に移動し、Chromeでのみ発生します。

私のCSS:

.img{
    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
    filter:alpha(opacity=50);
    -moz-opacity: 0.5; 
    opacity: 0.5;
    -khtml-opacity: 0.5;
    display:block;
    border:1px solid #121212;
}
.img:hover{
    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
    filter:alpha(opacity=100);
    -moz-opacity: 1; 
    opacity: 1;
    -khtml-opacity: 1;  
    display:block;
}

私のために動かない22.0.1229.94 m
Danny

3
画像自体ではなく、Aタグにホバーを置くことをお勧めします。
Diodeus-James MacFarlane 2012年

はい.imgはhrefクラスです。別の名前を付ける必要がありますか?多分今それは<img src>と競合しますか?編集:Nvm、私は名前を.imgから.thumbに変更しましたが、まだこの問題があります。他に何か提案はありますか?
zefs '19

それはおそらくFancyboxがやっていることです。
Diodeus-James MacFarlane 2012年

4
私のために働いた唯一の解決策は、Z軸上で翻訳をして使用して:stackoverflow.com/questions/12502234/...
ラリー・

回答:


231

別の解決策は、

-webkit-backface-visibility: hidden;

不透明度があるホバー要素上。裏面表示はに関連するtransformため、@ Beskowはそれと関係があります。これはWebkit固有の問題なので、Webkitの裏面表示を指定するだけで済みます。他のベンダープレフィックスがあります。

詳細については、http://css-tricks.com/almanac/properties/b/backface-visibility/を参照してください。


これは正解ですが、backface-visibilityプロパティはimg要素に設定する必要があると言う必要があります。私の場合、不透明度を持つ要素はをaラップする要素だったimgので、あなたの答えは完璧ではありませんでした。ところで、Mac版Firefoxでもこの問題を見つけたので、すべてのベンダープレフィックスを使用することをお勧めします。
Oliboy50 2014年

1
@ Oliboy50申し訳ありませんが、私はそれを主張する必要があります。私の場合、問題のある要素はの単なる空divのs background-imageでした。@alpipego解決策をありがとう!
bonflash 2014年

1
これは私にとってはうまくいきましたが、私の画像は滑らかではなくピクセル化されたように見えました。
キーランハンター

1
なぜそれが機能するのかはわかりませんが、私はこれに遭遇し、試してみました。これにより、自分のサイトで数か月にわたって発生し続けていたバグを修正できました。ありがとうございました!
Shnibble 2017

またz-index、ホバー効果が正しく機能するようにするには、を追加する必要がありました。
ジャック

34

何らかの理由で、Chromeは不透明度が1でない要素の位置を別の方法で解釈します。CSS属性position:relativeをa.img要素に適用すると、不透明度が変化するため、左/右の動きはなくなります。


1
これがなぜなのか誰か知っていますか?確かにそれはhasLayoutのものではありませんか?
sidonaldson 2013

7
Firefoxでも同じ問題が発生しました。Relativeは修正しませんでしたが、これを要素に設定すると修正されました transform: translate3d(0px,0px,0px);
ConorLuddy 2014年

私はサファリで同じ問題を抱えてtransform: translate3d(0px,0px,0px);働いていました
zevnicsca

21

同じ問題がありましたが、css変換回転で修正しました。このような:

-webkit-transform: rotate(0);
-moz-transform: rotate(0);
transform: rotate(0);

主要なブラウザで正常に動作します。


1
これをありがとう。これはFirefoxで修正されました!:D
ハンス・ワシンク

うん、私も。裏面のトリックは私にとってはうまくいきませんでした(img内のa)、これはうまくいきました!ありがとう!
mikmikmik 2014年

これが私にとって有効な唯一の答えです(Chrome)。ありがとう!
キッドダイヤモンド

14

この問題を修正したもう1つの解決策は、ルールを追加することでした。

will-change: opacity;

私の特定のケースでは、これにより、translateZ(0)Chromeで問題を修正したにもかかわらず、Internet Explorerで発生したのと同様のピクセルジャンプの問題が回避されました。

他のソリューションのほとんどは、変換(例えば関与することをここで提案translateZ(0)rotate(0)translate3d(0px,0px,0px)より効率的なレンダリングを可能にし、GPUに超える要素の取り扱い絵によって、など)の仕事を。will-changeおそらく同様の効果を持つブラウザーにヒントを提供します(ブラウザーがより効率的に遷移をレンダリングできるようにします)が、ハックは少なくなります(GPUを使用するようにブラウザーを微調整するだけでなく、問題に明示的に対処しているため)。

それを言って、それがいることを念頭に価値があるブラウザのサポートがために良いようではありませんwill-change(!問題がChromeである場合にのみ、これは良いことかもしれませんが)、およびいくつかの状況では、導入することができ、独自の問題を、まだ、それはこの問題の別の可能な解決策です。


10

この不具合を防ぐにはbackface-visibilitytransformルールとルールの両方を適用する必要がありました。このような:

a     {-webkit-transform: rotate(0);}
a img {-webkit-backface-visibility: hidden;}

10

ホバー時の(不透明でない)フィルターに同様の問題がありました。以下を使用して基本クラスにルールを追加することで修正されました:

filter: brightness(1.01);

ホバー時のフィルター遷移に関する同じ問題。これで修正されました。
Josh Harrison

フィルターの使用:明るさ(1); img要素で修正されました。ありがとうございます
Sai

これは私にとってはうまくいきました、ホバーの画像にグレースケールフィルターを適用するときに1pxの問題がありました。ブラウザー開発者がこれらすべてを最終的に修正できないのはなぜですか?なぜ、裏面表示とそのすべてのものを使用する必要があるのですか?...
Varin

これにより修正されますが、移行アニメーションが機能しなくなります
Amin

6

backface-visibility(または-webkit-backface-visibility)では、Chromeの問題のみが修正されました。FirefoxとChromeの両方で修正するには、上記の回答を次のように組み合わせて使用​​しました。

//fixes image jiggle issue, please do not remove
img {
  -webkit-backface-visibility: hidden; //Webkit fix
  transform: translate3d(0px,0px,0px); //Firefox fix
}

4

Safari 8.0.2でも同様の問題が発生しました。この問題では、画像の不透明度が変化すると画像が揺れてしまいます。ここに投稿された修正はどれもうまくいきませんでしたが、以下はうまくいきました:

-webkit-transform: translateZ(0);

この後続の回答によるこの回答へのすべてのクレジット


他のすべての回答を試しましたが、これが最初に機能したものでした!

2

グリッド内の画像でこの問題に遭遇しました。各画像は、display:inline-blockが宣言されているにネストされていました。Jamlandが上に投稿したソリューションは、表示時の問題を修正するために機能しました。親要素で宣言されました。

画像が順不同のリストにある別のグリッドがあり、display:blockと宣言することができました。親リストアイテムの幅と宣言されたbackface-visibility:hidden; 画像要素上にあり、ホバー時に位置のシフトがないようです。

li { width: 33.33333333%; display: block; }
li img { backface-visibility: hidden; }

2

解決策アルピペゴはこの問題で私に役立ちました。これを使用-webkit-backface-visibility: hidden; すると、ホバーの不透明度遷移で画像が移動しません

/* fix error hover image opacity*/
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;

2

他のすべてのソリューションを壊す可能性があるCSSの変更が必要なため、他のすべてのソリューションで問題が発生しました。position:relativeでは、要素の配置方法を完全に再考する必要があります。transform:rotate(0)は既存のソリューションと干渉する可能性がありますトランジション期間が設定されていると、変身して変な小さなトランジション効果が得られます。また、裏面が実際に必要な場合(および多くの接頭辞が必要な場合)は、裏面表示は機能しません。

私が見つけた最も怠惰な解決策は、非常に近いが1ではない要素に不透明度を設定することです。これは、不透明度が1の場合にのみ問題になるため、他のスタイルを壊したり妨害したりすることはありません。

opacity:0.99999999;

1

リックギナーの答えを正解としてマークしたところ、問題が解決しないことがわかりました。

私の場合、max-width div内にレスポンシブ幅の画像が含まれています。サイトの幅が最大幅を超えると、ホバーで画像が移動します(CSS変換を使用)。

私の場合の修正は、最大幅を単に3の倍数、この場合は3列に修正することでしたが、完全に修正されました。


1
コメントをありがとう、相対位置が常に解決策として機能するとは限らないことにも気付いたので、この問題が再度発生する場合は、あなたの方法も試してみます。
zefs

0

CSSに不透明度が含まれていることに気づきました。Chromeでもまったく同じ問題が発生しました(ホバー上で画像が動く)..不透明度を無効にするだけで解決し、画像が動かなくなりました。

.yourclass:hover {
  /* opacity: 0.6; */
}

0

同じ問題がありましたが、私の修正では、imgタブでsrcの前にクラスを配置していました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.