зображення рухається при наведенні - проблема з непрозорістю хрому


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
Денні

3
Найкраще наводити курсор на тег A, а не на самому зображенні.
Діодей - Джеймс Макфарлейн,

Так .img - це href-клас. Чи слід давати йому іншу назву? може зараз це конфліктує з <img src>? EDIT: Nvm, я змінив назву з .img на .thumb і все ще маю цю проблему. Будь-яка інша пропозиція?
zefs

Можливо, це те, чим займається Fancybox.
Діодей - Джеймс Макфарлейн,

4
використання перекладу на осі Z було єдиним рішенням, яке працювало для мене: stackoverflow.com/questions/12502234/…
Ларрі

Відповіді:


231

Іншим рішенням було б використання

-webkit-backface-visibility: hidden;

на елементі наведення, що має непрозорість. Видимість на задньому плані стосується transform, тому @Beskow має щось спільне з цим. Оскільки це специфічна проблема веб-набору, вам потрібно лише вказати видимість задньої поверхні веб-набору. Є й інші префікси постачальників .

Для отримання додаткової інформації див. Http://css-tricks.com/almanac/properties/b/backface-visibility/ .


Це правильна відповідь, але ви повинні сказати, що backface-visibilityвластивість повинна бути встановлена ​​на imgелементі. У моєму випадку елементом, який має непрозорість, був aелемент, який обертає img, тому ваша відповідь не була для мене ідеальною. До речі, я також знайшов цю помилку у Firefox для Mac, тому пропоную використовувати префікси всіх постачальників.
Oliboy50,

1
@ Oliboy50 Вибачте, я повинен це стверджувати. У моєму випадку дефектні елементи були просто порожніми divs background-image. @alpipego Дякую за рішення!
bonflash

1
Це спрацювало для мене, але мої зображення виглядали погано, замість гладких піксельних.
Кіран Хантер,

1
Не знаю, чому це працює, але я трапився з цим і зробив спробу. Це виправило помилку, яка постійно з’являлася на моєму сайті місяцями, і я ніколи не міг зрозуміти. Дякую!
Shnibble

Мені також довелося додати a, z-indexщоб ефект наведення міху працював правильно для мене.
Джек,

34

Чомусь Chrome по-різному інтерпретує положення елементів без непрозорості 1. Якщо ви застосуєте атрибут CSS position:relativeдо елементів a.img, рух ліворуч / праворуч більше не буде, оскільки їх непрозорість змінюється.


1
Хтось знає, чому це? Напевно, це не річ hasLayout?
sidonaldson

7
Була така сама проблема у Firefox щойно. Родич не transform: translate3d(0px,0px,0px);
виправив

У мене була та сама проблема в Safari і я transform: translate3d(0px,0px,0px);працював
zevnicsca

21

У мене була та ж проблема, я виправив це за допомогою css transform rotate. Подобається це:

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

Це чудово працює у основних браузерах.


1
Дякую за це. Це виправлено у Firefox! : D
Ганс Вассінк

Так і мені. Трюк із задньою поверхнею у мене не спрацював (img inside a), але цей! Дякую!
mikmikmik

Це єдина відповідь, яка у мене спрацювала (Chrome). Дякую!
Kid Diamond

14

Іншим рішенням, яке вирішило цю проблему для мене, було додати правило:

will-change: opacity;

У моєму конкретному випадку це дозволило уникнути подібної проблеми зі стрибком пікселів, яка translateZ(0)з’явилася в Internet Explorer, незважаючи на виправлення речей у Chrome.

Більшість інших рішень запропонованих тут , які включають трансформує (наприклад. translateZ(0), rotate(0), translate3d(0px,0px,0px)І т.д.) робота з передачі картини елемента до ГПУ, що дозволяє більш ефективно рендеринга. will-changeнадає підказку браузеру, який має, мабуть, подібний ефект (дозволяючи браузеру зробити перехід ефективніше), але відчуває себе менш хакерським (оскільки він явно вирішує проблему, а не просто підштовхує браузер до використання графічного процесора).

Сказавши це, варто пам’ятати, що підтримка браузера не така хороша will-change(хоча, якщо проблема лише в Chrome, це може бути добре!), І в деяких ситуаціях це може спричинити власні проблеми , але все ж , це ще одне можливе рішення цього питання.


10

Мені потрібно було застосувати обидва правила backface-visibilityта transformправила, щоб запобігти цьому збою. Подобається це:

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

10

У мене була подібна проблема з фільтрами (непрозорістю) при наведенні. Виправлено додаванням правила до базового класу за допомогою:

filter: brightness(1.01);

Та сама проблема з переходом фільтра при наведенні. Це виправило це і для мене.
Джош Гаррісон,

Використання фільтра: яскравість (1); на елементі img це мені виправило, дякую
Сай

це спрацювало для мене, у мене була проблема з 1px при застосуванні фільтру сірих тонів до зображення при наведенні. Чому розробники браузера не можуть остаточно виправити всі ці речі? Чому я повинен використовувати задню видимість та все таке інше ...
Варін,

Це виправляє, але анімація переходу перестає працювати
Амін

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. Рішення, яке опублікував Джамленд, допомогло виправити проблему, коли дисплей: inline-block; було оголошено на батьківському елементі.

У мене була інша сітка, де зображення були в невпорядкованому списку, і я зміг просто оголосити display: block; та ширину батьківського елемента списку та оголошену видимість задньої поверхні: приховано; на елементі зображення, і, здається, ніякого зміщення положення при наведенні.

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

2

Рішення alpipego було подане мені в цій проблемі. Використовувати -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

Позначивши відповідь Ріка Гінера як правильну, я тоді з'ясував, що це не вирішило проблему.

У моєму випадку у мене є чуйні зображення ширини, що містяться в div максимальної ширини. Як тільки ширина сайту перетне максимальну ширину, зображення переміщується на наведення (за допомогою css-перетворення).

У моєму випадку виправлення полягало в тому, щоб просто змінити максимальну ширину до кратного трьом, трьом стовпцям у цьому випадку, і це ідеально зафіксувало.


1
Дякую за коментар, я також помітив, що відносна позиція не завжди працює як рішення, тому, якщо ця проблема з'явиться знову, я спробую і ваш метод.
zefs

0

Я помітив, що у ваш CSS була включена непрозорість. У мене була така сама проблема з Chrome (зображення, яке рухається при наведенні) .. все, що я зробив, це відключити непрозорість, і це було вирішено, більше зображень не рухається.

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

0

Була та сама проблема, Моє виправлення ставило клас перед src на вкладці img.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.