CSS geçiş efekti Chrome'da görüntüyü bulanıklaştırıyor / görüntüyü 1 piksel taşıyor mu?


150

Fareyle üzerine gelindiğinde, bir CSS geçiş efekti bir div taşıyacak bazı CSS var.

Örnekte görebileceğiniz gibi sorun, translategeçişin div içindeki görüntüyü 1px aşağı / sağa (ve muhtemelen çok küçük bir boyutta yeniden boyutlandırmak?) Yapmak için korkunç bir yan etkiye sahip olmasıdır. odak dışı...

Aksaklık, vurgulu efektin uygulandığı süre boyunca geçerli gibi görünüyor ve deneme yanılma sürecinden güvenli bir şekilde söyleyebilirim ki sadece çeviri geçişi div hareket ettiğinde (kutu gölgesi ve opaklık da uygulanır, ancak hiçbir fark yaratmaz) kaldırıldığında hata).

Sorun yalnızca sayfada kaydırma çubukları olduğunda ortaya çıkıyor. Div'ın yalnızca bir örneğine sahip olan örnek gayet iyi, ancak bir kez daha özdeş div'ler eklendiğinde ve bu nedenle sayfa bir kaydırma çubuğu gerektirdiğinde sorun tekrar karşımıza çıkıyor ...


1
OSX'te Chrome 27 kullanıyorum ve sorun değil. İçerik bir katmana konduğunda, animasyon sırasında bir bitmap haline geldiğine ve eski sürümlerde / eski grafik kartlarında bunun harika görünmediğine inanıyorum. Daha yeni bir sürümü deneyin ve düzeltilip düzeltilmediğine bakın.
Rich Bradshaw

Chrome 25 OS X'te her şey yolunda. BTW: Arka plan gradyan dokusu için 300 KB'lık bir görüntüden farklı bir yaklaşım öneririm!
Paolo

Ve teşekkürler @Paolo - arka plan görüntüsü sadece gösteri içindi, gerçek sitede kullanılan görüntü değil!
Lewis

2
Animasyon GPU tarafından işlendiğinde sorun ortaya çıkıyor, bitmap yuvarlamaları biraz kapalı gibi görünüyor. Kanarya'da çoğaltılır, ancak GPU hızlandırmayı kapatırsanız iyi çalışır
vals

Bu çözümü her kare deneyebilirsiniz ... stackoverflow.com/a/42256897/1834212
Miguel

Yanıtlar:


247

2020 güncellemesi

  • Bulanık görüntülerle ilgili sorun yaşıyorsanız, özellikle image-renderingCSS özelliği gibi yanıtları da aşağıdan kontrol ettiğinizden emin olun .
  • En iyi uygulama erişilebilirliği ve SEO akıllıca için, arka plan resmini nesneye uygun CSS özelliğini <img>kullanarak bir etiketle değiştirebilirsiniz .

Orijinal cevap

Bunu CSS'nizde deneyin :

.your-class-name {
    /* ... */
    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0) scale(1.0, 1.0);
}

Bunun yaptığı şey, bölünmenin "daha 2B" gibi davranmasını sağlamaktır.

  • Döndürme ve benzeri şeyleri ters çevirmek için arka yüz varsayılan olarak çizilir. Sadece sola, sağa, yukarı, aşağı, ölçeklendirir veya saat yönünün tersine döndürürseniz buna gerek yoktur.
  • Her zaman sıfır değerine sahip olmak için Z eksenini çevirin.
  • Şimdi kolları Krom backface-visibilityve transformolmadan -webkit-önek. Şu anda bunun diğer tarayıcı oluşturma (FF, IE) nasıl etkilediğini bilmiyorum, bu yüzden öneksiz sürümleri dikkatli kullanın.

27
Hiçbir şey açıklamamış olabilir, ancak bu sorunu benim için düzeltmek için yeterince açıkladı.
McNab

@ Sınıf İstifleyici - ne açıklamalı? Sadece kodu sorunlu öğenize yapıştırın. Btw bu çok güzel çalışıyor!
easwee

1
Ben bu çözüm önermek stackoverflow.com/a/42256897/1834212 im çoğaltma önlemek için bağlantı gönderme im
Miguel

