CSS-egenskaben aspect-ratio
giver dig mulighed for at oprette felter, der opretholder proportionale dimensioner, hvor height
og width
af en boks automatisk beregnes som et forhold. Det er lidt matematik-y, men ideen er, at du kan dele en værdi med en anden på denne egenskab, og den beregnede værdi sikrer, at en boks forbliver i det forhold.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
er defineret i CSS Box Sizing Module Level 4 specifikation, som i øjeblikket er i Working Draft. Det betyder, at det stadig er i gang og har en chance for at ændre sig. Men med Chrome og Firefox, der understøtter det bag et eksperimentelt flag, og Safari Technology Preview tilføjer understøttelse af det i begyndelsen af 2021, er der stærke signaler, aspect-ratio
der vinder meget fart.
Syntaks
aspect-ratio: auto || ;
På almindelig engelsk: aspect-ratio
antages enten at være auto
standard eller accepterer a som en værdi hvor
.
- Startværdi:
auto
- Gælder for: alle elementer undtagen indbyggede kasser og interne rubin- eller bordkasser
- Arvet: nej
- Procentdele: ikke oplyst
- Beregnet værdi: specificeret nøgleord eller et par tal
- Animationstype: diskret
Værdier
/* 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;
Det fungerer på udskiftet og ikke-udskiftet indhold
Hvis du tænker: "Uhm, ja, gør browseren det ikke allerede for os på billeder?" svaret er: absolut . Browsere foretager nogle smarte billedformatberegninger på udskiftet indhold som billeder. Så hvis et billede f.eks. Har en bredde på 500 px, bøjer browseren sine CSS-layoutalgoritmer for at opretholde billedets iboende eller "naturlige" dimensioner. Den aspect-ratio
egenskab kan anvendes til effektivt at tilsidesætte de fysiske dimensioner.
Men ikke-udskiftet indhold har ikke en naturlig andel. Det er de fleste af de ting, vi arbejder med, som divs. Snarere end at forsøge at opretholde elementets naturlige proportioner, aspect-ratio
indstiller en ”foretrukken” størrelse.
Nu bemærker spec i øjeblikket, at ældre CSS-specifikationer, især CSS 2.1, ikke indeholder en klar skelnen mellem udskiftet og ikke-udskiftet indhold. Det betyder, at vi kunne se nogle ekstra specielle tilfælde tilføjet til specifikationen for at hjælpe med at afklare dem. For tiden ser vi browsere, der understøtter indstilling af foretrukne billedformater på udskiftet og ikke-udskiftet separat, hvor nogle af browsere med tidlig support bag et eksperimentelt flag muligvis kun understøtter aspect-ratio
ikke-udskiftet indhold. Absolut værd at holde øje med browserstøtten, når den udvikler sig.
Det fungerer alene uden at angive et width
ellerheight
Så ja, vi kan simpelthen slippe det på et element som dette:
.element ( aspect-ratio: 16 / 9; )
... og elementets standard width: auto
spark implicit ind for at indstille elementets dimensioner.
Det ændres, når width
eller height
er på det samme element
Lad os sige, at vi har et element med en bredde på 300px
og en aspect-ratio
af 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
Af natur aspect-ratio
ønsker at beregne elementets dimensioner alene og vil gøre det ud fra den sammenhæng, hvor det bruges. Men med det width
kastet ind fortæller det billedformat at beregne elementets billedformatboks ved hjælp af 300px
som bredden. Som et resultat er det som om vi bare er skrevet:
.element ( height: 100px; width: 300px; )
Dette giver mening! Husk, at når ingen width
eller height
er angivet, antager browseren, at de er auto
og går derfra. Når vi leverer eksplicit width
og height
værdier, er det det, der bliver vant.
Det ignoreres i nogle situationer
Det er her, tingene bliver lidt mind-bendy, fordi der er tilfælde, hvor aspect-ratio
det overses, eller dets beregninger er påvirket af andre egenskaber. Dette inkluderer:
Når begge width
og height
erklæres på elementet
Vi så lige, hvordan deklarering af enten width
eller height
til og element vil påvirke beregningen af aspect-ratio
. Men hvis elementet allerede har både a width
og height
, bliver de brugt i stedet for aspect-ratio
. Det kræver, at begge egenskaber tilsidesættes aspect-ratio
; indstilling af enten height
eller width
alene bryder ikke elementets billedformat.
Gør sener, ikke? Hvis du bruger en af width
eller height
tvinger den aspect-ratio
til at bruge denne værdi i beregningen, følger det logisk, at brug af begge dele helt vil tilsidesætte, aspect-ratio
da begge værdier allerede er angivet og indstillet.
Når indhold bryder ud af forholdet
Kort sagt, hvis du har et element med et billedformat, og indholdet er så langt, at det tvinger elementet til at udvide, vil elementet udvides. Og hvis elementet udvides, ændres dets dimensioner og dermed ikke mere billedformat. Dette er grunden til specifikationen, at egenskaben indstiller det "foretrukne" formatforhold. Det foretrækkes, men ikke ordineres.
Kan du ikke lide, hvordan det fungerer? Indstilling min-height: 0;
af elementet gør det muligt for indholdet at løbe over det foretrukne billedformat i stedet for at udvide det.
Når det "mister" til min-*
og max-*
egenskaber
Vi har lige set, hvordan det fungerer, ikke? Når indholdet overstiger boksens dimensioner, aspect-ratio
er det effektivt væk, fordi feltet udvides med indholdet. Vi kan tilsidesætte det med min-width: 0
.
Det skyldes, at alle egenskaber min-*
og max-*
egenskaber typisk kæmper width
og height
for overherredømme i krigen over Box Model-beregninger. For eksempel:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Men:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
Det skyldes, at min-width
det enten forhindres width
i at gå under en bestemt værdi, eller at det ignoreres, fordi det width
allerede har indstillet elementet ud over den mindste bredde, det skal være. Det samme gælder for min-height
, max-width
og max-height
.
Pointen med alt dette: hvis vi indstiller både a min-*
eller max-*
egenskab på det samme element som, aspect-ratio
og de "vinder" over width
eller height
, så vil disse tilsidesætte aspect-ratio
. Fortalte dig, at det var lidt mind-bendy. ?
Browsersupport
IE | Edge | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|---|
Ingen | Ingen | 86 1,2,3 | 90 4 | TP 5 | Ingen |
Android Chrome | Android Firefox | Android-browser | iOS Safari | Opera Mobile |
---|---|---|---|---|
Ingen | Ingen | Ingen | Ingen | Ingen |
1 Kan aktiveres ved at indstille
layout.css.aspect-ratio.enabled
til true
.2 Understøttelse af blokke og udskiftede elementer introduceret i Firefox 81.
3 Understøttelse af flekselementer introduceret i Firefox 83.
4 Kan aktiveres ved at indstille
#enable-experimental-web-platform-features
til Aktiveret.5 Fås i Safari Technology Preview 118.