Fiks CSS-bugs

I moderne webdesign er det mange utfordringer. De fleste av oss støter på ulike problemer, enten vi er nybegynnere eller drevne i faget. Utfordringen vi vil sette fokus på denne gangen er nettlesere og CSS-bugs. I denne kategorien stiller Internet Explorer (IE) i særklasse, og står for svært mange av problemene som skal løses. IE 6 er den store synderen, men også IE 7 har en del problemer.

Vi har samlet sammen fire velkjente og typiske IE 6 bugs, og forklarer deg hvordan du kan unngå eller fikse dem, slik at utseende på nettsiden fungerer i moderne nettlesere og IE 6. Stoffet er hentet fra de dyktigste folkene i bransjen og vi tar en gjennomgang for dere her.

Double Float-Margin Bug

Dette er en bug du garantert vil treffe på ofte om du jobber med floatlayouter. Kort fortalt dobler IE marginen på en div som har float og margin på den siden du setter float til. Løsningen er enkel og krever ikke en lang forklaring. Sett diven med float:left; eller right; til display:inline; så slutter IE med «togangern».

floatbug-safari-small.jpg100px avstand til venstre i Safari

floatbug-ie6-small.jpg200px avstand til venstre i Internet Explorer 6

Løsningen har ikke fått noe eget navn, men ble oppdaget av Steve Clason. Det er ikke nødvendig å isolere den for IE 6, men alle ekspertene anbefaler at bugfiksinger markeres godt.

.wrapper {
    float: left;
    padding: 3px;
    width: 405px;
    display: inline;  /* Fikser IE double float-margin bug. */
    margin-left: 100px;
    background: #fac853;
    border: 1px solid #fff;
}

Løsningen er også brukt for å fikse Duplicate Indent Bug.

IE Escaping Floats Bug

Dette er en bug du ikke vil treffe på like ofte som Double float-margin bug, men den gir innsikt i litt av den merkelige oppførselen IE har, som er veldig nyttig.

Se for deg en div uten width, height eller float. Inni denne er det mange diver som har width, height og float:left; eller right;. Til slutt er det plassert en div med clear: both; for å sikre at den ytre diven omslutter alle de indre divene.

dimensionbug-safari-small.jpgSafari pakker innholdet fint inn

dimensionbug-ie6-small.jpgIgjen strever Internet Explorer 6 med å oppføre seg riktig

Fordi den ytre diven ikke har width, height eller float, omslutter IE 6 bare noen få av de indre divene som har float. Det finnes flere løsninger på problemet, men det er kun Holly Hack (height:1%;) som ikke endrer på css'en som som i utgangspunktet er skrevet. Holly Hack trenger heller ikke å begrenses til IE 6 med * html, om du ønsker å slippe det.

Oppdatering

imack påpeker i kommentarfeltet under, at det ikke nødvendigvis er så fritt frem å eksponere Holly Hack for alle nettlesere. Flott om noen kan finne noe info om dette. Uansett er det kanskje like greit å bare eksponere height: 1%; for nettleseren som trenger det.

    * html .wrapper { height: 1%; } /* Viser Holly Hack kun for IE 6 */

En annen løsning er å gi den ytre diven en bredde eller floate til venstre eller høyre. Den merkelige oppførselen forklarer oss at IE trenger dimensjoner på layoutelementer for å vise dem riktig.

Explorer 6 Duplicate Characters Bug / IE 6 Ghost text bug

Mange utviklere liker å kommentere koden for å ha orden og oversikt. Dette kan by på problemer med IE 6 i spesielle tilfeller. Når den siste diven i en serie av diver med float:left; eller right; har maksimal width innenfor en omsluttende div, vil IE 6 duplisere de to siste tegnene i den siste diven, dersom det er HTML kommentarer blant divene med float. Jo flere kommentarer du putter inn mellom divene, jo flere tegn vil IE 6 duplisere.

duplicatecharacter-safari-small.jpgSafari viser siden normalt

duplicatecharacter-ie6-small.jpgInternet Explorer 6 dupliserer deler av innholdet

