[css] Code goed weergegeven in Opera & Firefox. Niet in IE

Pagina: 1
Acties:

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
We hebben weer eens een layout probleem omdat sommige browsers alles anders interpreteren. Het probleem? Ik wil een site met vaste breedte van 800px die horizontaal gecentreerd staat. Geen probleem... De site heeft bovenaan en onderaan respectievelijk een header en footer over de volle 800 pixels. Geen probleem. Daartussen is links een menu van 200px breed en de eigenlijke content van de overige 600px. Geen probleem...

De code die ik gebruik:

CSS:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
div {
 margin       : 0px;
 padding      : 0px;
}

div.header {
 margin-left  : auto;
 margin-right : auto;
 width        : 800px;
 height       : 100px;
}

div.spacer {
 clear        : both;
}

div.main {
 margin-left  : auto;
 margin-right : auto;
 width        : 800px;
}

div.menu {
 float        : left;
 width        : 200px;
}

div.content {
 float        : left;
 width        : 600px;
}

div.footer {
 margin-left  : auto;
 margin-right : auto;
 width        : 800px;
 height       : 20px;
}

HTML:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >

<head>
    <title>test</title>
    <link href="styles.css" rel="stylesheet" type="text/css" />
</head>

<body>
    <div class="header">Header</div>
    <div class="main">
        <div class="spacer"></div>
        <div class="menu">Menu</div>
        <div class="content">Inhoud pagina (content)</div>
        <div class="spacer"></div>
    </div>
    <div class="footer">Footer</div>
</body>
</html>
Dat is natuurlijk zeer simplistisch voorgestelde code, maar dat geeft iets in de aard van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
          +--------------------------------------+          
          |              div.header              |
          +--------+-----------------------------+
          |        |                             |
          |        |                             |
          |  div.  |                             |
 <------> |  menu  |         div.content         | <------>
          |        |                             |
          |        |                             |
          |        |                             |
          +--------+-----------------------------+
          |              div.footer              |
          +--------------------------------------+
Dat werkt allemaal heel mooi. Zowel in Opera als in Mozilla/Firefox als in Internet Explorer.

Maar... In de content container waar de eigenlijke site-inhoud komt, wordt vaak ook code geplaatst. Dit staat natuurlijk tussen de <pre> tags. Wat is nu het probleem? Een lijn tussen die <pre> tags wordt niet afgebroken als ze te breed is voor de content container. Hetzelfde natuurlijk als er een lang woord zonder spaties of afbreekstreepjes in de gewone tekst voorkomt (zoals een URL bv). In dit geval zullen Opera en Mozilla/Firefox die te lange regel gewoon buiten de container verder laten lopen zonder de layout echt te verneuken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
          +--------------------------------------+          
          |              div.header              |
          +--------+-----------------------------+
          |        | Dit is een veel te lange regel
          |        |                             |
          |  div.  |                             |
 <------> |  menu  |         div.content         | <------>
          |        |                             |
          |        |                             |
          |        |                             |
          +--------+-----------------------------+
          |              div.footer              |
          +--------------------------------------+
Daar kan ik mee leven... Maar Internet Explorer moet natuurlijk weer mottig kunnen doen. In plaats van ook gewoon voorbij de rand van de container te renderen, verbreedt IE de container zodat de inhoud past. Maar dat verneukt natuurlijk wel heel de layout. De main div is namelijk 800 pixels breed, daarin een menu van 200 pixels en een content die breder is dan 600 pixels. 200 + meer dan 600 is natuurlijk niet kleiner of gelijk aan 800. Dus een probleem wat zich uit als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
          +--------------------------------------+          
          |              div.header              |
          +--------+-----------------------------+
          |        |                             |
          |        |                             |
          |  div.  |                             |
 <------> |  menu  |         (div.main)          | <------>
          |        |                             |
          |        |                             |
          |        |                             |
          +--------+-----------------------+     |
          | Dit is een veel te lange regel |     |
          |                                |     |
          |                                |     |
          |           div.content          |     |
          |        (breder dan 600px)      |     |
          |                                |     |
          +--------------------------------+-----+
          |              div.footer              |
          +--------------------------------------+
