Web'de Instagram Hikayeleri'ne benzer bir deneyimin nasıl oluşturulacağına dair temel bir genel bakış.
Bu gönderide, web için duyarlı, klavyeyle gezinmeyi destekleyen ve tüm tarayıcılarda çalışan bir Hikayeler bileşeni oluşturma konusundaki düşüncenizi paylaşmak istiyorum.
Bu Hikayeler bileşenini kendiniz oluşturma konusunda uygulamalı bir açıklamalı kılavuz tercih ederseniz Hikayeler bileşeni codelab'ine göz atın.
Videoyu tercih ediyorsanız bu yayının YouTube sürümünü burada bulabilirsiniz:
Genel Bakış
Hikayeler kullanıcı deneyiminin en popüler iki örneği Snapchat Hikayeler ve Instagram Hikayeler'dir (filolardan bahsetmiyorum). Genel kullanıcı deneyimi terimleriyle, Hikayeler genellikle birden fazla abonelik arasında gezinmek için yalnızca mobil cihazlarda kullanılan, dokunmaya dayalı bir modeldir. Örneğin, Instagram'da kullanıcılar bir arkadaşının hikayesini açar ve içindeki resimleri gözden geçirir. Genellikle bunu çok sayıda arkadaşıyla yapıyorlar. Kullanıcı, cihazın sağ tarafına dokunarak arkadaşının bir sonraki hikayesine atlayabilir. Kullanıcı, sağa kaydırarak farklı bir arkadaşa atlayabilir. Hikayeler bileşeni, atlı karıncaya oldukça benzer ancak tek boyutlu bir dizi yerine çok boyutlu bir diziye gitmenize olanak tanır. Her bir bandın içinde bir atlı karınca olması gibi. 🤯
Görev için doğru araçları seçme
Genel olarak, birkaç önemli web platformu özelliği sayesinde bu bileşeni oluşturmanın oldukça kolay olduğunu gördüm. Bu konulara değinelim.
CSS Izgarası
İçerikleri düzenlemenin bazı güçlü yollarına sahip olduğu için CSS Grid, düzenimiz için çok zor bir iş değildi.
Arkadaşlar düzeni
Birincil .stories
bileşen sarmalayıcımız, mobil öncelikli yatay bir kaydırma görünümüdür:
.stories {
inline-size: 100vw;
block-size: 100vh;
display: grid;
grid: 1fr / auto-flow 100%;
gap: 1ch;
overflow-x: auto;
scroll-snap-type: x mandatory;
overscroll-behavior: contain;
touch-action: pan-x;
}
/* desktop constraint */
@media (hover: hover) and (min-width: 480px) {
max-inline-size: 480px;
max-block-size: 848px;
}
grid
düzenini inceleyelim:
- Mobil cihazlarda görüntü alanını
100vh
ve100vw
ile açıkça doldurur ve masaüstünde boyutu kısıtlarız /
, satır ve sütun şablonlarımızı ayırır.auto-flow
,grid-auto-flow: column
olarak çevrilir- Otomatik akış şablonu
100%
'tür. Bu durumda, kaydırma penceresi genişliğidir.
Mobil telefonda, satır boyutunu görüntü alanı yüksekliği, her sütunu ise görüntü alanı genişliği olarak düşünün. Snapchat Hikayeleri ve Instagram Hikayeleri örneğine devam edersek her sütun bir arkadaşınızın hikayesi olur. Arkadaş hikayelerinin görüntü alanının dışında devam etmesini istiyoruz. Böylece, kaydırabileceğimiz bir yer olur. HTML'nizi her arkadaş hikayesi için düzene sokmak üzere gereken sayıda sütun oluşturan ızgara, bizim için dinamik ve duyarlı bir kaydırılabilir kapsayıcı oluşturur. Izgara, tüm efekti merkezileştirmemizi sağladı.
Birleştirme
Her arkadaş için hikayelerinin sayfalandırmaya hazır durumda olması gerekir. Animasyon ve diğer eğlenceli desenlere hazırlanırken bir yığın seçtim. Yığın derken, sandviçe yandan değil de yukarıdan baktığınızı kastediyorum.
CSS ızgara ile, satırların ve sütunların bir takma adı ([story]
) paylaştığı tek hücreli bir ızgara (ör.kare) tanımlayabiliriz. Ardından her alt öğe, bu takma adlı tek hücreli alana atanır:
.user {
display: grid;
grid: [story] 1fr / [story] 1fr;
scroll-snap-align: start;
scroll-snap-stop: always;
}
.story {
grid-area: story;
background-size: cover;
…
}
Bu sayede HTML'imiz yığın sıralamasını kontrol eder ve tüm öğeleri akış içinde tutar. absolute
konumlandırması veya z-index
ile ilgili herhangi bir işlem yapmamıza ve height: 100%
veya width: 100%
ile doğru kutuyu seçmemize gerek olmadığını fark edin. Üst ızgara, hikaye resmi görüntü alanının boyutunu zaten tanımladığı için bu hikaye bileşenlerinin hiçbirine alanı doldurması söylenmesi gerekmedi.
CSS Kaydırma Kilitleme Noktaları
CSS Kaydırma Kilitleme Noktaları spesifikasyonu, kaydırma sırasında öğeleri görüntü alanına kilitlemeyi kolaylaştırır. Bu CSS özellikleri mevcut olmadan önce JavaScript kullanmanız gerekiyordu ve bu da en hafif tabirle zordu. Bunların nasıl kullanılacağına dair mükemmel bir döküm için Sarah Drasner'ın CSS Scroll Snap Points ile Tanışın başlıklı makaleye göz atın.
.stories { display: grid; grid: 1fr / auto-flow 100%; gap: 1ch; overflow-x: auto; scroll-snap-type: x mandatory; overscroll-behavior: contain; touch-action: pan-x; }
.user { display: grid; grid: [story] 1fr / [story] 1fr; scroll-snap-align: start; scroll-snap-stop: always; }
Kaydırma Tutturma Puanları'nı birkaç nedenden dolayı seçtim:
- Ücretsiz erişim. Kaydırma Tutturma Noktaları spesifikasyonunda, Sol Ok ve Sağ Ok tuşlarına basıldığında, varsayılan olarak tutturma noktalarından geçilmesi gerektiği belirtilmektedir.
- Gelişen bir özellik. Kaydırma sabitleme noktaları özelliği sürekli olarak yeni özellikler ve iyileştirmeler alıyor. Bu da Hikayeler bileşenimin bundan sonra daha da iyi olacağı anlamına geliyor.
- Uygulama kolaylığı. Kaydırma Tutturma Noktaları, pratik olarak dokunma merkezli yatay sayfalara ayırma kullanım alanı için oluşturulmuştur.
- Platform tarzında serbest hareket. Her platform, kaydırma ve durma stilini kendi tarzında uygular. Bu, kaydırma ve durma stili garip olabilecek normalleştirilmiş ataletin aksinedir.
Tarayıcılar arası uyumluluk
Opera, Firefox, Safari ve Chrome'un yanı sıra Android ve iOS'te test ettik. Özellikler ve destek açısından farklılıklar tespit ettiğimiz web özelliklerinin kısa bir özetini aşağıda bulabilirsiniz.
Ancak bazı CSS'ler geçerli değil. Bu nedenle, bazı platformlar şu anda kullanıcı deneyimi optimizasyonlarını yapamıyor. Bu özellikleri yönetmek zorunda kalmamak beni memnun etti ve bu özelliklerin zaman içinde diğer tarayıcılara ve platformlara ulaşacağından eminim.
scroll-snap-stop
Bantlar, CSS Scroll Snap Points spesifikasyonunun oluşturulmasına yol açan
önemli kullanıcı deneyimi kullanım alanlarından biriydi. Hikayeler'den farklı olarak, bir kullanıcı
etkileşimde bulunduktan sonra her resimde bir bandın durması gerekmez. Bantta hızlıca gezinmek iyi olabilir veya istenebilir. Öte yandan, hikayelerde en iyi gezinme yöntemi hikayeleri tek tek incelemektir. scroll-snap-stop
tam da bunu sağlar.
.user {
scroll-snap-align: start;
scroll-snap-stop: always;
}
Bu yayını yazarken scroll-snap-stop
yalnızca Chromium tabanlı tarayıcılarda desteklenmektedir. Güncellemeler için Tarayıcı uyumluluğu başlıklı makaleyi inceleyin. Ancak bu durum, reklam yayınını engellemez. Bu, desteklenmeyen tarayıcılarda kullanıcıların yanlışlıkla bir arkadaşını atlayabileceği anlamına gelir. Dolayısıyla, kullanıcıların daha dikkatli olması veya atlanan bir arkadaşın görüntülendi olarak işaretlenmemesini sağlamak için JavaScript yazmamız gerekecektir.
Daha fazla bilgi için özellikleri inceleyin.
overscroll-behavior
Bir modal pencerede gezinirken aniden modal pencerenin arkasındaki içeriği kaydırmaya başladınız mı?
overscroll-behavior
, geliştiricinin kaydırmayı yakalamasına ve asla bırakmasına izin vermez. Her tür durum için uygundur. Hikayelerim bileşeni, ek kaydırma ve kaydırma hareketlerinin bileşenden çıkmasını önlemek için bu özelliği kullanır.
.stories {
overflow-x: auto;
overscroll-behavior: contain;
}
Safari ve Opera bu özelliği desteklemeyen iki tarayıcıydı. Bu durum tamamen normaldir. Bu kullanıcılar alışık oldukları gibi fazla kaydırma deneyimi yaşarlar ve bu geliştirmeyi hiç fark etmeyebilirler. Bu özelliğin büyük bir hayranı olarak, uyguladığım neredeyse her kaydırma üstü özelliğin bir parçası olarak eklemeyi seviyorum. Bu, yalnızca kullanıcı deneyiminin iyileştirilmesini sağlayabilecek zararsız bir katkıdır.
scrollIntoView({behavior: 'smooth'})
Kullanıcı bir arkadaşın hikaye grubunun sonuna dokunduğunda veya tıkladığında, kaydırma sabitleme noktası grubundaki bir sonraki arkadaşa geçme zamanı gelir. JavaScript ile bir sonraki arkadaşımızı gösterebildik ve bunun ekrana kaydırılmasını
istedik. Bu konudaki temel bilgiler için sunulan destek mükemmel. Her tarayıcıda kaydırarak görüntüledim. Ancak her tarayıcı bunu yapmadı 'smooth'
. Bu, öğenin sabitlenmek yerine kaydırılarak görüntülendiği anlamına gelir.
element.scrollIntoView({
behavior: 'smooth'
})
Burada behavior: 'smooth'
, Safari tarafından desteklenmeyen tek tarayıcıydı. Güncellemeler için Tarayıcı uyumluluğu başlıklı makaleyi inceleyin.
Uygulamalı
Bunu nasıl yaptığımı öğrendiğinize göre, siz ne yapardınız? Yaklaşımlarımızı çeşitlendirelim ve web'de uygulama geliştirmenin tüm yollarını öğrenelim. Bir Glitch oluşturun ve benimle tweet'de paylaşın. Topluluk remiksleri bölümüne ekleyeceğim.
Topluluk remiksleri
- Svelte ile @geoffrich_: demo ve kod
- Vue ile @GauteMeekOlsen: demo + kod
- Lit ile @AnaestheticsApp: demo ve code