2016-12-16 105 views
14

iOS'ta kaydırma yaparken bir performans sorununu takip ediyorum. Hem touchstart hem de touchend'da, Safari geçersiz kılar ve stilleri yeniden hesaplar; bu da, kaydırma işleminden önce hafif bir gecikmeyle sonuçlanır. Safari'nin araçlarında bir "başlatıcı" sütun var, ancak testlerimde boş.iOS Safari'de "Stilleri Geçersiz" olarak neyin neden kaynaklandığını nasıl belirlerim?

denedim:

  • kaydırma elemanı üzerinde will-change: transform; veya transform: translateZ(0); ya uygulanıyor. Bu, Chrome'da büyük ölçüde yardımcı oldu, ancak iOS Safari için hiçbir şey yapmıyor. Profiler hala stillerin yeniden hesaplandığını bildiriyor.
  • (sadece jQuery ve benim testlerde Açısal çekirdek kod idi) profilcisine tarafından bildirilen bunu çoğaltmak için Paul Irish's list of things that force layout/reflow
  • içinde olup olmadığını görmek için position: fixed;
  • Javascript her satırı incelenmesi sahip DOM tüm elemanlarının çıkartılması Android’de Chrome’un yıldız araçlarını başarıyla kullanabildim. Sorun, yalnızca masaüstü Safari'den ayıklanabilen iOS Safari'yi etkiliyor.

Stillerimin neden iOS Safari'de geçersiz kılınacağını nasıl belirleyebilirim? Ben benzer bir sorunu debug zaman Layout timelines

+0

Bu, iOS'ta bilinen bir "sorun" dur, bkz: https://developers.google.com/web/updates/2013/12/300ms-tap-delay-gone-away. Azaltmak yardımcı olmak için Fastclick.js kullanın ve ben 8 daha sonra bu sürüm gecikme "özelliği" kaldırmak iOS sonra yeni sürümleri düşünüyorum. Umarım yardımcı olur! –

+0

Bunun aynı olduğundan emin değilim. Scrolling, sayfalar için daha basit bir DOM yapısına sahip daha hızlı yanıt veriyor, bu statik bir gecikme değil. Bunun stil geçersiz kılma ile ilgili olduğundan eminim. – adamdport

+0

Aynı sorunla karşı karşıya kalan ve çalışılan tek yol, her animasyonlu materyali tek bir sayfada incelemekti ve devre dışı bırakmayı deneyin ve yardımcı olup olmadığını kontrol et. Benim durumumda, reflow, iyonik olan bileşeninin "animated = 'true'" parametresinden kaynaklandı. –

cevap

2

Bu

Javascript timelines

benim için çalıştı.

  1. Bakmak istediğiniz etkinliğin başlangıç ​​zamanını öğrenin. Ekran görüntüsünüzün görünümündeyken ikinci sütundan son sütunda olmalıdır.
  2. "Çerçeveler" adlı "Olaylar" sekmesinin yanındaki sekmeyi tıklayın.
  3. En yakın eşleşen başlangıç ​​zamanına sahip kareyi bulun. (Bazen tam olarak değil)
  4. Çerçeveyi genişletmek, baktığınız etkinliğin hemen öncesinde/sonrasında gerçekleşen olayları görmenizi sağlar. Son konum "Konum" bölümünde sorunun neden kaynaklandığını görebilirsiniz. Doldurulursa, buna neden olan çizgiyi görmek için sağ oku tıklayabilirsiniz. AMA sütunda her zaman bir şey yok. Daha sonra, sorunun ne olduğunu bulmaya çalışmak için önceki olaylara bakmam gerekiyor.

Mükemmel değil, ancak bu yöntemle karşılaştığım sorunları ayıklayabildim. Bu yardımcı olur umarım!