Waardeloos dus. Als het aan mij lag dan zou ik natuurlijk eens gemeen lachen en zeggen dat al die IE-gebruikers pech hebben, maar er is nog steeds iets van een 80-90% die IE gebruikt zodat de site er voor hen maar best ook goed uit ziet :)

Dus nu de vraag, hoe los ik dit probleem op? Ik heb reeds enkele zaken bedacht, maar niets werkt zoals het hoort.

Zo dacht ik bijvoorbeeld om de main div als attribuut "position: relative;" mee te geven en dan de menu en content div via "position: absolute;", "top" en "left" correct te positioneren. Dat werkt wel gedeeltelijk... De content div verbreedt natuurlijk nog wel in IE, maar blijft nu wel op de juiste plaats. Maar door de "position: absolute;" schijnen de menu en content div schijnbaar geen hoogte meer voor de main div. Met andere woorden, de main div heeft hoogte 0 en de footer div plakt onder de header. Totaal verkeerd natuurlijk... De footer ook absoluut positioneren? Maar je kent de hoogte niet van het menu, noch van de content. Niet goed dus...

Een ander idee was het overflow attribuut gebruiken. Schitterend ding, ware het niet dat Internet Explorer dat op een zeer vreemde en onbruikbare manier interpreteert. Alleen "overflow: hidden;" werkte goed, maar dan is de content die te breed is gewoon onzichtbaar en dat is ook niet echt de bedoeling. Ook Mozilla doet dan trouwens raar door rechts in de content div plaats te voorzien voor een verticale scrollbalk (die niet zichtbaar is maar wel de layout verneukt).

Iemand andere ideeën die hopelijk wel werken?

Even ter verduidelijking; tables zijn uitgesloten en de code dient W3C CSS 2.0 en XHTML 1.1 Strict compliant te zijn.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 21-05 11:05
Omdat het CSS 2 en XHTML 1.1 compliant moet zijn, kun je nog wel tabellen gebruiken ;) maar goed.
Wat je denk ik iig beter kunt doen, is een layer om alles heen zetten,
dus
code:
1
2
3
<div id="container">
  <!-- hier de rest van je html -->
</div>

En dan die wat CSS meegeven:
code:
1
2
3
4
#container {
  width: 800px;
  margin: 0 auto;
}


Ik weet niet of het 't eigenlijke probleem verhelpt, maar wellicht komt het wat meer in de richting.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
KoenieMan schreef op 14 juli 2004 @ 19:04:
Omdat het CSS 2 en XHTML 1.1 compliant moet zijn, kun je nog wel tabellen gebruiken ;) maar goed.
Wat je denk ik iig beter kunt doen, is een layer om alles heen zetten,
[knip]
Ik weet niet of het 't eigenlijke probleem verhelpt, maar wellicht komt het wat meer in de richting.
Jaja, ik begrijp wel dat tables niets met CSS 2.0 en XHTML 1.1 compliancy te maken hebben, maar tables dienen voor tabulaire data en niet voor de layout :)

Anyway, je idee van een parent container heb ik zelf ook al gebruikt maar verhelpt het probleem niet. De 2 floating div's (menu en content) mogen tesamen niet breder zijn dan eender welke parent div of het probleem uit zich. Aangezien je parent container ook maar 800 pixels breed is blijft het probleem onveranderd wanneer de inhoud van de content div te breed is.

De oplossing zit 'em dan ook waarschijnlijk in het op een andere manier positioneren van deze 2 elementen. Maar hoe?

Ideaal zou zijn dat er gewoon geen parent container rond de menu en content div zit. Dat lost het hele probleem in één klap op, maar dan kan ik beiden onmogelijk meer horizontaal centreren in het midden van de pagina...

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 21-05 11:05
mahi schreef op 14 juli 2004 @ 19:12:
[...]
Jaja, ik begrijp wel dat tables niets met CSS 2.0 en XHTML 1.1 compliancy te maken hebben, maar tables dienen voor tabulaire data en niet voor de layout :)
I know ;)

