Przejdź do treści

Aspect Ratio

Stabilny

Utrzymuje media w stałych proporcjach szerokości do wysokości i rezerwuje dla nich miejsce, zanim treść się załaduje.

Meridian16 : 9

Instalacja

$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/aspect-ratio.json

Użycie

import { AspectRatio } from "@/components/ui/aspect-ratio"
<AspectRatio ratio={16 / 9} className="overflow-hidden rounded-xl">
  <img src="/cover.jpg" alt="…" className="size-full object-cover" />
</AspectRatio>

ratio to szerokość podzielona przez wysokość. Komponent to pozycjonowany <div>, którego rozmiar wyznacza właściwość CSS aspect-ratio — bez JavaScriptu i bez sztuczek z paddingiem — więc działa w komponentach serwerowych, a układ nigdy nie przeskakuje po hydratacji.

Przykłady

Popularne proporcje

Dobierz proporcje do treści, a potem trzymaj się ich w całej kolekcji, żeby siatki były równe.

1:1
Awatary, produkty
4:3
Zdjęcia, miniatury
3:2
Zdjęcia redakcyjne
16:9
Wideo, sekcje hero
21:9
Kinowe banery

Z Next.js Image

Użyj fill, aby obraz przyjął rozmiar ramki, i object-cover, aby go kadrować zamiast rozciągać. Przekaż sizes, żeby przeglądarka pobrała odpowiednią rozdzielczość.

import Image from "next/image"

<AspectRatio ratio={16 / 9} className="overflow-hidden rounded-xl bg-muted">
  <Image
    src="/showcase/dashboard.png"
    alt="The analytics dashboard in dark mode"
    fill
    sizes="(min-width: 768px) 50vw, 100vw"
    className="object-cover"
  />
</AspectRatio>

Wideo

Wideo i osadzone treści powinny zarezerwować swoją ramkę, zanim się załadują. Kontrolki i metadane nakładaj za pomocą pozycjonowania absolutnego — ramka ma już relative.

12:48
Projektowanie z tokenamiprfct Talks · Odcinek 4
<AspectRatio ratio={16 / 9} className="overflow-hidden rounded-xl">
  <iframe
    src="https://www.youtube-nocookie.com/embed/…"
    title="Designing with tokens"
    allow="accelerometer; encrypted-media; picture-in-picture"
    allowFullScreen
    className="absolute inset-0 size-full"
  />
</AspectRatio>

Kwadratowa siatka

Proporcje 1:1 sprawiają, że awatary, zdjęcia produktów i miniatury wyglądają jednolicie, nawet gdy obrazy źródłowe nie są jednolite.

  • Ana
  • Jonas
  • Maya
  • Theo
  • Iris
  • Lena
  • Omar
  • Eli

Media w karcie

Umieść ramkę z proporcjami na początku karty i dodaj karcie pt-0 — media wypełnią ją od krawędzi do krawędzi, z zachowaniem zaokrąglonych narożników karty.

Nowość
Bursztynowa lampka biurkowa
Ręcznie wykańczany mosiądz, ciepłe światło z regulacją jasności.
189 $

Wytyczne

Kiedy używać

  • Do obrazów, wideo, map i osadzonych treści, których kontener zmienia szerokość wraz z układem.
  • W siatkach i karuzelach — aby każdy kafelek miał ten sam kształt.
  • Wszędzie tam, gdzie wczytywane z opóźnieniem media spychałyby treść w dół.

Kiedy nie używać

  • Do tekstu lub interfejsu, którego wysokość zależy od treści — sztywne proporcje utną zawartość albo zostawią puste miejsce.
  • Gdy kontener ma już stałe wymiary w pikselach — ustaw je bezpośrednio.

Kadruj, nie zniekształcaj

Media w ramce z proporcjami powinny używać object-cover (kadrowanie z wypełnieniem ramki) lub object-contain (wpasowanie z pustymi pasami), nigdy domyślnego rozciągania.

Dobrze.object-cover wypełnia ramkę i zachowuje proporcje.
Źle.Rozciągnięte media wyglądają na zepsute, niezależnie od tego, jak dobre jest zdjęcie.

Dostępność

Aspect Ratio pełni wyłącznie funkcję prezentacyjną; liczą się media w jego wnętrzu.

  • Obrazy potrzebują tekstu alt, który mówi, co przedstawiają, albo alt="", gdy są dekoracyjne.
  • Wideo potrzebuje napisów, a osadzone treści — atrybutu title, który nazywa zawartość.
  • Stabilny układ. Zarezerwowane miejsce sprawia, że treść nie skacze podczas wczytywania mediów. To pomaga wszystkim — a zwłaszcza osobom, które korzystają z powiększenia lub czytają wolniej.

Dokumentacja API

AspectRatio

Renderuje <div>position: relativeaspect-ratio ustawionym na podstawie ratio. Przyjmuje wszystkie propsy elementu <div>.

PropTypDomyślnie
ratiowymagany

Szerokość podzielona przez wysokość, np. 16 / 9 lub 1.

numberBrak wartości domyślnej
className

Zaokrąglenie, przycinanie zawartości i tło ramki.

stringBrak wartości domyślnej