Webboken

Appendix: Lösningar till vanliga problem

Ett kapitel om att inte återuppfinna hjulet

Nu har du kanske fått en bra känsla för hur man använder HTML och CSS för att skapa fantastiska designer. Det är dags för dig att komma ut i världen och skapa! När du är där ute kommer du garanterat stöta på vissa problem, och många av dessa har redan lösts otaliga gånger. Vi har därför inkluderat detta kapitel som en referens över välkända CSS-problem och dess respektive lösningar, för att du ska slippa uppfinna hjulet (igen).

Centrering av hela sidan

Att centrera hela sin sida kan ofta vara vettigt, speciellt i de fall då man har en fast eller halvfast layout. Många använder text-align för att centrera, men detta är givetvis helt fel (text- antyder ju att det handlar om text och inte element) — så här gör man det på rätt sätt; för enkelhetens skull väljer vi här att centrera body, som vi har satt en fast bredd på. Den här metoden fungerar dock på alla blockelement vars bredd inte är auto.

body{
    width: 40em;
    margin: 0 auto;
}

Genom att sätta marginalen till höger och vänster till auto säger vi åt webbläsaren att den ska försöka göra marginalerna till höger och vänster så stora som möjligt. Ni som kan lite matematik och förstår en del om optimering inser givetvis att den bästa lösningen är trivial; båda marginalerna blir lika stora och vårt element kommer att centreras. Vi skulle givetvis kunna byta ut 0 mot en mer lämplig marginal om vi vill ha mer plats under och över vårt element.

100% höjd, med eller utan sidfot

Ofta vill man ha en sida som täcker hela höjden på fönstret, men som expanderar när man har tillräckligt mycket innehåll. Om du någonsin försökt åstadkomma detta vet du förmodligen att det här inte är helt trivialt.

Det första man kommer att tänka på är height. Detta är rätt tänkt, men eftersom vi vill att elementet ska expandera när innehållet blir för stort bör vi istället använda egenskapen min-height, och lämpligtvis sätta denna till 100% (en fast bredd kan också vara bra att ha):

#container{
    min-height: 100%;
    width: 40em;
}

Nu borde väl allt fungera, tänker du kanske? Nja, inte riktigt. Förvisso kommer #container att fylla upp 100% av body; problemet är att body inte täcker hela fönstret. Detta rättar vi enkelt till genom att sätta höjden på body (och html) till 100%. Dessutom måste vin införa ett hack, _height, för att vissa versioner av IE inte hanterar min-height på rätt sätt.

html, body{
    height: 100%;
}
#container{
    min-height: 100%;
	_height: 100%;
    width: 40em;
}

Men hur gör jag med sidfoten då?

Om du vill ha en sidfot som håller sig till bottnen av sidan får du jobba lite till; och vi måste gå in och använda lite positionering. Vi kommer att utnyttja det faktum att absolut positionering alltid räknas från det närmsta föräldrarelementet med relativ positionering (eller fönstret, om inget sådant element finns). Därför sätter vi relativ positionering på vår #container och absolut positionering, med bottom: 0, på vår sidfot:

html, body{
    height: 100%;
}
#container{
    min-height: 100%;
    width: 40em;
    position: relative;
}
#footer{
    position: absolute;
    bottom: 0;
}

Notera att vi inte flyttar #container någonstans, även om den nu har relativ positionering. Vi kommer dock att stöta på ett problem nu; sidfoten kommer att överlappa viss text om den är tillräckligt lång. Detta löser vi genom att sätta en fast höjd på sidfoten, och en padding#container, som ska vara lika stor som sidfoten är hög, plus den marginal man vill ha mellan innehållet och sidfoten. Vi väljer en höjd på 3em och en marginal på 1em:

html, body{
    height: 100%;
}
#container{
    min-height: 100%;
    width: 40em;
    position: relative;
    padding-bottom: 4em;
}
#footer{
    position: absolute;
    bottom: 0;
    height: 3em;
}

Vår HTML bör då likna det här:

<body>
    <div id="container">
        <!-- Innehåll här -->

        <div id="footer">
            <!-- Sidfot här -->
        </div>
    </div>
</body>

Man skulle även kunna sätta margin och paddinghtml och body till 0, för att få sidan att verkligen gå hela vägen ut till kanten. Givetvis är det även vettigt att sätta lite stil på det hela, kanske med en bakgrundsbild eller en minimalistisk variant med endast en enfärgad bakgrund och en kantram? Det är upp till dig.

Fler vanliga problem?