Anlık Etkinlikleri Kaydırma

Adam Argyle
Adam Argyle

Chrome 129'dan itibaren JavaScript'teki scrollSnapChange ve scrollSnapChanging etkinliklerini kullanabilirsiniz. Yerleşik anlık görüntü etkinlikleri uygulanarak önceden görülemeyen anlık durum üzerinde işlem yapılabilir, doğru zamanda ve her zaman doğru şekilde işlem yapılabilir. Bu etkinliklerin olmadığı bir rahatlık yaşadığınız anlar değil.

scrollSnapChange öncesinde, hangi öğenin kaydırma bağlantı noktasından geçtiğini bulmak için bir kesişim gözlemleyicisi kullanılıyordu. Ancak nelerin tutturulduğunu belirlemek birkaç koşulla sınırlıydı. Örneğin, tutturma öğelerinin kaydırma bağlantı noktasını mu, yoksa kaydırma bağlantı noktasının büyük kısmını mı doldurduğunu tespit edebilirsiniz. Bunu yapmak için kaydırma alanının kesişen öğelerini gözlemler, ardından kaydırma alanının çoğunluğunu kaplayan öğeye göre bunun tutturma hedefi olduğunu varsayın, ardından scrollend öğesini bekledikten sonra tutturulan öğeye (tutturulan hedef) göre işlem yapın.

Ancak, scrollSnapChanging tarihinden önce, tutturma hedefinin ne zaman veya neye göre (ör. bir kaydırma kaydırma hareketiyle) değiştiğini bilmek imkansızdı.

İçinde numaralandırılmış kutular bulunan yatay bir kaydırma çubuğu, tutturulma hedefleri olarak gösteriliyor. Sol tarafta, SnapTargetInline'ın mavi renkle vurgulandığı ScrollSnapChange etkinliklerinin gerçek zamanlı bir günlüğü bulunmaktadır. Sağda, pixelTargetInline'ı griyle vurgulayan ScrollSnapUnlock etkinliklerinin gerçek zamanlı bir günlüğü bulunmaktadır.

Deneyin
https://codepen.io/web-dot-dev/pen/jOjaaEP

Güzel bir haberimiz var. Bu yeni etkinlikler sayesinde bu bilgilere hızlı ve kolay bir şekilde erişebilirsiniz. Bu özellik, kaydırma tutturma etkileşimlerinin mevcut kapasitesinin ötesine geçmelerini sağlar ve kaydırma tutturma ilişkilerinin ve yeni kullanıcı arayüzü geri bildirim senaryolarının düzenlenmesine olanak tanır.

scrollSnapChange

Bu etkinlik yalnızca bir kaydırma hareketi, yeni bir tutturulan hedefin yerleştirilmesiyle sonuçlandığı takdirde ve aşağıdaki sırada tetiklenir

  1. Kaydırma dinlendikten sonra.
  2. scrollend tarihinden önce.

Bu etkinlik scrollend tarihinden hemen önce, kaydırma tamamlandığında ve yalnızca yeni bir tutturma hedefi üzerine durulmuşsa tetiklenir. Bu, kaydırma hareketi tamamlandığında etkinliğin tembel veya tam zamanında görünmesine neden olur.

scroller.addEventListener('scrollsnapchange', event => {
  console.log(event.snapTargetBlock);
  console.log(event.snapTargetInline);
})

scroller.onscrollsnapchange = event => {
  console.log(event.snapTargetBlock);
  console.log(event.snapTargetInline);
}

Etkinlik, tutturulan öğeyi etkinlik nesnesinde snapTargetBlock ve snapTargetInline olarak gösterir. Kaydırma çubuğu yalnızca yatay ise snapTargetBlock özelliği null olur. Özelliğin değeri, öğe düğümü olur.

ScrollSnapChange için benzersiz ayrıntılar

Kullanıcı hareketini bırakana kadar tetiklenmez

Hâlâ ekranda bulunan bir parmak veya dokunmatik yüzeyde yer alan parmaklar, kullanıcının hareketinin kaydırma işleminin bitmediğini belirtir. Kaydırma sona ermemiştir. Bu, kaydırma hedefinin henüz değişmediği, kullanıcı hareketinin tamamlanmasını beklediği anlamına gelir.

Tutturma hedefi değişmediyse tetiklenmez

Etkinlik anlık değişiklik içindir ve tutturma hedefi değişmediyse kaydırma çubuğu bir kullanıcı tarafından etkileşimde bulunulmuş olsa bile etkinlik tetiklenmez. Ancak kullanıcı aslında kaydırma yaptığından, kaydırma tamamlandığında scrollend etkinliği tetiklenmeye devam ediyor.

