Właściwość CSS aspect-ratio
umożliwia tworzenie ramek, które zachowują proporcjonalne wymiary, w których height
i width
pola są obliczane automatycznie jako współczynnik. To trochę matematyczne, ale chodzi o to, że możesz podzielić jedną wartość przez drugą na tej właściwości, a obliczona wartość zapewni, że pudełko pozostanie w tej proporcji.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
jest zdefiniowany w specyfikacji CSS Box Sizing Module Level 4, która jest obecnie w wersji roboczej. Oznacza to, że nadal trwa i może się zmienić. Ale dzięki przeglądarkom Chrome i Firefox obsługującym tę funkcję za flagą eksperymentalną, a Safari Technology Preview dodającej jej obsługę na początku 2021 r., Istnieją silne sygnały, które aspect-ratio
zyskują na popularności.
Składnia
aspect-ratio: auto || ;
Mówiąc prostym językiem: aspect-ratio
albo zakłada się, że auto
jest to ustawienie domyślne, albo przyjmuje jako wartość gdzie
.
- Wartość początkowa:
auto
- Dotyczy: wszystkich elementów oprócz pudełek inline i wewnętrznych rubinów lub pudełek stołowych
- Odziedziczone: nie
- Procenty: nie dotyczy
- Wartość obliczona: określone słowo kluczowe lub para liczb
- Typ animacji: dyskretna
Wartości
/* Keyword values */ aspect-ratio: auto; /* default */ /* Ratio values */ aspect-ratio: 1 / 1; /* width and height are equal proportion */ aspect-ratio: 2 / 1; /* width is twice the height*/ aspect-ratio: 1 / 2; /* width is half the height */ aspect-ratio: 16 / 9 /* typical video aspect ratio */ /* Global values */ aspect-ratio: inherit; aspect-ratio: initial; aspect-ratio: unset;
Działa na treściach zastąpionych i niezastąpionych
Jeśli myślisz: „Hmm, tak, czy przeglądarka nie robi już tego za nas na obrazach?” odpowiedź brzmi: absolutnie . Przeglądarki wykonują fantazyjne obliczenia współczynnika proporcji dla zastępowanych treści, takich jak obrazy. Tak więc, jeśli obraz ma, powiedzmy, szerokość 500 pikseli, przeglądarka dostosowuje swoje algorytmy układu CSS, aby zachować wewnętrzne lub „naturalne” wymiary obrazu. aspect-ratio
Nieruchomość może być stosowany skutecznie zastąpić te naturalne wymiary.
Jednak niezastąpiona zawartość nie ma naturalnej proporcji. To większość rzeczy, z którymi pracujemy, na przykład div. Zamiast starać się zachować naturalne proporcje elementu, aspect-ratio
ustaw „preferowaną” wielkość.
Obecnie specyfikacja zauważa, że starsze specyfikacje CSS, zwłaszcza CSS 2.1, nie zawierają wyraźnego rozróżnienia między zastąpioną i niezastąpioną zawartością. Oznacza to, że mogliśmy zobaczyć dodatkowe przypadki specjalne dodane do specyfikacji, aby je wyjaśnić. Na razie obserwujemy, jak przeglądarki wprowadzają obsługę osobnego ustawiania preferowanych proporcji dla zastąpionych i niezmienionych, gdzie niektóre przeglądarki z wczesnym wsparciem za flagą eksperymentalną mogą obsługiwać tylko aspect-ratio
niezastąpione treści. Zdecydowanie warto mieć oko na ewoluującą obsługę przeglądarek.
Działa samodzielnie bez określenia width
lubheight
Więc tak, możemy po prostu upuścić to na takim elemencie:
.element ( aspect-ratio: 16 / 9; )
… A domyślny element width: auto
uruchamia się niejawnie, aby ustawić wymiary elementu.
Zmienia się, gdy width
lub height
są na tym samym elemencie
Powiedzmy, że mamy element o szerokości 300px
i aspect-ratio
of 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
Z natury aspect-ratio
chce samodzielnie obliczyć wymiary elementu i zrobi to na podstawie kontekstu, w którym jest używany. Ale po width
wrzuceniu tego mówi współczynnik kształtu, aby obliczyć pole współczynnika proporcji elementu, używając 300px
jako szerokości. W rezultacie jest tak, jakbyśmy właśnie napisali:
.element ( height: 100px; width: 300px; )
To ma sens! Pamiętaj, że jeśli nie są określone width
lub nie height
są określone, przeglądarka zakłada, że są auto
i przechodzi stamtąd. Kiedy podajemy wartości width
i height
wartości, są one używane.
W niektórych sytuacjach jest to ignorowane
To jest sytuacja, w której sprawy stają się nieco giętkie, ponieważ są przypadki, w których aspect-ratio
jest przeoczane lub na obliczenia wpływają inne właściwości. To obejmuje:
Gdy oba width
i height
są zadeklarowane w elemencie
Właśnie widziałem jak deklarowania albo width
czy height
on i elementem wpłynie na obliczenie aspect-ratio
. Ale jeśli element ma już zarówno width
a height
, jak i , zostaną one użyte zamiast aspect-ratio
. Wymaga obu właściwości, aby nadpisać aspect-ratio
; ustawienie samodzielnie height
lub width
samodzielnie nie wpłynie na współczynnik proporcji elementu.
Robi senes, prawda? Jeśli użycie jednej z opcji width
lub height
wymusza aspect-ratio
użycie tej wartości w obliczeniach, to logicznie wynika, że użycie obu spowoduje całkowite zastąpienie, aspect-ratio
ponieważ obie wartości są już podane i ustawione.
Kiedy treść wychodzi poza stosunek
Mówiąc najprościej, jeśli masz element o współczynniku proporcji, a zawartość jest tak długa, że wymusza rozszerzenie elementu, element zostanie rozszerzony. A jeśli element się rozszerzy, zmienią się jego wymiary, a tym samym nie będzie już proporcji. Dlatego specyfikacja mówi, że właściwość określa „preferowany” współczynnik proporcji. Jest to preferowane, ale nie przepisane.
Nie podoba ci się, jak to działa? Ustawienie min-height: 0;
elementu pozwoli zawartości przepełnić preferowany współczynnik proporcji zamiast go rozszerzać.
Kiedy „traci” się min-*
i max-*
właściwości
Po prostu widzieliśmy, jak to działa, prawda? Gdy zawartość przekracza wymiary pudełka, w aspect-ratio
rzeczywistości znika, ponieważ pudełko rozszerza się wraz z zawartością. Możemy to zmienić min-width: 0
.
To dlatego, że wszystkie wymienione min-*
i max-*
właściwości typowo bitwa width
i height
do supremacji w wojnie nad obliczeń Box modelu. Na przykład:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Ale:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
Dzieje się tak, ponieważ min-width
albo zapobiega width
zejściu poniżej określonej wartości, albo jest ignorowane, ponieważ width
ustawił już element poza minimalną wymaganą szerokością. To samo odnosi się do min-height
, max-width
i max-height
.
Chodzi o to, że jeśli ustawimy obie właściwości a min-*
lub max-*
na tym samym elemencie co aspect-ratio
i one „wygrywają” nad width
lub height
, to one mają pierwszeństwo aspect-ratio
. Mówiłem ci, że to trochę rozmyślające. ?
Wsparcie przeglądarki
TO ZNACZY | Brzeg | Firefox | Chrom | Safari | Opera |
---|---|---|---|---|---|
Nie | Nie | 86 1.2,3 | 90 4 | TP 5 | Nie |
Android Chrome | Android Firefox | Przeglądarka Android | iOS Safari | Opera Mobile |
---|---|---|---|---|
Nie | Nie | Nie | Nie | Nie |
1 Można włączyć, ustawiając
layout.css.aspect-ratio.enabled
na true
.2 Obsługa bloków i zastępowanych elementów wprowadzona w Firefoksie 81.
3 Obsługa elementów elastycznych wprowadzona w Firefoksie 83.
4 Można włączyć, ustawiając
#enable-experimental-web-platform-features
na Włączone.5 Dostępne w Safari Technology Preview 118.