Dokunarak kaydırmayı varsayılan olarak hızlı yapma

Dave Tapuska
Dave Tapuska

Kaydırma duyarlılığının, kullanıcının mobil cihazda web sitesiyle etkileşiminde kritik öneme sahip olduğunu, ancak dokunma etkinliği işleyicilerin çoğu zaman ciddi kaydırma performansı sorunlarına neden olduğunu biliyoruz. Chrome, bu durumu düzeltmek için dokunma etkinliği dinleyicilerinin pasif olmasına ({passive: true} seçeneğini addEventListener() seçeneğine iletir) ve işaretçi etkinlikleri API'sini göndererek bu durumu ele alıyor. Bunlar, yeni içerikleri, kaydırmayı engellemeyen modeller halinde oluşturmak için harika özelliklerdir, ancak geliştiriciler bazen bunları anlamakta ve benimsemekte zorlanmaktadır.

Geliştiricilerin, tarayıcı davranışıyla ilgili gizli ayrıntıları anlamalarına gerek kalmadan, web'in varsayılan olarak hızlı olması gerektiğine inanıyoruz. Chrome 56'da, genellikle geliştiricinin amacıyla çalıştığı durumlarda dinleyicileri varsayılan olarak pasif hale getiririz. Bu sayede, siteler üzerindeki olumsuz etkiyi en aza indirirken kullanıcı deneyimini büyük ölçüde iyileştirebileceğimize inanıyoruz.

Nadir durumlarda bu değişiklik, istenmeyen kaydırmaya neden olabilir. Bu durum genellikle kaydırmanın olmaması gereken öğeye bir dokunma işlemi: none stili uygulanarak kolayca çözülebilir. Bu durumdan etkilenip etkilenmediğinizi anlamak ve bu konuda neler yapabileceğinizi öğrenmek, ayrıntılı bilgiyi okumaya devam edin.

Arka plan: İptal Edilebilir Etkinlikler sayfanızı yavaşlatır

touchstart veya ilk touchmove etkinliklerinde preventDefault() çağrısı yaparsanız kaydırmayı engellemiş olursunuz. Sorun, çoğu zaman dinleyicilerin preventDefault() çağrısı yapmaması, ancak bunun emin olmak için tarayıcının etkinliğin bitmesini beklemesidir. Geliştirici tarafından tanımlanan "pasif etkinlik işleyiciler" bu sorunu çözer. Etkinlik işleyicinizde üçüncü parametre olarak {passive: true} nesnesine sahip bir dokunma etkinliği eklediğinizde, tarayıcıya touchstart işleyicisinin preventDefault() çağrısı yapmayacağını ve tarayıcının, işleyiciyi engellemeden kaydırma işlemini güvenli bir şekilde gerçekleştirebileceğini bildirmiş olursunuz. Örneğin:

window.addEventListener("touchstart", func, {passive: true} );

Müdahale

Asıl motivasyonumuz, kullanıcı ekrana dokunduktan sonra ekranı güncellemek için gereken süreyi kısaltmak. Dokunmayla başlatma ve dokunarak taşımanın kullanımını anlamak için kaydırma engelleme davranışının ne sıklıkta gerçekleştiğini belirleyen metrikler ekledik.

Kök hedefe (pencere, doküman veya gövde) gönderilen iptal edilebilir dokunma etkinliklerinin yüzdesine baktık ve bu dinleyicilerin yaklaşık% 80'inin kavramsal olarak pasif olduğunu ancak bu şekilde kaydedilmediğini belirledik. Bu sorunun ölçeği dikkate alındığında, bu etkinlikleri otomatik olarak "pasif" hale getirerek, geliştirici herhangi bir işlem yapmadan kaydırmayı iyileştirmek için büyük bir fırsat olduğunu fark ettik.

Bu da bizi, müdahalemizi şu şekilde tanımlamaya yöneltti: Dokunmayla başlatma veya dokunarak taşıma dinleyicisinin hedefi window, document veya body ise passive varsayılan olarak true değerine ayarlıyoruz. Bunun anlamı şudur:

window.addEventListener("touchstart", func);

şuna eşdeğer hale gelir:

window.addEventListener("touchstart", func, {passive: true} );

Artık işleyici içindeki preventDefault() çağrıları yoksayılacak.

