Podstawowy przegląd sposobów tworzenia w internecie treści podobnych do relacji na Instagramie.
W tym poście chcę podzielić się z Wami swoimi przemyśleniami na temat tworzenia komponentu Stories dla sieci, który jest responsywny, obsługuje nawigację za pomocą klawiatury i działa we wszystkich przeglądarkach.
Jeśli wolisz samodzielnie tworzyć ten komponent relacji, zapoznaj się z ćwiczeniem z programowania poświęconym komponentowi relacji.
Jeśli wolisz film, oto wersja tego posta w YouTube:
Omówienie
Dwa popularne przykłady interfejsu relacji to relacje na Snapchacie i Instagramie (nie wspominając o flotach). W ogólnych warunkach UX relacje to zwykle przeznaczony tylko na urządzenia mobilne wzór nawigacji oparty na dotykaniu, który umożliwia korzystanie z wielu subskrypcji. Na przykład w Instagramie użytkownicy otwierają relację znajomego i przeglądają zdjęcia w niej. Zwykle robią to z wielu przyjaciółmi naraz. Kliknięcie po prawej stronie urządzenia powoduje przejście do następnej relacji tego znajomego. Przesuwając palcem w prawo, użytkownik przejdzie do profilu innego znajomego. Komponent Story jest podobny do karuzeli, ale umożliwia poruszanie się po tablicy wielowymiarowej, a nie jednowymiarowej. To tak, jakby w każdej karuzeli była kolejna karuzela. 🤯
Wybór odpowiednich narzędzi do danego zadania
Ogólnie tworzenie tego komponentu było dość proste dzięki kilku kluczowym funkcjom platformy internetowej. Porozmawiajmy o nich.
Siatka CSS
Nasz układ okazał się dla CSS Grid niezbyt trudnym zadaniem, ponieważ zawiera on kilka skutecznych sposobów na zarządzanie treściami.
Układ znajomych
Główny element opakowujący .stories
to widok przewijania poziomego zoptymalizowany pod kątem urządzeń mobilnych:
.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;
}
Przyjrzyjmy się temu układowi grid
:
- Wypełniamy widoczny obszar na urządzeniach mobilnych za pomocą
100vh
i100vw
oraz ograniczamy rozmiar na komputerach. /
oddziela szablony wierszy i kolumnauto-flow
togrid-auto-flow: column
- Szablon autoflow to
100%
, który w tym przypadku jest równy szerokości okna przewijania.
Na telefonie komórkowym rozmiar wiersza odpowiada wysokości widocznego obszaru, a każda kolumna – jego szerokości. W przypadku relacji na Snapchacie i relacji na Instagramie każda kolumna będzie relacją znajomego. Chcemy, aby historie znajomych były widoczne poza obszarem widoku, aby można było je przewijać. Użytkownik będzie widzieć tyle kolumn, ile będzie potrzebnych do wyświetlenia Twojego kodu HTML w przypadku każdej historii znajomego. Dzięki temu stworzymy dynamiczny i responsywny kontener z możliwością przewijania. Dzięki temu mogliśmy scentralizować cały efekt.
Układanie
W przypadku każdego znajomego potrzebujemy jego relacji w stanie gotowym do podziału na strony. W ramach przygotowań do animacji i innych zabawnych wzorów wybrałam stos. Gdy mówię o składaniu, mam na myśli spojrzenie na kanapkę z góry, a nie z boku.
Dzięki siatce CSS możemy zdefiniować siatkę pojedynczej komórki (czyli kwadratu), w której wiersze i kolumny mają ten sam alias ([story]
), a następnie każde dziecko zostanie przypisane do tej przestrzeni pojedynczej komórki z aliasem:
.user {
display: grid;
grid: [story] 1fr / [story] 1fr;
scroll-snap-align: start;
scroll-snap-stop: always;
}
.story {
grid-area: story;
background-size: cover;
…
}
Dzięki temu nasz kod HTML będzie kontrolować kolejność elementów i utrzymywać ich płynność. Zwróć uwagę, że nie musisz nic zmieniać w pozycji absolute
ani z-index
i nie musisz prawidłowo zaznaczać pól height: 100%
ani width: 100%
. Siatka nadrzędna określiła już rozmiar widocznego obszaru obrazu relacji, więc żaden z tych komponentów relacji nie musiał być informowany o konieczności wypełnienia tego obszaru.
Punkty zacięcia przewijania w CSS
Specyfikacja punktów przyciągania podczas przewijania w CSS ułatwia blokowanie elementów w widocznym obszarze podczas przewijania. Zanim pojawiły się te właściwości CSS, trzeba było używać JavaScriptu, co było… delikatnie mówiąc trudne. Aby dowiedzieć się więcej o tym, jak ich używać, przeczytaj artykuł Introducing CSS Scroll Snap Points (ang. „Wprowadzenie do punktów skoku w przewijaniu w CSS”) autorstwa Sarah Drasner.
.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; }
Wybrałem punkty zaczepienia przewijania z kilku powodów:
- Bezpłatny dostęp. Specyfikacja punktów wiązania podczas przewijania określa, że naciśnięcie strzałki w lewo i strzałki w prawo powinno domyślnie wiązać się z przejściem przez punkty wiązania.
- Rosnąca specyfikacja. Specyfikacja punktów uchwytu podczas przewijania jest stale wzbogacana o nowe funkcje i ulepszenia, co oznacza, że od teraz komponent Stories będzie prawdopodobnie jeszcze lepszy.
- Łatwość implementacji. Punkty zaczepienia przewijania są przeznaczone do stosowania w przypadku użycia, w którym naciskanie przycisków jest najważniejsze.
- Bezwład w stylu platformy. Każda platforma będzie przewijać i zatrzymywać się w swoim stylu, w przeciwieństwie do znormalizowanej bezwładności, która może mieć dziwny styl przewijania i zatrzymywania.
Zgodność z różnymi przeglądarkami
Przetestowaliśmy je w przeglądarkach Opera, Firefox, Safari i Chrome oraz na Androidzie i iOS. Oto krótki przegląd funkcji internetowych, w których przypadku stwierdziliśmy różnice w możliwościach i obsługiwanych funkcjach.
Niektóre reguły CSS nie zostały jednak zastosowane, więc niektóre platformy nie mają obecnie optymalizacji UX. Nie musiałem zarządzać tymi funkcjami i mam nadzieję, że wkrótce będą dostępne w innych przeglądarkach i na innych platformach.
scroll-snap-stop
Karuzele były jednym z głównych przypadków użycia UX, które zainspirowały nas do stworzenia specyfikacji punktów zatrzymania ładowania CSS. W przeciwieństwie do Stories karuzela nie musi zawsze zatrzymywać się na każdym obrazie po interakcji użytkownika. Może to być dopuszczalne lub nawet pożądane, aby użytkownicy mogli szybko przewijać karuzel. Z drugiej strony, w przypadku Stories lepiej jest poruszać się po nich pojedynczo, a scroll-snap-stop
właśnie to umożliwia.
.user {
scroll-snap-align: start;
scroll-snap-stop: always;
}
W momencie pisania tego posta scroll-snap-stop
była obsługiwana tylko w przeglądarkach opartych na Chromium. Aby uzyskać więcej informacji, zapoznaj się z zgodnością z przeglądarkami. Nie jest to jednak przeszkoda. Oznacza to tylko, że w nieobsługiwanych przeglądarkach użytkownicy mogą przypadkowo pominąć znajomego. Użytkownicy będą musieli być bardziej ostrożni albo będziemy musieli napisać kod JavaScript, aby mieć pewność, że pominięcie znajomego nie zostanie oznaczone jako obejrzone.
Jeśli chcesz, możesz dowiedzieć się więcej z specyfikacji.
overscroll-behavior
Czy zdarzyło Ci się kiedyś przewijać modal, gdy nagle zacząłeś(-aś) przewijać treści znajdujące się za tym modalem?
overscroll-behavior
pozwala deweloperowi zablokować przewijanie i utrzymać je w stanie nieaktywnej. Pasuje na każdą okazję. Służą one do zapobiegania opuszczaniu komponentu przez dodatkowe gesty przesuwania i przewijania.
.stories {
overflow-x: auto;
overscroll-behavior: contain;
}
Safari i Opera to 2 przeglądarki, które nie obsługują tego, ale to zupełnie w porządku. Ci użytkownicy będą mogli korzystać z przewijania, do którego są przyzwyczajeni, i być może nigdy nie zauważą tej funkcji. Osobiście jestem wielkim fanem tej funkcji i umieszczam ją w ramach prawie każdej implementowanej przeze mnie funkcji przewijania. Jest to nieszkodliwe rozszerzenie, które może tylko poprawić UX.
scrollIntoView({behavior: 'smooth'})
Gdy użytkownik kliknie lub dotknie, aby przejść do końca zestawu relacji znajomego, nadszedł czas na przejście do następnego znajomego w ramach zestawu punktów przewijania. Za pomocą JavaScriptu udało nam się wskazać kolejnego znajomego i poprosić o przewinięcie do niego. Podstawy są świetnie obsługiwane; każda przeglądarka wyświetla je po przewinięciu. Nie wszystkie przeglądarki to jednak zrobiły. 'smooth'
Oznacza to tylko, że zamiast przyciągania elementu do krawędzi, został on przewinięty do widoku.
element.scrollIntoView({
behavior: 'smooth'
})
Safari była jedyną przeglądarką, która nie obsługiwała behavior: 'smooth'
. Aby uzyskać więcej informacji, zapoznaj się z zgodnością z przeglądarkami.
Praktyczne ćwiczenia
Teraz, gdy już wiesz, jak to zrobić, jak Ty to zrobisz? Zróżnicuj swoje podejścia i poznaj wszystkie sposoby tworzenia stron internetowych. Utwórz Glitch, wyślij mi tweeta ze swoją wersją, a ja dodam ją do sekcji Remiksy społeczności poniżej.
Remiksy społeczności
- @geoffrich_ z Svelte: demo i kod
- @GauteMeekOlsen z Vue: demo i kod
- @AnaestheticsApp z Lit: demo i kod