Una panoramica fondamentale su come creare un'esperienza simile alle Storie di Instagram sul web.
In questo post voglio condividere i miei pensieri sulla creazione di un componente Storie per web che sia reattivo, supporti la navigazione da tastiera e funziona su browser.
Se preferisci una dimostrazione pratica su come creare personalmente questo componente delle Storie, consulta il codelab del componente Storie.
Se preferisci i video, ecco una versione di questo post su YouTube:
Panoramica
Due esempi popolari di UX per le Storie sono le Storie di Snapchat e le Storie di Instagram (per non parlare delle flotte). In generale, in termini di esperienza utente, le Storie sono caratterizzate da uno schema di navigazione incentrato solo sui dispositivi mobili e incentrato sul tocco. più abbonamenti. Ad esempio, su Instagram, gli utenti aprono la storia di un amico e scorrere le immagini al suo interno. Di solito fanno molti amici nel tempo. Se tocchi il lato destro del dispositivo, l'utente passa al storia successiva. Se scorri verso destra, un utente passa direttamente a un altro amico. Il componente Storia è abbastanza simile a un carosello, ma consente di spostarsi in un un array multidimensionale, anziché un array monodimensionale. È come se ci fosse una giostra all'interno in ogni carosello. 🤯
Scelta degli strumenti giusti per il lavoro
Nel complesso ho trovato questo componente piuttosto semplice da creare grazie ad alcune funzionalità critiche della piattaforma web. Vediamole insieme!
Griglia CSS
Il nostro layout non si è rivelato di qualità per CSS Grid, in quanto dispone di alcune modi efficaci per fare wrangling dei contenuti.
Layout amici
Il nostro wrapper del componente principale .stories
è una visualizzazione di scorrimento orizzontale orientata ai dispositivi mobili:
.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;
}
Analizziamo questo layout grid
:
- Riempiamo esplicitamente l'area visibile sui dispositivi mobili con
100vh
e100vw
e limitiamo le dimensioni sui computer desktop /
separa i nostri modelli di riga e colonnaauto-flow
si traduce ingrid-auto-flow: column
- Il modello di flusso automatico è
100%
, che in questo caso è qualsiasi sia la larghezza della finestra di scorrimento
Su un cellulare, puoi considerare la dimensione delle righe come l'altezza dell'area visibile ciascuna colonna rappresenta la larghezza dell'area visibile. Per continuare con Snapchat Stories e Esempio di Storie di Instagram, ogni colonna conterrà la storia di un amico. Vogliamo degli amici storie da continuare fuori dall'area visibile, in modo da avere un punto a cui scorrere. La griglia creerà tutte le colonne necessarie per il layout del tuo HTML per ogni amico creando un container a scorrimento dinamico e reattivo. Griglia ci ha permesso di centralizzare l'intero effetto.
Sovrapposizione
Per ogni amico, abbiamo bisogno delle loro storie in uno stato pronto per l'impaginazione. Per prepararmi per l'animazione e altri motivi divertenti, ho scelto uno stack. Quando dico impilare, intendo come se stessi guardando verso il basso un panino, non come se guardassi da un lato.
Con la griglia CSS, possiamo definire una griglia a cella singola (ossia un quadrato), in cui le righe
e le colonne condividono un alias ([story]
) a cui viene assegnato ogni figlio
spazio a cella singola con alias:
.user {
display: grid;
grid: [story] 1fr / [story] 1fr;
scroll-snap-align: start;
scroll-snap-stop: always;
}
.story {
grid-area: story;
background-size: cover;
…
}
In questo modo il nostro HTML ha il controllo dell'ordine di sovrapposizione e mantiene anche tutti gli elementi
nel flusso. Come puoi notare, non abbiamo dovuto fare nulla con il posizionamento di absolute
o con z-index
.
non abbiamo dovuto confezionare correttamente con height: 100%
o width: 100%
. La griglia principale
ha già definito le dimensioni dell'area visibile dell'immagine della storia, quindi nessuno di questi componenti della storia
doveva essere detto di riempirlo!
Punti di aggancio di scorrimento CSS
Grazie alla specifica Snap Points di scorrimento CSS, un semplice clic per bloccare gli elementi nell'area visibile quando scorri. Prima che queste proprietà CSS esistessero, abbiamo dovuto usare JavaScript ed è stato... a dir poco complicato. Paga Introduzione ai punti di scorrimento di scorrimento CSS di Sarah Drasner per un'accurata analisi del loro utilizzo.
.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; }
Ho scelto i punti di Snapshot per diversi motivi:
- Accessibilità senza costi. La specifica dei punti di aggancio di scorrimento indica che, se si preme il tasto I tasti FRECCIA SINISTRA e FRECCIA DESTRA dovrebbero spostarsi tra i punti di agganciamento per impostazione predefinita.
- Una specifica in crescita. Nuove funzionalità e miglioramenti relativi alla specifica Punti di pressione di scorrimento sempre di più, il che significa che il componente Storie potrà essere migliorato solo d'ora in poi.
- Facilità di implementazione. Gli Snap Point di scorrimento sono realizzati in pratica per caso d'uso di paginazione orizzontale concentrata sul tocco.
- Inerzia libera stile piattaforma. Ogni piattaforma scorrerà e si fermerà nel suo stile, invece di un'inerzia normalizzata che può avere uno stile di scorrimento insolito e a riposo.
Compatibilità tra browser
Abbiamo eseguito i test su Opera, Firefox, Safari e Chrome, oltre ad Android e iOS. Ecco un breve resoconto delle funzionalità web in cui abbiamo riscontrato differenze in termini di capacità e assistenza.
Anche se alcuni CSS non sono applicabili, al momento alcune piattaforme stanno perdendo l'esperienza utente ottimizzazioni. Mi è piaciuto non dover gestire queste funzionalità e mi sento sicura che prima o poi raggiungeranno altri browser e piattaforme.
scroll-snap-stop
I caroselli sono stati uno dei principali casi d'uso dell'esperienza utente che hanno portato alla creazione
Specifica degli Snap Points di scorrimento CSS. A differenza delle Storie, un carosello non deve necessariamente interrompersi
su ogni immagine dopo che l'utente ha interagito con essa. Potrebbe essere opportuno o incoraggiato
scorrere rapidamente il carosello. Le storie, invece, si esplorano meglio una alla volta,
ed è esattamente ciò che offre scroll-snap-stop
.
.user {
scroll-snap-align: start;
scroll-snap-stop: always;
}
Al momento della stesura di questo post, il servizio scroll-snap-stop
è supportato soltanto su sistemi basati su Chromium
browser. Paga
Compatibilità del browser
per aggiornamenti. Non è però un blocco. Significa solo che su browser non supportati
gli utenti possono ignorare accidentalmente un amico. Quindi gli utenti dovranno solo stare più attenti,
dobbiamo scrivere codice JavaScript per assicurarci che un amico ignorato non venga contrassegnato come visualizzato.
Scopri di più nel specifiche se interessato.
overscroll-behavior
Ti è mai capitato di scorrere una finestra modale quando all'improvviso
iniziare a scorrere i contenuti dietro la finestra modale?
overscroll-behavior
consente allo sviluppatore di bloccare lo scorrimento senza mai lasciarlo
esci. È adatto a tutte le occasioni. Il componente Le mie storie la utilizza
per evitare che ulteriori scorrimenti e gesti di scorrimento smettano di uscire dalla
di strumento di authoring.
.stories {
overflow-x: auto;
overscroll-behavior: contain;
}
Safari e Opera erano i 2 browser che non funzionavano supportarlo e il gioco è assolutamente ok. Questi utenti avranno un'esperienza di overscroll come prima e potrebbero non notare mai questo miglioramento. Personalmente sono un grande fan e mi piace come parte di quasi tutte le funzionalità overscroll che implemento. È una un'aggiunta innocua che può solo migliorare l'esperienza utente.
scrollIntoView({behavior: 'smooth'})
Quando un utente tocca o fa clic e ha raggiunto la fine dell'insieme di storie di un amico,
è il momento di passare all'amico successivo nel punto di agganciamento di scorrimento impostato. Con
JavaScript, siamo riusciti a fare riferimento al prossimo amico e a richiederne l'accesso
hanno fatto scorrere la pagina per vederla. L'assistenza alle basi di questa procedura è ottima: in tutti i browser
l'ho fatto scorrere per visualizzarlo. Tuttavia, non tutti i browser lo hanno fatto 'smooth'
. Ciò significa solo
è reso visibile tramite scorrimento anziché agganciato.
element.scrollIntoView({
behavior: 'smooth'
})
Safari è stato l'unico browser a non supportare behavior: 'smooth'
qui. Paga
Compatibilità del browser
per aggiornamenti.
Pratico
Ora che sai come ci ho fatto, come lo faresti?! Diversifica il nostro e scoprire tutti i modi per creare sul web. Crea un Glitch. Inviami un tweet con la tua versione e la aggiungerò a vai alla sezione Remix della community di seguito.
Remix della community
- @geoffrich_ con Svelte: demo e codice
- @GauteMeekOlsen con Vue: demo + codice
- @AnaestheticsApp con Lit: demo e codice