Det er flere måter å unngå denne bugen på. Om den siste diven med float:left; har mer enn 3px avstand på høyre side av den omsluttende diven, oppstår ikke problemet. Det er også en mulighet å gi den siste diven med float en (negativ) margin på -3px. En annen løsning er å benytte conditional comments <!--[if !IE]> comment <![endif]--> som i dette tilfellet er satt til å sjekke og skjule kommentarens innhold for IE.

Den siste løsningen er ikke like godt dokumentert som de andre. Løsningen er å sette display: inline; på divene med float.

CSS Box model

Av en eller annen grunn har IE valgt å tolke CSS Box model på en annen måte enn moderne nettlesere. IE inkluderer border og padding inne i width, mens moderne nettlesere legger til border og padding til width.

Det er viktig å merke seg at denne oppførselen ikke er noe problem så lenge man sørger for å gi HTML-dokumentet riktig deklarasjon. Det kalles å sette nettleseren i standards-compliant mode.

For eksempel:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Hvordan unngår man feilene i første omgang?

Det viktigste du kan gjøre for å unngå nettleserfeilene er å sørge for at koden er riktig. For utviklere som jobber på Mac, har vi tidligere nevnt Panics Coda, som kommer med innebygget validering (koblet mot w3.org). Men at koden er riktig, betyr ikke bare at den skal validere, for det skal den gjøre uansett. Det er også viktig å skrive semantisk riktig kode.

Veerle Pieters forklarer det godt:

Make sure your markup is well structured, in other words use the appropriate markup for the appropriate content. Use headings for titles, paragraphs for blocks of text, ordered and unordered lists to sum things up in list form or for your navigation, fieldsets in combination with legend and label elements for forms... Last but not least, use tables only for what they're meant for, tabular data.

Verktøy

CSSEdit

Milestones kan være et meget nyttig verktøy i bugfiksing om du bruker CSSEdit. Det fungerer slik at du lagerer revisjoner for CSS-filen du jobber på. Dermed er det enkelt å hoppe tilbake til en tidligere revisjon, hvis du får rotet til for mye i koden.

Firefox tillegg

- Web Developers Toolbar har litt av de samme egenskapene som CSSEdit, men også mye mer. Du kan for eksempel sjekke hvordan siden oppfører seg uten javascript, CSS eller bilder, som er en viktig del av tilgjengelighet og brukervennlighet.
- Firebug, med Yslow er også glimrende verktøy for alle som driver med webdesign. Med det kan du for eksempel teste hastigheten på nettsider, og optimalisere for best mulig strukturering av nettsiders ulike bestanddeler.

Kilder og ressurser:

Position Is Everything: Explorer Exposed!
CSS contents and browser compatibility
Starting with CSS and bug fixing tips
How To Attack An Internet Explorer (Win) Display Bug
Internet Explorer 6 Ghost text bug fix
Internet Explorer and the CSS box model
The Motive Web Design Glossary
On having layout (hasLayout) Takk for tipset imack

Valg for kommentarvisning

Velg din foretrukket måte å vise kommentarer på og klikk på "Lagre innstillinger" for å aktivere endringene.

martin

For de som er interessert i illustrasjonen på toppen, er den laget av Russell Tate :)

pepperogsalt

hvem bryr seg om folk som bruker IE6 anyways?

martin

@pepperogsalt: Det er fristene å ha den holdningen til saken, men svært sjeldent man kan tenke sånn. Hvis du har en nettbutikk med 70% IE-brukere, og 30% av dem bruker IE 6, vil det være dumt å miste den potensielle tjeningen fordi man ikke bryr seg om IE 6.

Her på Kreativ1 er det ca. 25% som bruker IE. Av dem, er det ca. 30% som bruker IE 6 og ca. 70% som bruker IE 7.

helge_karl

Det er litt drøyt at Microsoft ennå ikke har klart å få til en moderne og standard kapapel nettleser. Siden så mange bruker den så må man jo bruke 10 ganger så lang tid på å få nettsidene til å se noenlunde ok ut i den pestbefengte nettleseren.

kmac

Prøvde å validere en hjemmeside med Google Toolbar (Tools->Validate CSS), men får bare denne feilmeldingen:

I/O Error: The host name [index.php] couldn't be resolved. Details: "index.php"

Noen som vet hva dette er?

martin

@helge_karl: Ja, det er litt spesielt at Microsoft henger sånn etter. Men et annet aspekt er at det er så mange brukere som ikke holder utstyret oppdatert. Det synes jeg er litt rart.

@kmac: Ettersom hva jeg kan se, inneholder ikke Google Toolbar noen CSS validering. Er det Web Developers Toolbar du mener?

Uansett er det ikke noen garanti at siden er så godt satt opp at verktøyet forstår hvordan det skal håndtere valget du tar. Feilmeldingen kan tyde på at CSS'en gjenkjennes som en php-fil, istedenfor en css-fil.

For å manuelt validere CSS'en kan du finne stien i kildekoden og lime inn adressen eller hele koden hos http://jigsaw.w3.org/css-validator/

imack

Kjempeflott artikkel! Kommer helt sikker til å være nyttig for en del folk.

Hvis noen vil se på hvorfor IE oppfører seg så rart kan man lese om hasLayout her.

Også klarer jeg ikke la være å pirke litt. På Holly Hack skriver du at det ikke trenger å begrenses til IE6 med * html. Men det må den da virkelig? Med mindre du mener å bruke conditional comments uten å nevne det? Uansett, en height: 1% gir 'artige' feil i skikkelige browsere. Og å legge en float på den omsluttende div'en vil også løse problemet. Men da må man holde tunga rett i munnen på litt mer avanserte layouts, hvor du må floate div'er oppover i DOM-hierarkiet bare for å holde en liten boks langt nede på plass.

En annen vanlig 'feil' er når en omsluttende div forsvinner/kollapser, som igjen kommer av at innholdet er i float, og da blir det samme løsning som ovenfor. Men dette er ikke en IE-bug, men vanlig i alle browsere. Orker man ikke gå float-veien, så funker det med Holly Hack for IE6 og overflow: hidden; på den forsvunnede div'en for andre browsere.

Jeg tar forøvrig ingen høyde for IE eldre enn 6, og hvertfall ikke for IE5 på Mac med dette.

martin

Takk for tilbakemeldingen imack.

hasLayout artikkelen er god lesning. Jeg legger den til ressursene i bunnen av artikkelen.

Det er mulig som du påpeker at Holly Hack gir problemer i skikkelige browsere, men det har ikke vært min erfaring til nå. Jeg skrev dette basert på egne erfaringer, men burde selvfølgelig gjort research på om erfaringene stemmer med oppfatningene der ute ;)

Har du noen konkrete eksempler eller lenker til saker som omtaler problemet med height: 1%;?

Jeg er godt klar over den vanlige 'feilen' som ikke er feil mht. floatede elementer inne i et ikkefloatet element. I bugen jeg skrev om, ligger problemet i at IE ikke aksepterer clear'en i bunnen.

Etterhvert har clearfix blitt en mer og mer populær erstatning for den ellers utbredte clear: both; teknikken. Det viser seg imidlertid at vi kanskje kan løse problemet på en helt annen måte. overflow: auto ser i mange tilfeller ut til omgå hele problemstillingen med clearfix eller clear:both;. Christian Johansen har skrevet om denne oppdagelsen på bloggen sin.

For meg går også grensen på IE 6. Det må være grenser for hvor utdaterte nettlesere man skal ta hensyn til, er min mening. :)

mattisaas

Fin guide, dette her! Sikkert lurt for mange her - ser at CSS-kategorien er bra fylt opp med bugs på toppen av den samme brukeren.

Mulig du kunne tatt med min-height. Den er jo et kapittel for seg. Ulike hacks ligger ute, men hadde vært fint om du presenterte det her.

For webdesignere er det et slit å alltid ta hensyn til IE-brukere, men det er jo det de fleste bruker. Gleder meg til IE leser sider RIKTIG. IE8 som er rett rundt hjørne (ute i beta) er jo noen sted nærmere.

martin

Hva tenker du på med min-height?
Er det en bug jeg ikke har tatt med?

  • Skriv ut artikkel
  • Abonner med RSS