Tworzenie komponentu przewijającego multimedia

Podstawowe informacje o tworzeniu elastycznego widoku przewijania w poziomie na potrzeby telewizorów, telefonów, komputerów itp.

W tym poście chcę opowiedzieć o sposobach tworzenia przewijania w poziomie. a także do tworzenia prostych aplikacji internetowych, które są proste w obsłudze, łatwo dostępne i działają przeglądarek i platform (np. telewizorów). Wypróbuj demo.

Demonstracja
.

Jeśli wolisz film, oto wersja tego posta w YouTube:

Omówienie

Tworzymy układ poziomy z przewijaniem umożliwiającym przechowywanie miniatur mediów lub produktów. Komponent zaczyna się jako skromna lista <ul>, ale jest przekształconych za pomocą CSS na satysfakcjonujące i płynne przewijanie, obrazów i przyciągania ich do siatki. Dodaliśmy JavaScript, aby ułatwić interakcje z dalszym indeksem, co pomaga użytkownikom klawiatury pomijać ponad 100 elementów. Dodatkowo eksperymentalne zapytanie o media, prefers-reduced-data, służy do przewijanie multimediów w prosty sposób na przewijanie tytułów.

Zacznij od znaczników ułatwień dostępu

Przewijanie multimediów składa się tylko z kilku podstawowych komponentów, czyli listy z elementami. O lista może podróżować po całym świecie i być wszystkich użytkowników. Użytkownik, który trafi na tę stronę, może przejrzeć listę i kliknąć link aby wyświetlić dany element. To nasza baza, z której można korzystać.

Prześlij listę z elementem <ul>:

<ul class="horizontal-media-scroller">
  <li></li>
  <li></li>
  <li></li>
  ...
<ul>

Dodaj element <a> jako interaktywny do elementów listy:

<li>
  <a href="#">
    ...
  </a>
</li>

Użyj elementu <figure> do semantycznego przedstawienia obrazu i jego podpisu:

<figure>
  <picture>
    <img alt="..." loading="lazy" src="https://picsum.photos/500/500?1">
  </picture>
  <figcaption>Legends</figcaption>
</figure>

Zwróć uwagę na atrybuty alt i loading <img>. Tekst alternatywny dla multimediów przewijanie to opcja UX, która pomaga nadać miniaturze dodatkowy kontekst. tekst zastępczy, jeśli obraz nie został wczytany lub użytkownicy mają dostęp do interfejsu głosowego korzysta z technologii wspomagających osoby z niepełnosprawnością, takich jak czytnik ekranu. Dowiedz się więcej o programie Five golden reguły dotyczące zgodnego atrybutu alt tekst.

Atrybut loading akceptuje słowo kluczowe lazy jako sygnał do wyświetlenia obrazu powinno być pobierane tylko wtedy, gdy obraz znajduje się w widocznym obszarze. Może to być dobrze sprawdza się w przypadku dużych list, ponieważ użytkownicy pobierają obrazy tylko przewinięto do widoku.

Dostosowanie preferencji użytkownika do schematu kolorów

Użyj tagu color-scheme jako tagu <meta>, aby poinformować przeglądarkę, że strona wymaga zarówno jasnego, jak i ciemnego stylu klienta użytkownika. To bezpłatny tryb ciemny lub trybu jasnego, w zależności od tego, jak na to patrzysz:

<meta name="color-scheme" content="dark light">

Metatag jest źródłem najwcześniejszego możliwego sygnału, więc przeglądarka może wybrać ciemny domyślny kolor obszaru roboczego, jeśli użytkownik ma ustawiony ciemny motyw. Oznacza to, że podczas przechodzenia między stronami witryny nie będzie migać biały obszar roboczy. w tle między ładowaniami. Płynny ciemny motyw pomiędzy ładowaniami, znacznie ładniejszy na ekranie oczami.

Więcej informacji od Thomasa Steinera znajdziesz na https://web.dev/color-scheme/.