scrollSnapChanging

Tarayıcı, kaydırma hareketinin yeni bir tutturma hedefine sahip olduğuna veya bununla sonuçlanacağına karar verdiği anda bu etkinlik tetiklenir. Heyecanlı bir şekilde ve kaydırma sırasında etkinleşir.

scroller.addEventListener('scrollsnapchanging', event => {
  console.log(event.snapTargetBlock);
  console.log(event.snapTargetInline);
})

scroller.onscrollsnapchanging = event => {
  console.log(event.snapTargetBlock);
  console.log(event.snapTargetInline);
}

Etkinlik, tutturulan öğeyi etkinlik nesnesinde snapTargetBlock ve snapTargetInline olarak gösterir. Kaydırıcı yalnızca dikeyse snapTargetInline özelliği null olur. Özelliğin değeri, öğe düğümü olur.

ScrollSnapSwap'e ilişkin benzersiz ayrıntılar

Kaydırma hareketi sırasında erkenden ve sık sık tetiklenir

Tam kullanıcı kaydırma hareketini bekleyen scrollSnapChange işlevinin aksine bu etkinlik, kullanıcı parmağıyla veya dokunmatik yüzeyle kaydırırken istekle tetiklenir. Parmağını kaldırmadan yavaşça kaydıran bir kullanıcı düşünün. Kullanıcı birden çok olası tutturma hedefi üzerinde kaydırdığı sürece scrollSnapChanging, hareket sırasında birden çok kez etkinleşir. Kullanıcı her kaydırdığında, tarayıcı, serbest bırakma işleminden sonra yeni bir tutturma hedefine dayanacağını belirlerse etkinlik size hangi öğenin olduğunu bildirmek için etkinleşir.

Yeni tutturma hedefine giden yolda tüm tutturma hedeflerini tetiklemez

Ayrıca, kullanıcının aynı anda birden çok tutturma hedefini kapsayan kaydırma hareketi yaptığı bir kaydırma hareketini de değerlendirin. bu etkinlik, temel alınacak hedefle bir kez tetiklenecek. Bu nedenle, hızlı bir hedeftir ve israf edici değildir; tutturma hedefini en kısa sürede sağlar.

Kullanım alanları ve örnekler

Bu etkinlikler birçok yeni kullanım alanına imkan sağlarken mevcut modellerin uygulanmasını çok daha kolay hale getirir. Bunun önemli bir örneği, snap tetiklenen animasyonu etkinleştirmektir. Tutturma öğesini, anlık öğenin alt öğelerini veya tutturulma hedefi olduğunda ilişkili bilgileri bağlamsal olarak gösterme.

Aşağıdaki kalıplarda hemen üretken olmanıza yardımcı olacak bazı kullanım alanları gösterilmektedir.

Referansı vurgula

Bu örnek, paylaşılan referansı öne çıkarır veya görsel olarak odaklar.

scroller.onscrollsnapchange = event => {
  scroller.querySelector(':scope .snapped')?.classList.remove('snapped')
  event.snapTargetInline.classList.add('snapped')
}
.
https://codepen.io/web-dot-dev/pen/dyBZZPe

Tutulan öğenin başlığını göster

Bu örnekte, alınan öğenin başlığı gösterilmektedir. Bu demoda her iki etkinlik de yer aldığından, scrollSnapChange ile scrollSnapChanging arasındaki zamanlama ve kullanıcı deneyimi farklarını görebilirsiniz.

Değiştirme
https://codepen.io/web-dot-dev/pen/wvLPPBL

Değiştir'i tıklayın
https://codepen.io/web-dot-dev/pen/QWXOObw

Tutulan sunu slaytının alt öğeleri bir kez canlandırılıyor

Bu örnek, yeni bir slaytın ne zaman açıldığını ve üzerinde durulduğunu gösterir, bu da içeriği bir kez canlandırmak için çok iyi bir zamandır.

document.addEventListener('scrollsnapchange', event => {
  event.snapTargetBlock.classList.add('seen')
})
.
https://codepen.io/web-dot-dev/pen/rNEYYVj

Kaydırma çubuğunda hem x hem de y'ye tutturma

Kaydırma tutturma, yatay ve dikey kaydırmaya olanak tanıyan kaydırıcılarda çalışır. Siz ızgarada gezinirken bu demoda hem scrollSnapChanging hem de scrollSnapChange hedefleri gösterilmektedir. Bu demo, tarayıcının yapıştırdığı öğenin her zaman sizin olduğunu düşündüğünüz öğe olmayabileceğini gösterir.

