Efekt przejścia CSS sprawia, że obraz jest rozmyty / przesuwa obraz 1px, w Chrome?

Gdy div jest najechany, efekt przejścia CSS przesuwa div.

Problem, jak widać na przykładzie, polega na tym, że przejście "translate" ma okropny efekt uboczny spowodowania, że obraz w div przesunie się o 1px w dół / w prawo (i ewentualnie zmieni rozmiar kiedykolwiek tak lekko?) tak, że wydaje się nie na miejscu i nieostre...

Usterka wydaje się mieć zastosowanie cały czas efekt hover jest stosowany, a z procesu prób i błędów mogę bezpiecznie powiedzieć, że tylko wydaje się wystąpić gdy translate Przejście przenosi div (pole Cień i krycie są również stosowane, ale nie ma różnicy do błędu po usunięciu).

Druga edycja: właściwie problem nie rozwiązany!

Tworząc JSFiddle aby zilustrować problem natknąłem się na ciekawą obserwację. Problem występuje tylko wtedy, gdy strona ma paski przewijania. Tak więc przykład z tylko jedną instancją div jest w porządku, ale po raz kolejny identyczne div są dodawane i dlatego strona wymaga paska przewijania problem znowu uderza...

Jakieś pomysły?!
Author: feeela, 2013-03-17

12 answers

Próbowałeś tego wCSS ?

.yourDivClass {
    /* ... */

    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0) scale(1.0, 1.0);
}
To sprawia, że podział zachowuje się "bardziej 2D".
  • Backface jest domyślnie rysowane, aby umożliwić przewracanie rzeczy z rotate i takie tam. Nie ma takiej potrzeby, jeśli poruszasz się tylko w lewo, w prawo, w górę, w dół, skalujesz lub obracasz (w kierunku przeciwnym)do ruchu wskazówek zegara.
  • Translate Z-axis to always have a zero value.

Edit

Chrome obsługuje teraz backface-visibility i transform bez prefiksu -webkit-. I obecnie Nie wiem, jak to wpływa na renderowanie innych przeglądarek (FF, IE), więc używaj wersji bez prefiksu z ostrożnością.

 226
Author: sampoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 11:44:33

Musisz zastosować transformację 3D do elementu, aby otrzymał on własną warstwę kompozytową. Na przykład:

.element{
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
}

Lub

.element{
    -webkit-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

Więcej o kryteriach tworzenia warstw można przeczytać tutaj: przyspieszone renderowanie w Chrome


Wyjaśnienie:

Przykłady (podświetlenie zielonego pola):

Gdy używasz przejścia na swoim elemencie, powoduje to przeliczanie stylów przez przeglądarkę, a następnie ponowne układanie zawartości, nawet jeśli właściwość przejścia jest wizualna (w moich przykładach jest to nieprzezroczystość) i ostatecznie malowanie elementu:

zrzut ekranu

Problem polega na przeprojektowaniu zawartości, która może spowodować efekt "tańczenia " lub" migania " elementów na stronie podczas przejścia. Jeśli przejdziesz do ustawień, zaznacz pole wyboru "Pokaż warstwy kompozytowe" i następnie zastosuj transformację 3D do elementu, zobaczysz, że otrzymuje on własną warstwę, która jest zaznaczona pomarańczową obwódką.

zrzut ekranu

Gdy element otrzyma własną warstwę, przeglądarka musi po prostu złożyć warstwy przy przejściu bez ponownego układu lub nawet operacji malowania, więc problem musi zostać rozwiązany:

zrzut ekranu

 83
Author: sol0mka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 00:34:54

Miał ten sam problem z osadzonym iFrame youtube (tłumaczenia były używane do centrowania elementu iframe). Żadne z powyższych rozwiązań nie zadziałało, dopóki nie spróbowano zresetować filtrów css I stało się coś magicznego.

Struktura:

<div class="translate">
     <iframe/>
</div>

Style [before]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
}

Style [po]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
  filter: blur(0);
  -webkit-filter: blur(0);
}
 35
Author: xb1itz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 15:48:42

Poleciłem eksperymentalny nowy atrybut CSS, który testowałem na najnowszej przeglądarce i jest dobry:

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+                */

Dzięki temu przeglądarka pozna algorytm renderowania

 27
Author: Felipez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 00:21:04

Try filter: blur(0);

Zadziałało dla mnie

 2
Author: Fred K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 14:15:40

Znalazłem kolejny powód, dla którego element rozmywa się podczas transformacji. Używałem transform: translate3d(-5.5px, -18px, 0); do zmiany pozycji elementu po załadowaniu, jednak element ten stał się rozmyty.

Próbowałem wszystkich powyższych sugestii, ale okazało się, że to przeze mnie używałem wartości dziesiętnej dla jednej z wartości translate. Liczby całkowite nie powodują rozmycia, a im bardziej oddalałem się od liczby całkowitej, tym gorsze było rozmycie.

Tzn. 5.5px rozmywa pierwiastek najbardziej, Najmniej.

Pomyślałem, że rzucę to tutaj na wypadek, gdyby komuś to pomogło.
 2
Author: ashrobbins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 10:11:57

Oszukałem problem używając przejścia po krokach, nie płynnie

transition-timing-function: steps(10, end);

To nie jest rozwiązywanie, to jest oszustwo i może być stosowane nie wszędzie.

Nie potrafię tego wyjaśnić, ale mi to odpowiada. Żadna inna odpowiedź mi nie pomaga (OSX, Chrome 63, Non-Retina display).

Https://jsfiddle.net/tuzae6a9/6/

 2
Author: Evgeny Gendel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 19:15:14

Skalowanie do podwojenia i sprowadzenie do połowy z zoom zadziałało dla mnie.

transform: scale(2);
zoom: 0.5;
 1
Author: Kushagra Gour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 10:42:33
filter: blur(0)
transition: filter .3s ease-out
transition-timing-function: steps(3, end) // add this string with steps equal duration

Pomogło mi ustawienie wartości czasu przejścia .3s równe kroki czasu przejścia .3s

 0
Author: j-tap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 09:13:40

Próbowałem około 10 możliwych rozwiązań. Pomieszali je i nadal nie działały poprawnie. Zawsze był 1px shake na końcu.

Znajduję rozwiązanie, skracając czas przejścia na filtrze.

To nie działa:

.elem {
  filter: blur(0);
  transition: filter 1.2s ease;
}
.elem:hover {
  filter: blur(7px);
}

Rozwiązanie:

.elem {
  filter: blur(0);
  transition: filter .7s ease;
}
.elem:hover {
  filter: blur(7px);
}

Spróbuj tego w fiddle:

.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>
Mam nadzieję, że to komuś pomoże.
 0
Author: Adam Orlov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 11:51:26

Dla mnie, teraz w 2018 roku. Jedyną rzeczą, która rozwiązała mój problem (Biała migotliwa linia biegnąca przez obraz po najechaniu kursorem), było zastosowanie tego do mojego elementu łącza trzymającego element obrazu, który ma transform: scale(1.05)

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;
}
 0
Author: mateostabio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 02:12:54

Po prostu mam ten sam problem. Spróbuj ustawić pozycję: względem elementu nadrzędnego, który mi się sprawdził.

 -6
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 21:23:10