Przejdź do treści

Ruch

Krótki, celowy ruch, który wyjaśnia, skąd elementy się biorą i dokąd znikają. Czasy trwania i krzywe przejścia są tokenami, a sprężyny działają w czystym CSS.

Ruch w prfct ma jedno zadanie: wyjaśniać zmianę. Menu wyrasta z przycisku, który je otworzył; okno dialogowe wznosi się na swoje miejsce; gałka przełącznika sprężyście przeskakuje po torze. Nic nie rusza się tylko po to, żeby było widać, że się rusza.

Kompilacja zakończona

Pojawia się w 220 ms (ease-enter), znika w 100 ms (ease-exit).

Zasady

Responsywny. Informacja zwrotna pojawia się w ciągu 100 ms od działania użytkownika. Stany najechania i naciśnięcia są niemal natychmiastowe; interfejs nigdy nie czeka z reakcją, aż skończy się animacja.

Kierunkowy. Elementy wchodzą ze swojego źródła — od strony wyzwalacza, od krawędzi ekranu — i wychodzą tą samą drogą. Wyskakujące elementy skalują się od --transform-origin, zmiennej, którą Base UI ustawia na punkt zakotwiczenia.

Asymetryczny. Elementy znikają szybciej, niż się pojawiają. Wyjścia mają krótsze czasy trwania i przyspieszające krzywe, więc zamykanie nigdy nie wydaje się ociężałe.

Opcjonalny. Ruch to ozdoba nałożona na działający interfejs. Po włączeniu ograniczenia ruchu wszystko nadal działa — tyle że natychmiast.

Czasy trwania

Ta sama krzywa, różne czasy trwania.
instant0ms
Zastępstwa przy ograniczonym ruchu, natychmiastowa informacja zwrotna.
fast100ms
Najechanie, naciśnięcie, zmiany koloru i przezroczystości.
base160ms
Drobne zmiany stanu: przełączniki, zaznaczenia, zakładki.
moderate220ms
Pojawianie się menu, popoverów i podpowiedzi.
slow320ms
Pojawianie się okien dialogowych i paneli.
slower480ms
Duże zmiany układu, odsłony całej strony.

Krzywe przejścia

prfct ma cztery krzywe cubic-bézier i dwie sprężyny. Sprężyny są symulowane na podstawie parametrów fizycznych (sztywności i tłumienia) i zapisane jako funkcje CSS linear() — to prawdziwy ruch sprężyny w przejściach CSS, bez biblioteki animacji i bez JavaScriptu w głównym wątku.

Każda kropka pokonuje ten sam dystans w czasie swojego tokenu.

ease-standard700ms

Domyślna dla elementów, które zmieniają się w miejscu.

ease-enter700ms

Elementy wchodzące na ekran. Szybki start, długie wyhamowanie.

ease-exit700ms

Elementy znikające. Przyspiesza przy wyjściu; łącz z krótszymi czasami.

ease-move700ms

Elementy przemieszczające się z miejsca na miejsce na ekranie.

ease-spring521ms

Fizyczna, responsywna reakcja: przełączniki, puszczenie po przeciągnięciu, popovery.

ease-bounce859ms

Zabawne podkreślenie: potwierdzenia sukcesu, pojawiające się odznaki.

// A switch thumb that settles like a physical toggle
<span className="transition-transform duration-spring ease-spring" />
TokenZastosowanie
ease-standardDomyślna dla wszystkiego, co zmienia się w miejscu: kolor, rozmiar, położenie w układzie.
ease-enterElementy, które się pojawiają. Szybki start, długie wyhamowanie.
ease-exitElementy, które znikają. Przyspiesza, odchodząc.
ease-moveElementy przemieszczające się po ekranie.
ease-springFizyczne reakcje na bezpośrednią manipulację: przełączniki, suwaki, puszczenie po przeciągnięciu.
ease-bounceRzadkie, zabawne potwierdzenie. Najwyżej raz w danym procesie.

Klasy choreografii

Komponenty współdzielą ruch dzięki trzem klasom narzędziowym, więc każda nakładka w systemie porusza się tak samo:

KlasaDziałanie
popup-motionPojawienie się i skalowanie od kotwicy z przesunięciem o 4 px od strony, po której element się otwiera; szybsze wyjście z przyspieszeniem.
modal-motionPojawienie się, skalowanie i uniesienie — dla okien dialogowych i palet.
backdrop-motionPłynnie pokazuje i ukrywa przyciemnienie w rytmie powierzchni nad nim.

Sterują nimi atrybuty data-starting-styledata-ending-style z Base UI, więc animacje da się przerwać: zamknięcie menu w połowie otwierania płynnie odwraca ruch od miejsca, w którym akurat jest.

Ograniczony ruch

Gdy system operacyjny prosi o ograniczenie ruchu, prfct skraca każde przejście i każdą animację do zera. Połysk szkieletów ładowania i obrót spinnera się zatrzymują; stan nadal się zmienia, więc nic nie ginie. Ponieważ prfct nigdy nie przekazuje znaczenia ruchem, jest to zawsze bezpieczne.

Testuj z włączonym ograniczeniem ruchu — w macOS: Ustawienia systemowe → Dostępność → Ruch → Redukuj ruch (przed macOS 26: Ekran); w DevTools: Renderowanie → Emuluj funkcję mediów CSS „prefers-reduced-motion”.