Vlastnost CSS aspect-ratio
vám umožňuje vytvářet pole, která zachovávají proporcionální rozměry, kde pole height
a width
pole se počítá automaticky jako poměr. Je to trochu matematika, ale myšlenka je, že na této vlastnosti můžete rozdělit jednu hodnotu druhou a vypočítaná hodnota zajistí, že rámeček zůstane v tomto poměru.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
je definován ve specifikaci CSS Box Sizing Module Level 4, která je aktuálně v pracovní verzi. To znamená, že stále probíhá a má šanci se změnit. Ale protože jej Chrome a Firefox podporují za experimentální vlajkou a Safari Technology Preview přidává podporu pro něj počátkem roku 2021, existují silné signály, které aspect-ratio
získávají velkou dynamiku.
Syntax
aspect-ratio: auto || ;
V jednoduché angličtině: aspect-ratio
buď se předpokládá, že je auto
ve výchozím nastavení, nebo přijímá a jako hodnotu kde
.
- Počáteční hodnota:
auto
- Platí pro: všechny prvky kromě vložených polí a vnitřních rubínových nebo tabulkových polí
- Zděděno: ne
- Procenta: n / a
- Vypočítaná hodnota: zadané klíčové slovo nebo dvojice čísel
- Typ animace: diskrétní
Hodnoty
/* 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;
Funguje na nahrazeném a nenahrazeném obsahu
Pokud si myslíte: „Uhm, jo, nedělá to pro nás prohlížeč na obrázcích?“ odpověď je: absolutně . Prohlížeče provádějí některé fantastické výpočty poměru stran u nahrazeného obsahu, jako jsou obrázky. Pokud má tedy obrázek, řekněme, šířku 500 pixelů, prohlížeč ohne své algoritmy rozvržení CSS tak, aby zachoval vnitřní nebo „přirozené“ rozměry obrazu. aspect-ratio
Vlastnost může být použita k účinnému potlačení těchto přírodních rozměrů.
Ale obsah non-nahradil nemá přirozený podíl. To je většina věcí, se kterými pracujeme, jako divy. Spíše než se snažit zachovat přirozené proporce prvku, aspect-ratio
nastaví „preferovanou“ velikost.
Specifikace nyní uvádí, že starší specifikace CSS, zejména CSS 2.1, neobsahují jasný rozdíl mezi nahrazeným a nenahrazeným obsahem. To znamená, že jsme mohli vidět některé další speciální případy přidané do specifikace, abychom je pomohli objasnit. Prozatím vidíme, že prohlížeče zavádějí podporu pro nastavení preferovaných poměrů stran na nahrazené a nenahrazené samostatně, kde některé prohlížeče s časnou podporou za experimentálním příznakem mohou podporovat aspect-ratio
pouze nenahrazený obsah. Při vývoji se rozhodně vyplatí sledovat podporu prohlížeče.
Funguje samostatně bez zadání a width
neboheight
Takže jo, můžeme to jednoduše umístit na prvek jako je tento:
.element ( aspect-ratio: 16 / 9; )
… A výchozí nastavení prvku se implicitně width: auto
spustí a nastaví rozměry prvku.
Změní se, když jsou width
nebo height
jsou na stejném prvku
Řekněme, že máme prvek s šířkou 300px
a aspect-ratio
z 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
Přirozeně aspect-ratio
chce vypočítat rozměry prvku samostatně a bude tak činit na základě kontextu, kde je použit. Ale s tím width
hodil, říká poměr stran k výpočtu pole poměru stran prvku pomocí 300px
jako šířka. Výsledkem je, že jsme právě napsali:
.element ( height: 100px; width: 300px; )
To dává smysl! Pamatujte, že pokud nejsou zadány žádné width
nebo height
jsou, prohlížeč předpokládá, že jsou auto
a jde odtud. Když poskytneme explicitní hodnoty width
a height
hodnoty, jsou to právě to, co se zvykne.
V některých situacích je ignorována
To je místo, kde se věci trochu zamotají, protože existují případy, kdy aspect-ratio
je přehlédnut nebo jsou jeho výpočty ovlivněny jinými vlastnostmi. To zahrnuje:
Když jsou oba width
a height
jsou deklarovány na prvku
Právě jsme viděli, jak deklarace buď width
nebo height
na a element ovlivní výpočet aspect-ratio
. Ale pokud prvek již má a width
a height
, ty se zvyknou místo aspect-ratio
. Vyžaduje přepsání obou vlastností aspect-ratio
; nastavení buď height
nebo width
samostatně nezruší poměr stran prvku.
Dělá sny, že? Pokud použijete buď width
nebo height
vynutíte aspect-ratio
použití této hodnoty ve výpočtu, pak logicky vyplývá, že použití obou by úplně přepsalo aspect-ratio
úplně, protože obě hodnoty jsou již poskytnuty a nastaveny.
Když obsah vybočí z poměru
Jednoduše řečeno, pokud máte prvek s poměrem stran a obsah je tak dlouhý, že nutí prvek se rozbalit, pak se prvek rozbalí. A pokud se prvek rozbalí, změní se jeho rozměry, a tedy už žádný poměr stran. To je důvod, proč specifikace říká, že vlastnost nastavuje „preferovaný“ poměr stran. Je to upřednostňováno, ale není předepsáno.
Nelíbí se vám, jak to funguje? Nastavení min-height: 0;
prvku umožní obsahu přetéct upřednostňovaný poměr stran místo jeho rozšiřování.
Když to „ztratí“ min-*
a max-*
vlastnosti
Jen jsme trochu viděli, jak to funguje, že? Když obsah přesáhne rozměry pole, aspect-ratio
je fakticky pryč, protože se pole rozšiřuje o obsah. Můžeme to přepsat min-width: 0
.
To proto, že všechny min-*
a max-*
vlastnosti typicky bitva width
a height
o nadvládu ve válce nad výpočty box model. Například:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Ale:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
To proto, že min-width
buď brání v překročení width
určité hodnoty, nebo je ignorováno, protože width
sada již nastavila prvek nad minimální šířku, kterou potřebuje. Totéž platí pro min-height
, max-width
a max-height
.
Smysl toho všeho: pokud nastavíme vlastnost a min-*
nebo max-*
vlastnost na stejný prvek jako aspect-ratio
a ony „vyhrají“ nad width
nebo height
, pak budou mít přednost aspect-ratio
. Říkal jsem ti, že to bylo trochu bláznivé. ?
Podpora prohlížeče
TJ | Okraj | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|---|
Ne | Ne | 86 1,2,3 | 90 4 | TP 5 | Ne |
Android Chrome | Android Firefox | Prohlížeč Android | iOS Safari | Opera Mobile |
---|---|---|---|---|
Ne | Ne | Ne | Ne | Ne |
1 Lze povolit nastavením
layout.css.aspect-ratio.enabled
na true
.2 Podpora bloků a nahrazených prvků zavedených ve Firefoxu 81.
3 Podpora flex položek zavedených ve Firefoxu 83.
4 Lze povolit nastavením
#enable-experimental-web-platform-features
na Povoleno.5 K dispozici v Safari Technology Preview 118.