Aşağıdaki grafikte, bir kullanıcının ekranı kaydırmak için ekrana dokunmasından, ekranın güncellendiği zamana kadar kaydırmanın en üstteki% 1'lik kısmı için geçen süre gösterilmektedir. Bu veriler, Android için Chrome'daki tüm web siteleri içindir. Müdahale etkinleştirilmeden önce kaydırmaların% 1'i 400 ms'den biraz daha fazla sürüyordu. Bu süre, Chrome 56 Beta'da şu anda 250 ms'nin biraz üzerine, yani yaklaşık %38 oranında bir düşüşe düşürüldü. Gelecekte tüm touchstart ve touchmove dinleyicileri için pasif true değerini varsayılan olarak ayarlamayı ve bu değeri 50 ms'nin altına düşürmeyi umuyoruz.

İlk% 1 kaydırma süreleri grafiği

Kırılma ve Yardım

Vakaların büyük çoğunluğunda herhangi bir kesinti yaşanmayacaktır. Ancak bozulma meydana geldiğinde en yaygın belirti, kaydırmanın siz istemediğiniz zaman olmasıdır. Nadiren de olsa, geliştiriciler beklenmedik tıklama etkinlikleri (touchend işleyicide preventDefault() olmadığı zaman) de fark edebilirler.

Chrome 56 ve sonraki sürümlerde Geliştirici Araçları, müdahalenin etkin olduğu bir etkinlikte preventDefault() komutunu çağırdığınızda günlüğe bir uyarı kaydeder.

touch-passive.html:19 Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

Uygulamanız, preventDefault çağrısının defaultPrevented özelliği üzerinden herhangi bir etkisinin olup olmadığını kontrol ederek böyle bir durumun meydana gelip gelmediğini kontrol edebilir.

Etkilenen sayfaların büyük çoğunluğunun, mümkün olduğunda Touch-action CSS özelliğini uygulayarak nispeten daha kolay bir şekilde düzeltildiğini tespit ettik. Bir öğenin içinde tüm tarayıcının kaydırma ve yakınlaştırma yapmasını önlemek istiyorsanız bu öğeye touch-action: none uygulayın. Yatay bir bandınız varsa kullanıcının normal şekilde dikey kaydırma ve yakınlaştırma yapabilmesi için ona touch-action: pan-y pinch-zoom uygulamayı düşünün. Dokunma işleminin doğru şekilde uygulanması, Masaüstü Edge gibi Dokunma Etkinlikleri'ni değil, İşaretçi Etkinlikleri'ni destekleyen tarayıcılarda zaten gereklidir. Mobil Safari'de ve dokunma işlemini desteklemeyen eski mobil tarayıcılarda, Chrome tarafından yoksayılacak olsa bile dokunma dinleyicileriniz preventDefault işlevini çağırmaya devam etmelidir.

Daha karmaşık durumlarda aşağıdakilerden birini kullanmanız da gerekebilir:

  • touchstart işleyiciniz preventDefault() çağırırsa tıklama etkinliklerinin ve diğer varsayılan dokunma davranışlarının oluşturulmasını engellemeye devam etmek için ilişkili dokunma uç işleyicilerinden depreventDefault() çağrıldığından emin olun.
  • Varsayılan davranışı geçersiz kılmak için {passive: false} öğesini addEventListener() işlevine son olarak geçirmek (ve kullanılması önerilmez). Kullanıcı Aracısı EventListenerOptions'ı destekliyorsa özellik algılama özelliğini kullanmanız gerekeceğini unutmayın.

Sonuç

Chrome 56'da kaydırma işlemi birçok web sitesinde önemli ölçüde daha hızlı başlar. Bu değişikliğin sonucunda, çoğu geliştiricinin fark edeceği tek etki budur. Geliştiriciler bazı durumlarda istenmeyen kaydırma hareketi fark edebilirler.

Mobil Safari için bunu yapmak yine de gerekli olsa da, Chrome'da bunun yerine getirileceği artık garanti edilmediğinden, web siteleri touchstart ve touchmove dinleyicileri içinde preventDefault() çağrısı yapmayı kabul etmemelidir. Geliştiriciler, dokunma etkinliği gerçekleşmeden önce tarayıcıya bildirim gönderilmesi için kaydırma ve yakınlaştırmanın devre dışı bırakılması gereken öğelere touch-action CSS özelliğini uygulamalıdır. Bir dokunma işleminin varsayılan davranışını (ör. bir tıklama etkinliğinin oluşturulması) engellemek için touchend işleyicisinin içinde preventDefault() yöntemini çağırın.