Positioneringar: Relative – absolute – float och z-index
Postad: 21 december 2007 | CSS-guider | No CommentsDen här guiden fokuserar på positioneringarna relative, absolute, float och z-index samt clear:float och clearfix:after.
Exempelkod 1 specificerar blocket som berörs (wrapper).
Nummer 2 specificerar flera element.
Exempel 3 är global.
Nummer 1
.wrapper:after {
content: '';
display: block;
clear: both;
}
Nummer 2 (wp-specifik)
.clear:before,
.clear:after,
.entry-content:before,
.entry-content:after,
.entry-footer:before,
.entry-footer:after,
.comment-content:before,
.comment-content:after,
.site-header:before,
.site-header:after,
.site-content:before,
.site-content:after,
.site-footer:before,
.site-footer:after,
.nav-links:before,
.nav-links:after,
.pagination:before,
.pagination:after,
.comment-author:before,
.comment-author:after,
.widget-area:before,
.widget-area:after,
.widget:before,
.widget:after,
.comment-meta:before,
.comment-meta:after {
content: "";
display: table;
table-layout: fixed;
}
Nummer 3
.clearfix:after { content: ""; display: table; clear: both; }
Läs mer om clear-attributet:
- https://theclearfix.blogspot.com/2015/03/best-of-css-clearfix-hack.html
- https://www.sitepoint.com/clearing-floats-overview-different-clearfix-methods/
- https://davidwalsh.name/css-clear-fix
- https://css-tricks.com/almanac/properties/c/clear/
- https://css-tricks.com/snippets/css/clear-fix/
- https://perishablepress.com/lessons-learned-concerning-the-clearfix-css-hack/
Positioneringar
Clear-attributet används i kombination med hur/var våra positionerade element, exempelvis float:left respektive float:right, ska ”clearas” (avslutas), i synnerhet om vi vill ha flera block som ligger bredvid varandra. Idag har man övergått till att använda display. Display är en egenskap med flera olika värden beroende hur du vill positionera dina html-element.
De två absolut vanligaste värden är display:inline och display:block. Men det finns många fler värden att använda.
inline | block | list-item | run-in | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | none | inherit
Det går fortfarande bra att använda de traditionella float-attributen men de fasas ut allt mer till fördel för de nyare mer effektiva och kodvänligare teknikerna.
Läs mer om display:
- https://www.w3.org/TR/css-display-3/
- https://www.tutorialrepublic.com/css-tutorial/css-display.php
- https://css-tricks.com/almanac/properties/d/display/
- https://www.coffeecup.com/help/articles/how-to-use-css-display-properties-in-responsive-layout-maker/
- https://www.techonthenet.com/css/properties/display.php
- https://www.w3.org/wiki/CSS/Properties/display
Vad är positionering?
För att kunna utnyttja css maximalt är det bra att veta lite om hur positioneringar fungerar och vad det innebär.
CSS-syntaxen är följande:
position: static|absolute|fixed|relative|sticky|initial|inherit;
Utöver ovanstående så har vi ytterligare några ”hjälpande” egenskaper.
top | right | bottom | left | (och z-index)
z-index hur fungerar det?
Default/standard staplingsordning
Först ska vi kika på hur standardordningen ser ut när webbläsaren staplar element ifall inget z-index används.
- Rotelement ( -elementet)
- Icke-placerade element i den ordning de definieras
- Positionerade element i den ordning de definieras
Ett icke-placerat element är ett element med statiskt standardvärde. Ett placerat element är ett element med något annat positionsvärde som exempel absolute, relative, sticky eller fixed.
XYZ
Vi har höjden (y-axeln – vertikal) och bredden (x-axeln – horisontell) som två dimensioner. Z är den tredje dimensionen. Du kan positionera element ovanpå/under eller bakom/framför varandra, beroende på hur man vill se det.
Bildkälla: https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/images/cc190397.jolt_zorder_04(en-us,vs.95).png
Ingen angiven z-index på ett element innebär att det ligger längst bort/underst från besökaren sett i läget default som motsvarar z-index 0. Ju lägre värde desto längre bort hamnar elementet.
Det går även utmärkt att använda ett negativt värde på z-index, exempelvis z-index:-3;
Man tvingar då elementet ned under zero – default.
Lager -3
Lager -2
Lager -1
Lager 0 (default lager eller ingen z-index angiven)
Lager 1
Lager 2
Lager 3
Z-index fungerar inte om du inte också specificerar dess position: absolute; eller position: relativ;
#lager1 { z-index: 1; position: absolute; width: 150px; height: 350px; top: 10px; right: 10px; background-color: #fff; }
#lager2 { z-index: 2; position: relative; width: 150px; height: 350px; top: 15px; left: 20px; background-color: #999; }
Denna fungerar inte #lager3 { z-index: 2; width: 150px; height: 350px; top: 15px; left: 20px; background-color: #333; }
Position default
Arbetar du med stylesheets har du med all säkerhet tidigare träffat på relative, absolute och float.
Utgångsläget i flödet för en webbsida där ingen cssdefinition har angetts är ett så kallat statiskt läge – också benämnt som default (grundläge).
Det innebär att alla element, såsom text, bilder, boxar, bilder och så vidare ställer sig i vänsterställt läge.
Position: relative
När du använder position:relative kan du förflytta blockets position i top – left – right – bottom-lägen i förhållande till hur det normalt skulle ha positionerats i läget default.
Denna box ligger i läget default – det vill säga den är statisk utan angiven positionering. Du ser det genom att boxen har lagt sig åt vänster och högst upp till vänster.
#div1 { background-color:#ccc; width:300px; }
Som ni ser har jag inte angivit några fler cssdefinitioner än bredd och bakgrundsfärg. Vad vi däremot bör vara uppmärksamma på är att så fort vi definierar våra positioner så uppstår genast andra fenomen.
Position:relativ i positionerat läge
Boxen ligger i läget position:relative – och har positionerats 20px från top samt 20px från left.
#div1a { position:relative; top:20px; left:20px; background-color:#ccc; width:300px; }
I klartext innebär detta att om du har ändrat boxens position med 20 px i både left och top så har vi förvisso flyttat ut boxen från marginalerna. Emellertid räknas fortfarande utrymmet mellan box och kanter in i boxens totala yta även om det ser ut som om vi har flyttat på den.
Det här beror på att boxens yta fortfarande tar upp samma plats som i defaultläget.
Vi har en box på 300 pixlars höjd och bredd. Till det plussar vi 20 pixlar på bredden och höjden. Med andra ord är den totala ytan nu 320 pixlar bred och hög.
Eftersom det tomma utrymmet omfattar boxens yta kan vi inte heller placera något annat där, förutom med z-index och negativt värde.
När vi då ska placera ut andra element på sidan är det därför viktigt att också räkna med det ”tomma” utrymmet i boxen. Risken är annars stor att divblocken inte får plats om man inte är medveten om hur positioneringen fungerar.
Position:absolute
När man använder position:absolute frilägger man det specifika blocket från dokumentet. De andra elementen i dokumentet kan därmed inte påverka blockets placering.
See the Pen
Relative Children by Chris Coyier (@chriscoyier)
on CodePen.
För att inte bryta designen har jag lånat denna CodePen: Relative Children av Chris Coyier (@chriscoyier) som på ett bra sätt illustrerar position:absolute.
Nu pratar vi om placering av ett lager på en exakt plats. Med position:absolute kan man alltså lägga fler lager ovanpå varandra. Men det finns en problematik med position:absolute.
Lager position:absolut utan angiven bredd
Om lagret bara innehåller ett enda ord blir den bara så bred som ordet. Lägger du till två ord så kommer lagret endast att växa sig två ord bredare. Så här kommer det att fortgå ända tills lagret är 100% av föräldrarnas bredd (närmaste förälder med relativ positionering eller webbläsarfönster).
Det finns också en risk för att divblocket inte intar sitt exakta läge om du har en responsiv/fluid design i procent utan fast bredd.
Float – clear:float och clearfix:after
Float betyder flyter. Det kan man ju räkna ut av namnet. Med float kan man förflytta ett element antingen så långt det är möjligt åt höger eller åt vänster och sedan låta texten omgärda elementet.
Float är därför bra att använda när man till exempel har bilder och vill att texten ska ”flyta” runt dessa men är också användbart när man skapar olika divblock till en layout.
Använder du float så måste du avsluta ditt område så inte andra element påverkas. Därför lägger man till clear.
Clear
Clear bryter det flytande området så ingen text eller andra element seglar upp och lägger sig vid sidan av det flytande elementet. Förutsatt att de inte ska göra det förstås.
Html-koden placeras omedelbart efter koden för det flytande elementet.
<div class="clear"></div>
I en layout är det då i div footer man vanligen placerar cssvärdet för clear och behöver således inte lägga ut htmlkoden för clear i själva dokumentet.
#footer {clear:both;}
Om vi lägger två kolumner i float left så kommer den ena att lägga sig bredvid den andra så länge det finns utrymme för detta.
#float1 { float:left; width:350px; background-color:#ccc; padding:10px; }
#float2 { float:left; width:350px; background-color:#aaa; padding:10px; }
Väljer vi däremot att lägga ett varsitt divblock i left respektive right float position kommer de att söka sig mot respektive kant.
HTML-koden
#leftfloat {
margin:1rem 0;
float:left;
padding:10px;
width:250px;
background-color:#ccc;
}
#rightfloat {
margin:1rem 0;
float:right;
padding:10px;
width:250px;
background-color:#aaa;
}
CSS
.clear {clear:both;}
Det här är den vanligaste placeringen när man skapar sig en layout. Vad som också är viktigt att komma ihåg är hur stort utrymme respektive block har att använda.
I de flesta fall har man en ”grundbox” – ett divblock man utgår ifrån – vanligtvis kallad wrapper eller container i vilken man sedan placerar sina olika divblock.
Med information menar jag dina andra divblock, texter och bilder. Lägger man sedan till en padding i wrapper måste man ta hänsyn till hur mycket utrymme det är som försvinner så att bredden på blocken inuti får plats.
Box i positionen float utan angiven bredd
Precis som jag tidigare skrev om position:absolut utan angiven bredd så har positionen float samma exakta beteende som med flytande element utan bredder.
På grund av detta kan vi inte helt förlita oss på dessa boxar utan angiven bredd i uppbyggnaden av den övergripande sidlayouten.
Om du till exempel skapar en flytande kolumn som sidofält/sidebar och sedan utgår från att något element inuti (ex citat, bild) ska vara där för att bibehålla bredden, då lär du att få problem.
Inline elements är också boxar
Vi lägger ofta fokus på boxar som element på blocknivå. Det är lika lätt att tänka att element på blocknivå är boxar.
Tänk istället på display:inline som smala rektanglar vilka omsluter varje rad. De kan ha margin, padding och border precis som alla andra boxar. En vänster-marginal skjuter boxen åt till höger, men bara den första raden eftersom det är början på boxen.
Paddingen appliceras ovan och under texten som den borde vara, och när den omsluts ignoreras raden ovanför paddingen och börjar där linjens höjd är tänkt att den ska börja.
Se sedan hur display:inline;
positioneras i jämförelse med display:inline-block
och display:block;
Float:left/right bild och text
Den här bilden har jag valt att lägga i en box med värdet float:left. Texten är däremot skriven utanför boxen inom vanlig styckemärkning, det vill säga inom p-attributet.
Jag har inte heller angett någon bredd på boxen eftersom jag vill att den ska kunna vara relativ, anpassningsbar för innehållet i den. Glöm inte att avsluta med clear-attributet!
#textfloat { float:left; padding:10px; } .clear{ clear:both;}
Den här bilden har jag valt att lägga i en box med värdet float:right. Texten är även här skriven utanför boxen inom vanlig styckemärkning, det vill säga inom p-attributet.
Även här har jag valt att inte ange någon bredd på boxen eftersom jag vill att den ska kunna vara relativ, anpassningsbar för innehållet i den. Glöm inte att avsluta med clear-attributet!
#textfloatright { float:right; padding:10px; } .clear{ clear:both;}
Vad du däremot kan göra är att placera ditt flytande element på en bestämd plats i själva layouten. Skillnaden är att ditt flytande element då får en på förhand planerad plats i förhållande till de andra div blockens placering.
Det är inte detsamma som att ha en absolut positionering därför att det frilagda blocket är inte beroende av de andra blockens placering utan endast till sin egen placering.
Ett absolut positionerat block var ju ett lager du kunde placera som flera lager ovanpå varandra. Det minns du nu.
Jag hoppas att du har haft nytta av denna guide. Är det något du vill förtydliga eller undrar över så kontakta mig.