1
Birisi bunun hala işe yarayıp yaramadığını doğrulayabilir mi, çünkü ne zaman -webkit-backface-visibility` eklesem ve -webkit-transformgerçekten bir değişiklik göremiyorum ve krom geliştirici konsolunu açtığımda. Bu 2 css özelliklerinin üzerine, sanki üzerine yazılır gibi okşandığını görüyorum, ama değiller (boş css ve html). Krom artık onları kabul etmiyor gibi.
Kevin M

1
@KevinM -webkit- önekleri olmadan deneyin, bunlar artık standart CSS.
sampoh

91

Öğeye 3d dönüşüm uygulamanız gerekir, böylece kendi kompozit katmanını elde eder. Örneğin:

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

veya

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

Burada okuyabileceğiniz katman oluşturma ölçütleri hakkında daha fazla bilgi: Chrome'da Hızlandırılmış İşleme


Bir açıklama:

Örnekler (vurgulu yeşil kutu):

Öğenizde herhangi bir geçiş kullandığınızda, tarayıcının stilleri yeniden hesaplaması, ardından geçiş özelliği görsel olsa bile (örneklerimde bir opaklıktır) içeriğinizi yeniden düzenler ve son olarak bir öğeyi boyar:

ekran görüntüsü

Buradaki sorun, geçiş sırasında sayfadaki "dans etmeyi" veya "yanıp sönmeyi" etkileyebilen içeriğin yeniden düzenlenmesi. Ayarlara gidecek olursanız, "Bileşik katmanları göster" onay kutusunu işaretleyin ve bir öğeye 3B dönüştürmeyi uygulayın, turuncu kenarlıkla özetlenen kendi katmanı aldığını göreceksiniz.

ekran görüntüsü

Eleman kendi katmanını aldıktan sonra, tarayıcının geçiş sırasında katmanları yeniden düzenlemeden ve hatta boya işlemlerinden geçirmeden birleştirmesi yeterlidir, bu nedenle sorunun çözülmesi gerekir:

ekran görüntüsü


güzel iş! cevabınızın ne kadar ayrıntılı olduğunun bir nedeni var! ekran görüntüsü yakalamak / oklamak için hangi yazılımı kullanıyorsunuz?
kroe

Dostum üzerinde nokta !! Beni orada bir çok güçlükten kurtardı.

Bu benim için hile yaptı. İlk başta, animasyon yaptığım ebeveyn üzerinde translateZ kullanıyordum, ancak içindeki arka plan resmi spriteları hala bulanıktı. İçinde başka bir kapsayıcı ölçeklemek için Velocity.js kullanıyorum ve translateZ: 0.000001(bazı sonsuz #) ve voila gibi bir şey uyguladım ! Arka plan resimlerini bir kez daha keskinleştirin!
notacouch

Teşekkürler dostum. Bu benim sorunum üzerinde çalıştı. Bu arada, benim sorunum 90 derece döndürülmüş ve opaklık kullanarak solmaya geçişi olan bir elemanım var. geçişi tetiklerken, öğenin içeriği soldan 1 piksel hareket eder.
Lloyd aaron

42

Gömülü youtube iframe ile aynı sorun vardı (iframe öğesini ortalamak için Çeviriler kullanıldı). Yukarıdaki çözümlerin hiçbiri, sıfırlama css filtreleri ve sihir gerçekleşene kadar işe yaramadı .

Yapısı:

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

Stil [önce]

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

Stil [sonra]

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

9
filter: blur(0)benim için yaptım!
Nick

3
Bulanıklık ile inanılmaz O_o WTF? Neden varsayılan olarak açık?
Yuriy Polezhayev

Benim için de çözüm buydu. Kabul edilen cevap, dönüşüm özelliklerinde başka "tercüme" işlevleri kullanmayan insanlar için işe yarayabilir, ancak benim için çalışmadı.
Edward Coyle Jr.

Ön -webkit-ek daha önce gelmemeli mi? Daha Fazla Bilgi
Trevor Nestman

32

En son tarayıcıda test ettiğim deneysel yeni bir özellik CSS'yi önerdim ve iyi:

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

Bununla tarayıcı, oluşturma algoritmasını bilecek


Bu, arka yüz görünürlüğü, bulanıklık (0), translateZ benim için işe yaramazken bulanık dönen görüntülerimi düzeltti. Teşekkür ederim.
Louis Ameline

Bazı kullanım durumlarında sabit görüntüler, bazılarında korkunç bir şekilde kötüleşti :-) Her durumda ilginç!
Simon Steinberger

Daha derine inmek: image-rendering: -webkit-optimize-contrast;Chrome'daki sorunu çözer. Ancak, diğer tarayıcılarda, örneğin Firefox'taki görseller, oluşturma seçeneği ayarıyla çok daha kötü hale gelir. Bu nedenle, yalnızca Blink motorunda da çalışan WebKit yönergesini kullanıyorum. Teşekkürler!
Simon Steinberger

Bazı durumlarda, görüntülerin belirgin şekilde pürüzlü olmasına neden olur.
Bulanık

4

Bir elementin dönüştürülürken bulanıklaşmasının başka bir nedenini buldum. transform: translate3d(-5.5px, -18px, 0);Bir öğeyi yüklendikten sonra yeniden konumlandırmak için kullanıyordum , ancak bu öğe bulanıklaştı.

Yukarıdaki tüm önerileri denedim ama benim için çeviri değerlerinden biri için ondalık bir değer kullanarak oldu. Tam sayılar bulanıklığa neden olmaz ve tam sayıdan uzaklaştıkça bulanıklık daha da kötüleşti.

yani 5.5pxelemanı en çok, 5.1pxen az bulanıklaştırır .

Kimseye yardım etmesi için burada mırıldanacağımı düşündüm.


Teşekkürler, benim durumumda sorun buydu - ondalık piksel değerini değerlendirmesi gereken translateY (-50%) kullanıyordum.
b4tch

3

Sorunu adım adım kullanarak sorunsuz bir şekilde kandırdım, sorunsuz değil

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

Bir çözüm değil, bir hile ve her yerde uygulanamaz.

Açıklayamıyorum, ama benim için çalışıyor. Başka cevapların hiçbiri bana yardımcı olmaz (OSX, Chrome 63, Retina olmayan ekran).

https://jsfiddle.net/tuzae6a9/6/


Kemanda Parkinson gibi titriyor, ama benim durumumda çalıştı.
Tárcio Zemel

2

İkiye ölçekleme ve yarıya düşürme zoombenim için çalıştı.

transform: scale(2);
zoom: 0.5;

bu, görüntüler için kromda işe yarıyor gibi görünüyor. ne yazık ki o da koymak html de değiştirir.
Jack Davidson

2

Yaklaşık 10 olası çözümü denedim. Onları karıştırıp hala düzgün çalışmadılar. Sonunda her zaman 1 piksel sarsıntı vardı.

Filtre üzerindeki geçiş süresini azaltarak çözüm buluyorum.

Bu işe yaramadı:

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

Çözüm:

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

Bunu kemanda deneyin:

.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>

Umarım bu birine yardımcı olur.


1

Deneyin filter: blur(0);

Benim için çalıştı


Benim için de çalıştı, Chrome 63, 64 ve Vivaldi 1.13
GTCrais

1

Benim için, şimdi 2018'de. Sorunumu gideren tek şey (fareyle üzerine gelindiğinde bir görüntüden geçen beyaz bir titreme çizgisi) bunu, görüntü öğesini tutan bağlantı öğeme uygulamaktı. 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;
}

Evet! 'blur (0)' Chrome'da benim için düzeltiyor. Yeniden boyutlandırmada görüntüyü biraz bulanıklaştırır, ancak atlama / yeniden boyutlandırmadan daha az fark edilir
00-BBB

0
filter: blur(0)
transition: filter .3s ease-out
transition-timing-function: steps(3, end) // add this string with steps equal duration

Geçiş süresinin değerini .3seşit geçiş zamanlaması adımlarını ayarlayarak yardımcı oldum.3s


-7

Sadece aynı problemi aldım. Benim için çalışan ana öğeye göre konum ayarlamaya çalışın.


5
Bu çalışma hakkında bir demo var mı? Bunun nasıl yardımcı olacağı hakkında hiçbir fikrim yok
Zach Saucier

2
Cevabınızı düzenleyebilir ve gösterdiğiniz kodun ne yaptığını ve bu kodun soruyu neden / nasıl yanıtladığını açıklayabilirseniz, gerçekten yardımcı olabilir. Kod blokları kendi başlarına genellikle yararlı cevaplar değildir.
Lea Cohen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.