Dodaj treść

Biorąc pod uwagę powyższą strukturę treści pliku ul > li > a > figure > picture > img, Kolejne zadanie to dodawanie obrazów i tytułów do przewijania. W prezentacji znalazłem się statyczne obrazy i teksty zastępcze, ale możesz je wykorzystać ulubionego źródła danych.

Dodaj styl za pomocą CSS

Nadszedł czas, aby usługa porównywania cen przekształciła tę ogólną listę treści w i uzyskiwanie dodatkowych informacji. Netflix, sklepy z aplikacjami i wiele innych witryn i aplikacji używa orientacji poziomej aby wypełnić widoczny obszar kategoriami i opcjami.

Tworzę układ przewijania

Ważne jest, aby nie obcinać treści w układach lub opierać się na tekście. obcinanie tekstu za pomocą wielokropka. Wiele telewizorów ma przewijanie multimediów ale często sięgają po treści elipsujące. Ten układ tego nie robi. Pozwala to też treści multimedialnej zastępować rozmiar kolumny, co powoduje utworzenie 1 układu. do obsługi wielu ciekawych kombinacji.

2.
wyświetlane są przewijane wiersze. Jeden nie ma wielokropka, co oznacza, że jest wyższy i każdy
tytuł jest w pełni czytelny. Druga jest krótsza i wiele tytułów jest uciętych,
wielokropek.

Kontener umożliwia zastąpienie rozmiaru kolumny przez podanie rozmiaru domyślnego jako do właściwości niestandardowej. Ten układ siatki ma wpływ na rozmiar kolumny. zarządzanie tylko odstępami i kierunkiem:

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2); /* parent owned value for children to be relative to*/
  margin: 0;
}

Właściwość niestandardowa jest następnie używana przez element <picture> do utworzenia podstawowego współczynnika proporcji: pola:

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  & picture {
    inline-size: var(--size);
    block-size: var(--size);
  }
}

Zostało tylko kilka mniejszych stylów, więc dopełnij elementy przewijane treści:

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  & > li {
    display: inline-block; /* removes the list-item bullet */
  }

  & picture {
    inline-size: var(--size);
    block-size: var(--size);
  }
}

Ustawienie overflow ustawia <ul>, aby umożliwić przewijanie i nawigację za pomocą klawiatury na swojej liście, dla każdego bezpośredniego elementu podrzędnego <li> usunięto element ::marker dzięki nowemu typowi wyświetlania: inline-block.

Obrazy nie reagują jeszcze na te wiadomości i wyskakują prosto z ramek. nawet jeśli są w środku. Okiełznaj je za pomocą rozmiaru, dopasowania i stylu obramowania. gradient tła podczas leniwego ładowania:

img {
  /* smash into whatever box it's in */
  inline-size: 100%;
  block-size: 100%;

  /* don't squish but do cover the space */
  object-fit: cover;

  /* soften the edges */
  border-radius: 1ex;
  overflow: hidden;

  /* if empty, show a gradient placeholder */
  background-image:
    linear-gradient(
      to bottom,
      hsl(0 0% 40%),
      hsl(0 0% 20%)
    );
}

Dopełnienie przewijania

Wyrównanie do zawartości strony oraz obszar przewijania od krawędzi do krawędzi są o znaczeniu harmonicznym i minimalnym.

Aby uzyskać układ przewijania od krawędzi do krawędzi, który jest zgodny z naszą typografią i wiersze układu użyj parametru padding, który pasuje do scroll-padding:

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  padding-inline: var(--gap);
  scroll-padding-inline: var(--gap);
  padding-block: calc(var(--gap) / 2); /* make space for scrollbar and focus outline */
}

Poprawka błędu dopełnienia przewijania w poziomie Powyżej widać, jak łatwo powinno być kontener przewijania, ale są z nim nierozstrzygnięte problemy ze zgodnością (naprawiono je w Chromium 91 i nowszych wersjach). Zobacz tutaj. nie zawsze było uwzględniane dopełnienie. .