Yatay ve dikey kaydırma çubuğunda karelerden oluşan bir ızgara gösteriliyor. Kesik çizgili kenarlık, slideSnapSwap hedefini temsil eder ve düz kenarlık, slideSnapChange hedefidir. Kırmızı, starTargetInline'ı, mavi iseSnapTargetBlock'u temsil eder.

https://codepen.io/web-dot-dev/pen/qBzVVdp

Bağlı iki kaydırma çubuğu

Bu demoda, biri üst düzey bir bağlantı listesi, diğeri ise gerçek sayfalı içerik olan iki kaydırma tutturma kapsayıcısı içerir. Yeni scrollSnapChanging etkinliği, bunların tutturma durumlarını çift yönlü olarak bağlamayı önemsiz hale getirir. Böylece her zaman senkronize olurlar.

https://codepen.io/web-dot-dev/pen/YzoEEXj

OKLCH renk seçici

Bu demoda her biri OKLCH'de farklı bir renk kanalını temsil eden 3 kaydırma çubuğu vardır. Tutturulan öğe, ilgili radyo grubuyla senkronize edilir ve veriler, girişleri sarmalayan bir formdan alınabilir. Fare veya dokunma kullanıcısı olarak, istediğiniz değere kaydırabilirsiniz. Klavye kullanıcıları sekme ve ok tuşlarını kullanabilir. Ekran okuyucular için bu yalnızca bir formdur.

ScrollSnapSwap, tutturulan öğeyi durumla istekli bir şekilde senkronize etmek için kullanılır. ScrollSnapChange ise kullanıcı girişinin uygulandığı etkilenen renk kanalı başlığını canlandırmak için kullanılır.

https://codepen.io/web-dot-dev/pen/OJeOOVG

Şaşırtıcı animasyonlu merkezler tutturma

Bu demo, scrollsnapchange özelliğini kullanarak kaydırmanın tetiklediği geçişlerle kaydırma tutturma deneyimini kademeli olarak iyileştiriyor.

Aşağıdaki JavaScript kodu ile etkinlik desteği olup olmadığını kontrol edin:

if ('onscrollsnapchange' in window) {
  // ok to use snap change
}
.
https://codepen.io/web-dot-dev/pen/MWMOOae

Kaydırılabilir cetvel girişi

Bu demoda, sayı girişi için uzunluk seçmenin alternatif bir yolu olarak kaydırılabilir bir cetvel bulunmaktadır. Değerleri doğrudan sayı girişine girin veya boyuta gidin. Değişen etkinlik, kullanıcının hareketi sırasında seçimi temizlemek için kullanılır. Değişiklik etkinliği ise durumu güncellemek ve kullanıcının seçimini pekiştirmek için kullanılır.

https://codepen.io/web-dot-dev/pen/LYKOOpd

Kapak akışı

Bu demo, ünlü macOS kapak akışını Bramus Van Damme'ın kaydırmaya dayalı mükemmel animasyon tasarımına dayanır (eğitim videosu da). Benzersiz olarak, albüm başlığını gizlemek için scrollSnapChanging, başlığı sunmak için scrollSnapChange kullanılır. Etkinlikler, eski başlığın merakla gizlenmesi ve yeni içeriğin tembel bir şekilde sunulmasına yardımcı oluyor.

https://codepen.io/web-dot-dev/pen/Bagmmog

Yaratıcılığınızı artıracak daha fazla fikir

Hangi öğenin tutturulacağını ve hangilerinin aktif olarak tutturulacağını bilmek artık çok basit olduğundan, pek çok yeni olasılık var! Yaratıcılığı teşvik etmenize yardımcı olacak fikirlerin ve ek kullanım alanlarının bir listesini aşağıda bulabilirsiniz:

  • Oluşturmayı veya veri getirmeyi tetikleme olarak bilinen geç yüklemeyi tetikleme.
  • Daha büyük bir resimle bağlantılı film şeridi küçük resimleri.
  • Anlık video küçük resmi için video fragmanının oynatma/duraklatma durumunu değiştirmek.
  • Analytics izleme
  • Kaydırmalı Anlatım
  • Wheel of Fortune Kullanıcı Arayüzü/Kullanıcı Deneyimi
  • Snap hedefine sabit bir ipucu verilir.
  • Fotoğrafını çekmek için dokun
  • Göstermek için tuttur
  • Fotoğraf çekildiğinde ses çıkar
  • Kullanıcı arayüzünü kaydırma
  • Kaydırılabilir sekmeler veya bantlar

Diğer çalışmalar

Chrome ekibi bu yeni API'lerle oluşturduğunuz şeyleri öğrenmekten heyecan duyuyor ve bunun kaydırılabilir deneyimlerinizi kolaylaştırmaya yardımcı olmasını umuyor.

Kaynaklar: