Toon posts:

Verticale margin wordt toegepast op parent element

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik kom vaak iets tegen als ik met CSS bezig ben, wat volgens mij een bug is, maar alle browsers doen het en ik hoor er nooit iemand anders over. Ben ik gek, zie ik iets heel doms over het hoofd, of is dit inderdaad eigenlijk fout gedrag?

(let op: ik ben dus NIET op zoek naar een oplossing, want dat lukt me zelf ook wel, in het voorbeeld bijv. door padding i.p.v. margin te gebruiken, maar naar een verklaring van het gedrag, of een verklaring dat ik gek en/of zeer dom ben)

Als ik het ene element in het andere zet, dan wordt de top en bottom margin van het binnenste element, toegepast op het buitenste.

Stel ik doe:
HTML:
1
2
3
4
5
6
<body>
   <div>
        <h1>Een kop</h1>
   </div>
   <div id="blauwvlak">&nbsp;</div>
</body>

en:
Cascading Stylesheet:
1
2
3
4
body {margin:0;}
div {background:#F00;}
h1 {margin:30px;}
#blauwvlak {width:100%; height:200px; background:#00F;}

(zie hier)

Dan zou je verwachten dat je bovenaan een rood vlak krijgt, met daarin de koptekst, met 30 pixels ruimte aan alle kanten. Dan meteen daaronder het blauwe vlak.

In plaats daarvan, sluit de tekst strak aan op de boven- en onderrand van de rode DIV en komt er 30 pixels witruimte boven en onder de DIV. Anders gezegd: de margin van de H1 valt buiten de DIV waar hij in zit. In de horizontale richting werkt het wel naar verwachting (de margin valt binnen de DIV en is dus rood en niet wit).

Heeft iemand enig idee waarom dit zo werkt? Dit simpele voorbeeld geeft in alle browsers hetzelfde resultaat, maar in ingewikkeldere designs krijg je soms verschillend gedrag in verschillende browsers door hetzelfde probleem.

Acties:
  • 0 Henk 'm!

Verwijderd

Het werkt zo omdat dit gedrag wordt voorgeschreven door de CSS 2 specificatie :)

Acties:
  • 0 Henk 'm!

  • kalizec
  • Registratie: September 2000
  • Laatst online: 17-07 01:45
Idd, voor zover ik weet is dit voorgeschreven gedrag.

Hier onder de link naar een tutorial die het heel erg uitgebreid uitlegd.

http://www.seifi.org/css/...psing-margins-in-css.html

Core i5-3570K/ASRock Z75 Pro3/Gigabyte Radeon HD7850/Corsair XMS3 2x4GB/OCZ Vertex2 64GB/3x640GB WD Black/24" B2403WS Iiyama x2/Nec 7200S


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Margin geld aan de buitenkant van je element. Volgens mij is het gedrag dat jij wil padding.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

Verwijderd

mocean schreef op vrijdag 16 januari 2009 @ 19:24:
Margin geld aan de buitenkant van je element. Volgens mij is het gedrag dat jij wil padding.
Het punt is dat de margin die hij opgeeft niet aan de buitenkant van dat element komt, maar aan de buitenkant van het hoogste ancestor element met minder margin en zonder padding. De margin komt op een plek waar je dat niet zou verwachten tenzij je de specificatie kent. Het is dus een logische vraag. Hoe het probleem is op te lossen is een ander verhaal. Dat geeft de topicstarter zelf ook al aan ;)

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Verwijderd schreef op vrijdag 16 januari 2009 @ 19:31:
[...]

Het punt is dat de margin die hij opgeeft niet aan de buitenkant van dat element komt, maar aan de buitenkant van het hoogste ancestor element met minder margin en zonder padding. De margin komt op een plek waar je dat niet zou verwachten tenzij je de specificatie kent. Het is dus een logische vraag. Hoe het probleem is op te lossen is een ander verhaal. Dat geeft de topicstarter zelf ook al aan ;)
Nu zie ik het ja! Raar ik heb daar nog nooit last van gehad bij HTML-en van designs. Wel apart dat het voorgeschreven gedrag is!

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, bedankt voor de antwoorden. De uitleg van W3C was zoals gebruikelijk lekker cryptisch, maar door de tutorial van seifi.org werd alles duidelijk. Ben ik eindelijk van dit raadsel verlost. Ik heb dit al vaker op verschillende fora gepost en kreeg altijd antwoorden als "dan moet je padding gebruiken", duidelijk de vraag dus niet begrepen (no offense mocean :) ). Bij tweakers krijg je tenminste een echt antwoord.

Wat mij betreft weer een voorbeeld van de absoluut onnodige ingewikkeldheid van het W3C box-model. Volgens mij is de enige nuttige vorm van margin collapsing bij opeenvolgende sibling elementen en zelfs daar is het dubieus.
Volgens mij waren er een paar mensen flink high toen ze dit soort dingen bedachten. Hoe kom je anders op zaken als display:runin en display:compact?

Maar ja, ik was ook van mening dat het Microsoft box model (width is inclusief padding) veel logischer EN praktischer is dan het W3C model (width is exclusief padding) maar dat is een heel andere discussie en een lang gepasseerd station.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 20:01

crisp

Devver

Pixelated

Een meestal wel bruikbare 'oplossing' voor dit 'probleem' staat overigens ook in de specificatie:
Vertical margins of elements with 'overflow' other than 'visible' do not collapse with their in-flow children.
In het voorbeeld van de topicstarter zou je dus de DIV om de H1 een overflow:auto of hidden kunnen geven om te voorkomen dat de margins van de H1 collapsen met de DIV.

Intentionally left blank

Pagina: 1