Maar, heb je niet ergens een pagina online staan? dat werkt (bij mij) altijd wat handiger (die handige extensions van FF helpen me daarbij), maar je kan ook eens spelen met overflow property.

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
KoenieMan schreef op 14 juli 2004 @ 19:19:
Maar, heb je niet ergens een pagina online staan? dat werkt (bij mij) altijd wat handiger (die handige extensions van FF helpen me daarbij), maar je kan ook eens spelen met overflow property.
Met overflow heb ik al geëxperimenteerd, maar dat gaf zoals ik in m'n openingspost aangaf niet het gewenste resultaat.

De site staat momenteel op de interne webserver hier. Die kan ik niet zomaar publiek stellen, maar ik zal tegen straks wel effe een simpel voorbeeldje online zwieren.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Float is ook bedoeld om aan de kant te gaan als het niet past ;) 't is dan idd de fout van IE dat die elementen breder maakt dan jij opgeeft. Erg irritant. Float is wel handig, maar als het anders kan zou ik het dan ook altijd anders doen en float alleen gebruiken voor blokken binnen content waar de content netjes omheen wrapt (zoals images in je content).

Wat je ipv floats kan doen is je algehele container een zodanige background image geven dat die het vlak visueel in 2 kolommen opdeelt. Je content positioneer je gewoon zonder float in de flow met een margin-left van 200px, en je menu zet je er met position:absolute naast (tov de container, die je daarvoor relative moet maken).

Dat heeft 1 addertje, en dat is dat het menu de container niet uit gaat rekken in hoogte, en dat ziet er raar uit wanneer het menu dan langer is als de content.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

width, max-width, en min-width zijn je vrienden. Ik heb hier nl. ook mee zitten klooien en dit werkte best aardig.
offtopic:
Is het niet handiger je menu aan de rechterkant te zetten. Zie http://usability.gov/guidelines/navigation.html#four voor een uitleg.

Nu met Land Rover Series 3 en Defender 90


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Ik heb even een voorbeeldje online gezet. Voor de duidelijkheid heb ik de div's allen een verschillende achtergrondkleur gegeven.

De CSS stylesheet
Normaal zonder te brede inhoud
Te brede inhoud

Zoals je ziet is de weergave van deze laatste correct in Opera en Mozilla, maar IE maakt de content div breder en daardoor gaat de plaatsing de mist in...
Clay schreef op 14 juli 2004 @ 19:39:
Wat je ipv floats kan doen is je algehele container een zodanige background image geven dat die het vlak visueel in 2 kolommen opdeelt. Je content positioneer je gewoon zonder float in de flow met een margin-left van 200px, en je menu zet je er met position:absolute naast (tov de container, die je daarvoor relative moet maken).

Dat heeft 1 addertje, en dat is dat het menu de container niet uit gaat rekken in hoogte, en dat ziet er raar uit wanneer het menu dan langer is als de content.
Ja, dat had ik ook al geprobeerd. Maar het is een heel stom zicht wanneer het menu een heel eind onder de pagina footer uitsteekt. Het menu staat vol met trackers dus is vaak (maar zeker niet altijd) langer dan de content. Dit is dus niet echt een oplossing.
MTWZZ schreef op 14 juli 2004 @ 19:47:
width, max-width, en min-width zijn je vrienden. Ik heb hier nl. ook mee zitten klooien en dit werkte best aardig.
Ondersteunt IE dan min/max-width? Het schijnt hier toch geen enkel effect te hebben.
Is het niet handiger je menu aan de rechterkant te zetten. Zie http://usability.gov/guidelines/navigation.html#four voor een uitleg.
Een menu aan de rechterkant vind ik nu eerlijk gezegd niet echt duidelijk. Dat je dan misschien wat minder afstand moet afleggen met de muis is misschien wel zo, maar het meerendeel van de sites heeft het menu links en de mensen verwachten dat ook daar. De hele layout is trouwens al getekend...

