CSS - marginauto; - Hoe het werkt
Gebruik makend van margin: auto
om een blokelement horizontaal te centreren is een algemeen bekende techniek. Maar heb je je ooit afgevraagd waarom of hoe het werkt? Om dit te beantwoorden, moeten we eerst kijken hoe marge: auto werkt. Ook in de mix is wat auto
kan mogelijk in marges werken, als het werkt voor verticale centrering, en een paar andere problemen.
Maar eerst, wat doet auto
eigenlijk doen?
De definitie van auto
verschilt met elementen, element types en context. In marges, auto
kan een van twee dingen betekenen: neem de beschikbare ruimte in beslag of 0 px. Deze twee zullen definieer verschillende lay-outs voor een element.
"auto" Beschikbare ruimte innemen
Dit is het meest voorkomende gebruik van marge auto
we komen vaak tegen. Door toe te wijzen auto
links en rechts van een element nemen ze de beschikbare horizontale ruimte in de container van het element gelijk op - en dus wordt het element gecentreerd.
Dit werkt echter alleen voor horizontale marges (meer op de waarom later), en ook zal niet werken met floated en inline elementen en op zichzelf ook kan niet werken in absoluut en vast gepositioneerde elementen (we zullen echter wel zien hoe we die kunnen laten werken).
Faux Float door beschikbare ruimte in te nemen
Sinds auto
in zowel de linker- als de rechtermarges neemt u de "beschikbare" ruimte gelijk op, wat denkt u dat er zal gebeuren als de waarde auto
wordt slechts aan een van hen gegeven?
Een linker of rechter marge met auto
neemt alle "beschikbare" ruimte in beslag waardoor het element eruit ziet alsof het rechts of links is gespoeld.
“auto” Berekend naar 0px
Zoals eerder vermeld, auto
werkt niet in zwevende, inline en absolute elementen. Al deze elementen hebben al besloten over hun lay-outs, dus het heeft geen zin om te gebruiken auto
voor de marges en verwachten dat het zo gecentreerd wordt.
Dat zal het oorspronkelijke doel van het gebruik van zoiets verslaan vlotter
. Vandaar auto
zal in die elementen een waarde van 0px hebben.
auto
zal ook niet werken op een typisch blokelement als het geen breedte heeft. Alle voorbeelden die ik tot nu toe heb laten zien hebben breedtegraden.
Een waardewaarde auto
zal hebben 0px
marges. De breedte van een blokelement dekt doorgaans de container af wanneer deze is auto
of 100%
en dus een marge auto
zal worden berekend 0px
in zo'n geval.
Wat gebeurt er met verticale marges met de waarde auto
?
auto
in zowel de boven- als ondermarges wordt altijd berekend tot 0px (behalve voor absolute elementen). W3C spec zegt het zo:
“Als “margin-top” of “margin-bottom” is “auto”, hun gebruikte waarde is 0 "
Het waarom, nou dat is tot nu toe, een mysterie. Het kan zijn vanwege de typische verticale paginastroom, waar de paginagrootte neemt qua hoogte toe. Dus, door een element verticaal in de container te centreren, zal het niet gecentreerd lijken ten opzichte van de pagina zelf, in tegenstelling tot wanneer het horizontaal wordt gedaan (in de meeste gevallen).
En misschien is het om dezelfde reden dat ze besloten om een uitzondering toe te voegen voor absolute elementen die verticaal langs de hele pagina kunnen worden gecentreerd.
Het kan ook het gevolg zijn van het margestorteffect (een instorting van aangrenzende elementen” marges), wat een andere uitzondering is voor de verticale marges.
Dit laatste lijkt echter een onwaarschijnlijk geval - aangezien elementen die hun marges niet doen instorten - zoals Floats en elementen met overloop
anders dan zichtbaar
, nog steeds 0px verticale marges toewijzen voor auto
.
Centreert absoluut geplaatste elementen
Aangezien er toevallig een uitzondering is voor absoluut gepositioneerde elementen, wij”Ik gebruik auto
waarde om een verticaal en horizontaal te centreren. Maar daarvoor moeten we uitzoeken wanneer zal margin: auto
eigenlijk werken zoals we het willen in een absoluut gepositioneerd element.
Dit is waar een andere W3C-specificatie in komt:
"Als alle drie van “links”, “breedte”, en “rechts” zijn “auto”: Stel eerst een in “auto” waarden voor “-Marge” en “margin-right” tot 0 ... "
"Als geen van de drie is “auto”: Als beide “-Marge” en “margin-right” zijn “auto”, los de vergelijking op onder de extra beperking dat de twee marges gelijke waarden krijgen "
Dat zegt zo ongeveer horizontaal auto
marges om gelijke ruimtes te veroveren, de waarden voor links
, breedte
en rechts
zou niet moeten zijn auto
, hun standaardwaarde. Dus alles wat we moeten doen is ze waarde te geven in een absoluut gepositioneerd element. links
en rechts
zou moeten hebben gelijke waarden voor een perfecte centrering.
De specificatie vermeldt ook iets soortgelijks voor verticale marges.
“Als alle drie van “top”, “hoogte”, en “bodem” zijn auto, ingesteld “top” naar de statische positie ... ”
“Als geen van de drie zijn “auto”: Als beide “margin-top” en “margin-bottom” zijn “auto”, los de vergelijking op onder de extra beperking dat de twee marges gelijke waarden krijgen ... ”
Vandaar dat er een absoluut element moet zijn gecentreerd verticaal, haar top
, hoogte
, en bodem
waarden zouden dat niet moeten zijn auto
.
Nu door al deze te combineren, is dit wat wij”Ik krijg:
Conclusie
Als je ooit een element op je pagina naar rechts of links wilt spoelen zonder de volgende elementen erin te verpakken (zoals wat er gebeurt met float), onthoud dan dat er een optie is om te gebruiken auto
voor marges.
Het omzetten van een element in absoluut, zodat het verticaal gecentreerd kan zijn, is misschien geen goed idee. Er zijn andere opties zoals flexbox en CSS-transformatie die daar meer geschikt voor zijn.