O
jest wyróżnione na końcu ostatniego elementu listy, pokazując
dopełnienie i element mają taką samą szerokość, jak wymagane jest wyrównanie.

Aby podstępem nakłonić przeglądarki do dodania dopełnienia na końcu paska przewijania, na ostatnią figurę na każdej liście i dodaj pseudoelement, który jest żądanego dopełnienia.

.horizontal-media-scroller > li:last-of-type figure {
  position: relative;

  &::after {
    content: "";
    position: absolute;

    inline-size: var(--gap);
    block-size: 100%;

    inset-block-start: 0;
    inset-inline-end: calc(var(--gap) * -1);
  }
}

Używanie właściwości logicznych umożliwia przewijanie multimediów w dowolnym trybie pisania i kierunek dokumentu.

Przyciąganie do przewijania

Przewijany kontener z nadmiarem może stać się „przyciągającym” widocznym obszarem dzięki jednej linii CSS, a następnie znajdować się w elementach podrzędnych i określić, jak mają się do niego dopasować.

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  padding-inline: var(--gap);
  scroll-padding-inline: var(--gap);
  padding-block-end: calc(var(--gap) / 2);

  scroll-snap-type: inline mandatory;

  & figure {
    scroll-snap-align: start;
  }
}

Ostrość

Inspiracją do stworzenia tego komponentu jest jego ogromna popularność w App Store i nie tylko. Wiele platform do gier wideo korzysta z rolki przewijania, podobny do tego, jako podstawowy układ ekranu głównego. Skupienie to duży UX tutaj, a nie tylko – Wyobraź sobie, że używasz tego przewijania multimediów z: na kanapie za pomocą pilota, wprowadź do tej interakcji kilka drobnych ulepszeń:

.horizontal-media-scroller a {
  outline-offset: 12px;

  &:focus {
    outline-offset: 7px;
  }

  @media (prefers-reduced-motion: no-preference) {
    & {
      transition: outline-offset .25s ease;
    }
  }
}

Dzięki temu styl konturu ostrości 7px zostanie odsunięty od ramki, nadając mu ładny wygląd. kosmosu. Jeśli użytkownik nie ma preferencji dotyczących ruchu dotyczących zmniejszania ruchu, przesunięcie jest przekształcany, co nadaje sylwetce ostrości delikatny ruch.

Indeks Roving

Użytkownicy padów do gier i klawiatury wymagają szczególnej uwagi na tych długich listach przewijanych treści i opcji. Typowy wzorzec rozwiązania tego problemu to tzw. indeksie ruchu. Ma miejsce, gdy kontener z elementami jest ustawiony na klawiaturę, ale tylko 1 element podrzędny może przytrzymaj fokus za jednym razem. Ten pojedynczy element, który można zaznaczyć, umożliwia pomijać potencjalnie długą listę elementów zamiast naciskać klawisz 50+ do końca.

W pierwszym przewijanym ekranie wersji demonstracyjnej znajduje się 300 elementów. Możemy coś zrobić lepiej niż zapoznają się ze wszystkimi, aby dotrzeć do następnej sekcji.

Aby utworzyć takie działanie, JavaScript musi obserwować zdarzenia klawiatury i zaznaczyć elementy zdarzeń. Utworzyłem małą bibliotekę typu open source npm, który ułatwi zmianę uprawnień tego użytkownika łatwe do osiągnięcia. Oto jak go używać w przypadku 3 elementów przewijania:

import {rovingIndex} from 'roving-ux';

rovingIndex({
  element: someElement
});

Ta wersja demonstracyjna wysyła zapytania do dokumentu w poszukiwaniu osób przewijających, a w przypadku każdej z nich wywołuje metodę rovingIndex(). Pokaż element (rovingIndex()), aby ruszać w podróż takich jak kontener listy i selektor docelowego zapytania, w przypadku, gdy cele kierowania nie są bezpośrednimi elementami potomnymi.

