CSS geçişi sırasında Webkit metin oluşturma değişikliğini nasıl önleyebilirim?


81

CSS dönüştürülmüş durumlar arasında geçiş yapmak için CSS geçişlerini kullanıyorum (temelde bir öğenin ölçeğini değiştiriyorum). Öğe geçiş yaparken, sayfadaki metnin geri kalanının (Webkit'te) geçiş tamamlanana kadar işlenmesini biraz değiştirmeye eğilimli olduğunu fark ettim.

Fiddle: http://jsfiddle.net/russelluresti/UeNFK/

Bunun, başlıklarımda olmadığını da fark ettim. -webkit-font-smoothing: antialiased özellik / değer çifti bulunan . Merak ediyorum, metnin varsayılan görünümünü (yazı tipi yumuşatma için "otomatik" değer) korumasının ve bir geçiş sırasında oluşturmayı değiştirmemesinin bir yolu var mı?

Metni açıkça "otomatik" değerini kullanacak şekilde ayarlamayı denedim, ancak bu hiçbir şey yapmıyor. Ayrıca yazı tipi yumuşatmayı "yok" olarak ayarlamanın geçiş sırasında oluşturmanın yanıp sönmesini de engellediğini not etmeliyim.

Herhangi bir yardım takdir edilmektedir.

Düzenle 1

OS X'te olduğumu not etmeliyim. Chrome'da Parallels'teki testime bakarken, iki farklı paragrafın farklı davrandığını görmedim, bu nedenle bu, Mac'lere özel bir sorun olabilir.


21. Ve Safari sürümü 6. Her iki tarayıcıda da oluyor, bu da bende tarayıcı değil Webkit olduğunu düşündürüyor.
RussellUresti

hem kenar yumuşatılmış hem de takma adlı paragraflar aynı davranışı sergiliyor. chrome Sürüm 23.0.1270.0 kanarya | 21.0.1180.89 m | 5.17 safari

Sanırım Chrome'un geliştirme sürümündesiniz. Yine de, OS bunda bir rol oynuyor olabilir. OSX kullandığımı not etmek için soruyu düzenleyeceğim.
RussellUresti

1
Bunun neden işe yaradığına dair kesinlikle hiçbir fikrim yok, ancak '-webkit-transform: translateZ (0);' to '.antialiased {} düzeltiyor gibi görünüyor. 'P {}' ye eklerseniz bile çalışır. Bunun neden işe yaradığını açıklayamadığım için, yanıt olarak vermek doğru gelmedi. Umarım yardımcı olur!
Christofer Vilander

@Christofer Bu onları tutarlı kılar - ancak hepsinin antialiased görünmesini sağlar (hepsi daha ince metinler). Kenarları yumuşatılmamış metnin (ilk paragraf) varsayılan stilinde kalmasını sağlamaya çalışıyorum (bu, kenar yumuşatılmış metinden biraz daha kalın görünüyor).
RussellUresti

Yanıtlar:


83

Sanırım bir çözüm buldum:

-webkit-transform: translateZ(0px);

Ana öğede donanım hızlandırmaya zorlamak sorunu çözüyor gibi görünüyor ...

DÜZENLE Açıklandığı gibi, bu hack yazı tipi düzeltmeyi devre dışı bırakır ve yazı tiplerinize, tarayıcınıza ve işletim sisteminize bağlı olarak metin oluşturmayı düşürebilir!


Yazı tipi düzeltmeyi denedim ve işe yaramadı. Bunu denedim, mükemmel çalıştı
locrizak

Bu, belirtilen bu sorun için bana istenen sonucu vermedi, ancak bu, yaşadığım diğer CSS geçiş sorunlarını düzeltmeye yardımcı oldu (geçiş öğesi içinde içeriği gizlerken / gösterirken garip yanıp sönen metin gibi).
RussellUresti

3
Benim için işe yaramıyor oysa -webkit-font-smoothing: antialiased; ve -webkit-arka yüz-görünürlük: gizli; İşler. Krediler buraya gidin stackoverflow.com/questions/11589985/…
F Lekschas

+1 harika, kendimi içinde bulduğum durumda işe yarayan tek yöntem bu
Larry

4
Bu, ilk etapta yazı tipi düzeltmeyi devre dışı bırakır. Yani geçişin başlangıcında yazı tipi yumuşatma, geçiş sırasında yazı tipi yumuşatma ve sonda yazı tipi yumuşatma yok. Yani yazı tipi yumuşatma değişikliği yok, aynı zamanda yazı tipi düzgünleştirme de yok.
yunzen

45

GÜNCEL Ağustos 2020

Artık alt piksel yazı tipi yumuşatmayı etkinleştirmek için Safari'yi bir medya sorgusuyla hedeflemenize gerek yok. Varsayılan iyidir.

Ancak varsayılan olarak alt piksel yazı tipi düzeltmeyi kullanmakla birlikte, önemli bir var merhem içinde sinek içinde Chrome'un yazı tipi yumuşatma bir arayan herkes için, metnin tutarlı render .

  1. Bu, Chrome'un koyu bir arka plan üzerinde açık renkli metin oluşturmasıdır karanlıkta ışık
  2. Bu, Chrome'un açık renkli bir arka plan üzerinde koyu metin oluşturmasıdır ışık üstüne karanlık

Yukarıdaki e harfindeki bütünün boyutuna bakın. Koyu bir arka plan üzerindeki Açık metin, açık bir arka plan üzerindeki koyu metinden (aynı css yazı tipi stiliyle) fark edilir derecede daha ağır bir şekilde oluşturulur.

Kullanıcının koyu / açık tema ayarına saygı duyan siteler için bir çözüm, Chrome'u karanlık modla sınırlı bir medya sorgusuyla hedeflemek ve aşağıdaki gibi alt piksel olmayan düzleştirmeye geçirmektir:

@media screen
and (-webkit-min-device-pixel-ratio: 0)
and (min-resolution: 0.001dpcm)
and (prefers-color-scheme: dark) {
  body {
    -webkit-font-smoothing: antialiased;
  }
}

Sonuç :

ışık üstüne karanlıkkoyu üzerine ışık antialiased

Açıkta açıkta koyuda açıkta koyuda oluşturma fark etmeksizin çok daha tutarlı bir metin ağırlığı.

Öncesi ve sonrasının yan yana karşılaştırmasına göz atın: karanlıkta ışıkkoyu üzerine ışık antialiased

-

GÜNCEL Mayıs 2018

-webkit-font-smoothing: subpixel-antialiasedartık Chrome'da hiçbir etkisi yoktur, ancak Safari'de yine de işleri büyük ölçüde geliştirir AMA SADECE RETINA'DA. Retina ekranlarında Safari'de bu olmadan metin ince ve tatsızdır, halbuki bununla birlikte metin uygun ağırlığa sahiptir. Ancak bunu Safari'de retina olmayan ekranlarda kullanırsanız (özellikle hafif değerlerde) metin bir felakettir. Bir medya sorgusu kullanmanızı şiddetle tavsiye ederiz:

@media screen and (-webkit-min-device-pixel-ratio: 2) {
  body {
    -webkit-font-smoothing: subpixel-antialiased;
  }
}

Daha -webkit-font-smoothing: subpixel-antialiasedince kenar yumuşatılmış metinden en azından kısmen kaçınmak istiyorsanız, mevcut en iyi çözüm açıkça ayarlamaktır .

--tl; dr--

Varsayılan yazı tipi oluşturmanın alt piksel kenar yumuşatma kullandığı hem Safari hem de Chrome ile, yukarıdaki önerilerde olduğu gibi, translateZ kullanarak bir dönüşümü veya hatta yalnızca bir ölçek geçişini kullanmak için GPU tabanlı oluşturmayı zorlayan herhangi bir CSS, Safari ve Chrome'un otomatik olarak "vazgeçmesine neden olur" "alt piksel kenar yumuşatmalı yazı tipi yumuşatmada ve bunun yerine, özellikle Safari'de çok daha hafif ve daha ince görünen kenar yumuşatılmış metne geçin.

Diğer yanıtlar, yazı tipi yumuşatmayı daha ince, yayılmamış metne basitçe ayarlayarak veya zorlayarak sabit bir görüntü oluşturmayı sürdürmeye odaklanmıştır. Bana göre translateZ veya backface gizli kullanmak, metin oluşturma kalitesini önemli ölçüde düşürür ve metnin tutarlı kalmasını istiyorsanız en iyi çözüm ve daha ince metin kullanmak için sorun yok -webkit-font-smoothing: antialiased. Bununla birlikte, açıkça ayarlamanın -webkit-font-smoothing: subpixel-antialiasedaslında bir etkisi vardır - metin yine de biraz değişir ve GPU'da oluşturulan geçişler sırasında neredeyse gözle görülür şekilde daha incedir, ancak bu ayar olmadan gittiği kadar ince değildir. Öyleyse öyle görünüyor ki, düz antiailased metne geçişi en azından kısmen engelliyor.


2
Harika bir yazı için teşekkürler!
Denis Gorbaçov

2
En iyi çözüm budur. Diğerlerinin tümü, OP'nin özellikle kaçınmasını
sunumunu bozar

Benim için hayat kurtarıcı! Teşekkürler. Bir css geçişinden sonra aniden alt piksel oluşturmaya geçmeyi önler. En azından opaklık geçişinde bu, yazı tipini geçiş sırasında bile alt piksel oluşturmada (teorik olarak her zaman varsayılan) tutar. Harika!
Garavani

bizim için en iyi çözüm! Teşekkür ederim
çekirdek

Teşekkürler, buna bir yıl önce rastladım ve her şeyi unutmuştum. Benim için açıklanan sorunu çözen tek çözüm budur.
Iain Collins

20

Hemen hemen her seferinde -webkit-backface-visibility kullanarak bir geçiş nedeniyle grafik sorunları (titreme / kekemelik / kesilme / vb.) ortaya çıkan unsurlar sorunu çözme eğilimindedir.


3
Bu (şu anda) doğru cevap. Bildiğim kadarıyla webkit-font-smoothing bir süre önce kaldırıldı, tekrar eklenmesi gerekiyordu, ancak şu anda Chrome'un en son sürümünde benim için çalışmıyor. TranslateZ hilesi artık işe yaramıyor gibi görünüyor. Sanırım bu her an tekrar değişebilir. : /
Mantriur

3
Bu, bazı metinlerin benim için bulanıklaşmasına neden oldu.
John

8

Donanım hızlandırma nedeniyle metin oluşturma değişikliklerini önlemek için aşağıdakilerden birini yapabilirsiniz:

  1. Tüm metni -webkit-yazı tipi yumuşatma: kenar yumuşatılmış olarak ayarlayın. Bu, metnin daha ince olduğu ve alt piksel yumuşatılmadığı anlamına gelir.

  2. Donanım hızlandırmadan etkilenen metnin alt piksel yumuşatmasının (varsayılan yazı tipi yumuşatma türü) olmasını istiyorsanız, bu metni bir girişin içine kenarlıksız ve devre dışı bırakarak koymak, bu alt pikselin yumuşatılmış olmasını sağlayacaktır (en azından Mac OS X'te Chrome'da). Bunu diğer platformlarda test etmedim, ancak alt piksel kenar yumuşatma önemliyse, en azından bu numarayı kullanabilirsiniz.


Win8.1 ve Chrome 47'de 2. seçeneği (giriş öğesi ile hile) test ettim ve çalışmıyor.
Paya


3

Bu benim için çalıştı. Umarım yardımcı olur. Diğer stackoverflow postasında bulundu.

-webkit-font-smoothing:antialiased;
-webkit-backface-visibility:hidden;

1

Oluşturma değişikliğini önlemek için font-smoothing: antialiased(veya none) ayarlamanız gerekir .

Alt piksel yazı tipi oluşturmayı devre dışı bırakan tarayıcı, muhtemelen donanım hızlandırmasının bir yan etkisidir. Oluşturduğunuz arka plan sürekli değiştiğinde, her çerçevenin tüm arka plan katmanlarına göre kontrol edilmesi gerektiğinden metin ayrı bir katmanda oluşturulamaz. Bu, performansı ciddi şekilde düşürebilir.

Elma üzerinde sık sık devre dışı alt piksel font-yumuşatma onların kendi sitelerinde.


Yazı tipi yumuşatmayı kenar yumuşatmaya ayarlamadaki sorun, metnin istediğim gibi görünmemesidir. Yazı tipi yumuşatmayı "otomatik" (daha kalın görünüm) olarak ayarlamanın görsel efektini istiyorum - ancak bunu yaptığınızda, metin herhangi bir geçiş sırasında kayacaktır. Bu yüzden amacım her zaman "otomatik" in cesur görünümünü korumak.
RussellUresti

1
Donanım hızlandırma kullanmayarak bunun üstesinden gelebilirsiniz. JQuery'de bir zamanlayıcı kullanın ve geçişi elle yapın (CSS geçişi olmadan). Yine de tavsiye edeceğime emin değilim, çünkü performans ve pürüzsüzlük daha kötü olacak.
Henrik

Doğru, onu canlandırmak için jQuery kullanabilirim ... Başka bir çözüm yoksa tek çözüm bu olabilir.
RussellUresti

1

Yukarıdaki çözümlere ek olarak ( -webkit-transform: translateZ(0px)öğede ve -webkit-font-smoothing: antialiasedsayfada) bazı öğeler yine de kötü davranabilir. Benim için bir giriş öğesindeki yer tutucu metindi: Bunun için şunu kullanın:position:relative


-1

Ben de aynı sorunu yaşadım. Dikkatli oku:

Öğe geçiş yaparken, sayfadaki metnin geri kalanının (Webkit'te) geçiş tamamlanana kadar işlenmesini biraz değiştirmeye eğilimli olduğunu fark ettim .

Yukarıdaki çözümlerin hiçbiri işe yaramadı. Ancak, ayar (gibi şeyler)

#myanimation { -webkit-transform: translateZ(0px); }

animasyonun çalıştığı öğede .

Animasyonlu öğeyi GPU katmanına alarak, onu sayfa oluşturma işleminin normal akışından çıkarırsınız (örneğin, z-endeksi gibi şeyler de artık çalışmayacaktır). Bir yan etki olarak, animasyon ve sayfanın geri kalanı artık birbirini etkilemeyecek.

Yazı tipi oluşturma işleminizi etkiliyorsa, bunu yalnızca animasyonlu öğe için yapar tabii ki. Chrome'umda farkı görmüyorum.


Düzeltilmiş durumdayım. Sayfanın geri kalanında ve ayrıca translateZ (0) 'ın uygulanmadığı yerlerde yazı tipi oluşturmada değişiklikler görüyorum.
commonpike

Bu, bulanıklaşan yazı tipi simgelerim olduğunda benim için çalışan tek şeydi. Dönüşümü canlandırılan bölümlere uyguladı ve sorunu çözdü.
Bill

Dostum, bu 2 yıl önce zaten cevaplanmıştı. Hemen yukarıda ... Tam olarak aynı cevap / kod.
NiCk Newman

evet, benim tek noktam , sayfadaki diğer öğelerde değişiklik yapılmasını önlemek için animasyonun-webkit-transform bulunduğu öğenin üzerine koymanız gerektiğiydi . ama açıklandığı gibi, bir süre çalıştı ve daha sonra sayfanın bitlerini değiştirdiğimde çalışmayı bıraktı.
commonpike
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.