Is er geen manier om IE te forceren div's niet te verbreden? Of een manier om bij absolute positionering toch nog rekening te kunnen houden met de hoogtes van de elementen?

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

ipv het menu absolute te doen zou je die wel kunnen floaten naast je content, en die content verder in de flow laten met die genoemde margin. Als je dan iets onderaan doet met een clear zou je parent zonodig mee moeten rekken met het menu (en anders gewoon met de content).

[ Voor 9% gewijzigd door Clay op 14-07-2004 20:09 ]

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Clay schreef op 14 juli 2004 @ 20:08:
ipv het menu absolute te doen zou je die wel kunnen floaten naast je content, en die content verder in de flow laten met die genoemde margin. Als je dan iets onderaan doet met een clear zou je parent zonodig mee moeten rekken met het menu (en anders gewoon met de content).
Dat schijnt dus ook weer niet te werken. Nou ja, wel in Opera en Mozilla, maar niet in die andere prutsbrowser...

Wanneer ik de menu laat floaten in de content div (die we niet meer floating maken), dan gaat de content zoals logisch waar het menu stopt naar links inspringen (zoals de tekst rond een afbeelding onder de afbeelding weer naar z'n normale linkse marge gaat). Zet ik een linkse margin of padding van 200px op de content div dan schijft die floating menu ook 200 pixels naar rechts. Float schijnt dus te werken op de binnenkant van een cel, niet de margin of padding. Voorbeeld: Menu floating in content

Als ik het menu zoals nu in de main div laat (floating) en de content div niet langer floating maak dan blijf ik hetzelfde probleem als nu houden (in Internet Explorer). Voorbeeld: Menu floating in main, content niet floating

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03-2025
Misschien een rare vraag, maar waarom maak je je druk over compatibaliteit met IE als IE je document toch niet kan bekijken, XHTML 1.1 vereist namelijk dat het document met een xml content-type wordt verstuurd.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Daar zorgt PHP voor :)

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • FireWood
  • Registratie: Augustus 2003
  • Laatst online: 24-05 00:00
mahi schreef op 14 juli 2004 @ 17:26:
We hebben weer eens een layout probleem omdat sommige browsers alles anders interpreteren. Het probleem? Ik wil een site met vaste breedte van 800px die horizontaal gecentreerd staat. Geen probleem... De site heeft bovenaan en onderaan respectievelijk een header en footer over de volle 800 pixels. Geen probleem. Daartussen is links een menu van 200px breed en de eigenlijke content van de overige 600px. Geen probleem...


.... (een boel tekst)

Iemand andere ideeën die hopelijk wel werken?

Even ter verduidelijking; tables zijn uitgesloten en de code dient W3C CSS 2.0 en XHTML 1.1 Strict compliant te zijn.
Als je het publiekelijk wilt houden lijkt mij 800px erg breed. Minimale resolutie is dan weliswaar 1024*786, maar 800x 600 is al problematisch en grote schermen(1280x1024 en groter) hebben ergens zwevend een klein beetje gevulde tekst. Niet echt handig. Met procenten werken werkt beter voor het grotere publiek.


Als je de code strict houd met CSS 2.0 en XHTML 1.1 krijg je het nooit in IE aan de praat. Je moet zowiezo een stapje lager gaan naar CSSS 1.0. Daarboven op welke browser wil je supporten? IE vanaf 5.5 lijkt mij logisch. Maar in 5.5 CSS gebruiken is ook al niet zo best...

Tip: Hou je niet aan de strenge regels, anders kom je er nooit. Zorg ervoor dat het overal in werkt en dat je het IE gebeuren er snel uit kan slopen.

Noobs don't use "F1", Pro's do, but they can't find the information they needed


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
h.edink schreef op 14 juli 2004 @ 21:48:
Als je het publiekelijk wilt houden lijkt mij 800px erg breed. Minimale resolutie is dan weliswaar 1024*786, maar 800x 600 is al problematisch en grote schermen(1280x1024 en groter) hebben ergens zwevend een klein beetje gevulde tekst. Niet echt handig. Met procenten werken werkt beter voor het grotere publiek.
De site is eigenlijk slechts 778 pixels breed, maar ik nam hier 800 omdat dat makkelijker rekent. Een 778 pixels brede pagina kan op 800x600 in alle populaire browsers probleemloos zonder horizontale scrollbar weergegeven worden als de browser full screen is en er geen panel links is. Ik kan me niet voorstellen dat mensen die op zo'n lage resolutie surfen niet full screen surfen zonder panels of andere ruimtevretende zaken. Hoe dan ook, 800x600 is sowieso al een minderheid aan het worden onder de Internetgebruikers als ik de statistieken bekijk.

Het is waar dat wanneer je 1600x1200 gebruikt de site maar de helft van de breedte van je scherm in beslag neemt. Maar ik hoor daar bij GoT en tweakers.net toch ook niemand over klagen? Overigens, de vorige site gebruikte origineel een liquid design dat het volledige scherm benutte, maar de gebruikers hebben zelf gevraagd of de breedte niet vast gezet kon worden rond de 800 pixels omdat dat veel prettiger leest. Daarnaast gebruiken mensen die zulke hoge resoluties gebruiken vaak twee browser vensters naast elkaar, meer panels links en rechts, of gewoon een smal browservenster zodat ze nog kunnen zien wat er op de achtergrond gebeurt zodat de whitespace links en rechts van de site wel meevalt.
Als je de code strict houd met CSS 2.0 en XHTML 1.1 krijg je het nooit in IE aan de praat. Je moet zowiezo een stapje lager gaan naar CSSS 1.0. Daarboven op welke browser wil je supporten? IE vanaf 5.5 lijkt mij logisch. Maar in 5.5 CSS gebruiken is ook al niet zo best...
In Opera 6+, Mozilla/Firefox en Internet Explorer 6 is de site op enkele negeerbare punten na pixelidentiek. Dus wat dat te strenge eisen stellen betreft denk ik dat het nog wel meevalt.

Dus 70% van de bezoekers (volgens de browser gebruiksstatistieken) krijgen een site voorgeschoteld die er perfect uit ziet zoals gewenst. De 13% IE 5.5 gebruikers krijgen een site voorgeschoteld waar wat renderfouten in zitten, maar die verder perfect bruikbaar blijft. IE 5.0 weet ik eerlijk gezegd niet, maar als je nu nog een browser gebruikt die meer dan 5 jaar oud is en vol bugs en veiligheidsgaten zit, dan moet je ook niet meer verwachten dat webdevelopers daar veel rekening mee gaan houden. Backward compatibility ok, maar er is een grens... Het kost immers niets om te updaten naar een recente versie of een alternatieve browser als Mozilla/Firefox.

[ Voor 3% gewijzigd door mahi op 14-07-2004 22:49 . Reden: typo ]

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Maar... In de content container waar de eigenlijke site-inhoud komt, wordt vaak ook code geplaatst. Dit staat natuurlijk tussen de <pre> tags. Wat is nu het probleem? Een lijn tussen die <pre> tags wordt niet afgebroken als ze te breed is voor de content container.
Wat je natuurlijk ook kan doen is die code dingen gewoon scrollable maken. Zie je best vaak ook. Iets in de richting van:

Cascading Stylesheet:
1
2
3
4
5
6
pre {
    display:block;
    width:590px;
    overflow:auto;
    overflow-y:hidden;
}


Doet al wonderen. Check oa ook hier:
http://www.quirksmode.org/about/makingof.html#link16

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Het ziet er naar uit dat ik zoiets ga moeten gebruiken... Op die quirksmode staan wel een aantal goeie tips waar ik zeker rekening mee ga houden.

Bedankt!

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.

Pagina: 1