document.querySelectorAll('.horizontal-media-scroller')
  .forEach(scroller =>
    rovingIndex({
      element: scroller,
      target: 'a',
}))

Więcej informacji o tym efektie znajdziesz w bibliotece open source roving-ux.

Współczynnik proporcji

W momencie opublikowania tego posta wsparcie dla aspect-ratio jest za flagi w Firefoksie, ale są dostępne w przeglądarkach Chromium i na dekoderach. Ponieważ Układ siatki przewijania multimediów określa tylko kierunek i odstępy, zmiana w zapytaniu o media, która sprawdza obsługę współczynnika proporcji. Stopniowe ulepszenie w bardziej dynamicznych przewijanych treściach.

O
pole o proporcjach 4:4 jest wyświetlane obok innych formatów obrazu 16:9.
i 4:3

@supports (aspect-ratio: 1) {
  .horizontal-media-scroller figure > picture {
    inline-size: auto; /* for a block-size driven ratio */
    aspect-ratio: 1; /* boxes by default */

    @nest section:nth-child(2) & {
      aspect-ratio: 16/9;
    }

    @nest section:nth-child(3) & {
      /* double the size of the others */
      block-size: calc(var(--size) * 2);
      aspect-ratio: 4/3;

      /* adjust size to fit more items into the viewport */
      @media (width <= 480px) {
        block-size: calc(var(--size) * 1.5);
      }
    }
  }
}

Jeśli przeglądarka obsługuje składnię aspect-ratio, obrazy przewijane multimediów są uaktualniono do rozmiaru aspect-ratio. Korzystając ze składni zagnieżdżenia wersji roboczych, każdy obraz jest zmienia współczynnik proporcji w zależności od tego, czy jest to pierwszy, drugi czy trzeci wiersz. składnia Nest umożliwia też określenie oraz korekty widocznego obszaru, a także inne metody określania rozmiaru.

Dzięki CSS, gdy ta funkcja jest dostępna w większej liczbie przeglądarek, ale też bardziej atrakcyjny wizualnie układ.

Preferowane są ograniczone dane

Ta następna metoda jest dostępna tylko za flagą w Canary Chciałbym opowiedzieć, jak można zaoszczędzić znaczne ilości czasu wczytywania strony i za pomocą kilku wierszy CSS. Zapytanie o media prefers-reduced-data z Poziom 5 umożliwia pytanie, czy urządzenie jest np. w trybie oszczędzania danych. Jeśli tak, mogę zmienić dokument i — w tym przypadku — ukryj obrazy.

ALT_TEXT_HERE

figure {
  @media (prefers-reduced-data: reduce) {
    & {
      min-inline-size: var(--size);

      & > picture {
        display: none;
      }
    }
  }
}

Treść jest nadal łatwa do przeglądania, ale nie trzeba ponosić kosztów kosztownych obrazów pobrano. Oto strona przed dodaniem kodu CSS prefers-reduced-data:

(7 żądań, 100 KB zasobów w 131 ms)

ALT_TEXT_HERE

Oto skuteczność witryny po dodaniu kodu CSS prefers-reduced-data:

ALT_TEXT_HERE

(71 żądań, 1,2 MB zasobów w wersji 1.07)

64 żądań mniej, czyli około 60 obrazów w widocznym obszarze (testy wykonane na szerokim ekranie) tej karty przeglądarki, przyspieszenie wczytywania strony o około 80% 10% danych przez przewód. Obsługiwany kod CSS.

Podsumowanie

Skoro już wiesz, jak to robię, jak Ty?! 🙂

Stosujmy różne podejścia i poznajmy sposoby budowania obecności w internecie. Utwórz Codepen lub poprowadź własną prezentację i wyślij do mnie tweeta, a dodam ją do Remiksy przez społeczność znajdują się poniżej.

Źródło

Remiksy utworzone przez społeczność

Na razie nic tu nie ma.