[CSS] Margin krijgen boven #footer lukt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik maak een eenvoudige site: 2 kolommen, header en footer en het geheel gecentreerd op de pagina. Ik wil dat er een 1px hoog lijntje loopt tussen #header en #faux en een 10px hoge lijn tussen #faux en #footer. Dat eerste lukt, dat tweede niet. Ik zie niet wat ik verkeerd doe; in #faux staat duidelijk een bottom-margin van 10px gedefinieerd. Wie ziet de voud?

HTML:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">

<html>
  <head>
<style>
body {
  background: #C0DEED url('resources/bg-clouds.png') repeat-x;
}

#wrapper {
  margin: 0 auto;
  width: 800px;
}

#faux {
  width: 100%;
  margin: 1px 0 10px 0;
}

#menu {
  float: left;
  width: 200px;
}

#content {
  float: left;
  width: 600px;
}

#footer {
  clear: both;
}

#header, #menu, #content, #footer {
  background: #FFFFFF;
}

</style>
  </head>
  <body>

<div id="wrapper">
  <div id="header">HEADER</div>
  <div id="faux">
    <div id="menu">MENU</div>
    <div id="content">CONTENT</div>
  </div>
  <div id="footer">FOOTER</div>
</div>
  
  </body>
</html>

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Ik houd het op collapsing margins.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Voor zover ik begrijp zou in dat geval de top-margin van footer komen te vervallen, maar die staat al op 0. Bovendien lees ik:
There are other situations where elements do not have their margins collapsed:
  • floated elements
  • absolutely positioned elements
  • inline-block elements
  • elements with overflow set to anything other than visible (They do not collapse margins with their children.)
  • cleared elements (They do not collapse their top margins with their parent block’s bottom margin.)
  • the root element
Volgens mij twee argumenten waarom het probleem hier geen collapsing margins is?
...zei hij heel voorzichtig omdat hij ook wel Cheatahs reputatie kent...

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • gehlan
  • Registratie: Maart 2004
  • Laatst online: 13-04-2022
Probeer eens:

HTML:
1
2
3
4
5
6
7
8
9
    <div id="wrapper"> 
      <div id="header">HEADER</div> 
      <div id="faux"> 
        <div id="menu">MENU</div> 
        <div id="content">CONTENT</div> 
        <div style="clear:both;"></div>
      </div> 
      <div id="footer">FOOTER</div> 
    </div>


Er zijn elegantere manieren maar het komt erop neer dat je de floatende elementen moet clearen om de natuurlijk flow van de pagina te 'herstellen'

Acties:
  • 0 Henk 'm!

Verwijderd

Nee, inderdaad, ik keek eroverheen dat je beide elementen binnen #faux liet floaten. Als iets float wordt de hoogte niet meer meegenomen door de parent, tenzij je overflow: auto; gebruikt op die parent. Dat zal het in dit geval ook wel oplossen.

Je kunt overigens de meest rare bugs tegenkomen als alle elementen binnen een parent element floaten. Ik vind dan ook dat je dat niet zou moeten doen met die #content, volgens mij is dat ook helemaal niet nodig. Je kunt die beter 200px margin-left of padding-left geven (de breedte van die floatende #menu). Dat voorkomt dergelijke bugs over het algemeen wel.

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:38

orf

Overflow: hidden op #faux zal het ook wel doen.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@orf, @gehlan
Bedankt! Beide manieren werken; ik heb gekozen voor overflow:hidden op #faux omdat ik dan geen "loze" div hoef aan te maken. Wel ga ik eens opzoeken hoe dat nu zit met het clearen van floats en de overflow, want dat heb ik echt nooit goed begrepen (werk ook liever op de server dan op de client ;) )

@Cheatah: dat werkt ook, behalve dat de background van #faux dan niet meer wit kleurt (en je dus het verschil in lengte tussen #menu en #content ziet). Bovendien verschijnt er tussen #header en #faux ineens een plm 20px marge, en die blijft staan zelfs nadat ik alle margins op nul heb gezet. Ik ga nog wel uitzoeken waardoor dat komt (mss door de line-height: 20px die ik nu op de body heb gezet. Kan dan dus maar beter de line-height op een p element zetten denk ik :) )

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Je hoeft niet per se een loze div aan te maken, het kan ook middels css.
Ik liep hier een tijd geleden evenzo tegenaan en via google kwam ik uiteindelijk op deze website: http://www.positioniseverything.net/easyclearing.html

Het komt er op neer dat je bijvoorbeeld met de volgende css het ook (cross-browser) oplost zonder een extra div toe te voegen in je code.

Cascading Stylesheet:
1
2
3
4
5
6
7
#faux:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}


Wanneer je veel en vaak float-elementen weergeeft in verschillende divs is het mogelijk handig om hiervoor een class te gebruiken zoals in de website aangegeven.

Cascading Stylesheet:
1
2
3
4
5
6
7
.clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}


edit:
Om te achterhalen waar soms iets aan ligt, is het wellicht handig om bijvoorbeeld firebug + firefox of chrome te gebruiken, je kan dan simpelweg css-rules in en uitschakelen, mocht het dus weggaan na het uitschakelen van de line-height rule dan weet je waar het aan ligt zonder direct terug te gaan naar je css ;)

Anderzijds, kan je (ook m.b.t. die kleuren), als ik je goed snap, mogelijk ook dit toepassen? #content float niet, dus die vult gewoon de ruimte op in #faux, maar kan mogelijk problemen opleveren wanneer het menu hoger is dan de content

HTML:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  
"http://www.w3.org/TR/html4/strict.dtd"> 

<html> 
  <head> 
<style> 
body { 
  background: #C0DEED url('resources/bg-clouds.png') repeat-x; 
} 

#wrapper { 
  margin: 0 auto; 
  width: 800px; 
} 

#faux { 
  width: 100%; 
  margin: 1px 0 10px 0; 
} 

#menu { 
  float: left;
  width: 200px; 
} 

#content { 
  margin-left: 200px;
  width: 600px; 
} 

#header, #footer { 
  background: #FFFFFF; 
} 

#faux, #menu {
  background-color: lightsteelblue;
}

#content {
  background-color: lightgrey;
}

</style> 
  </head> 
  <body> 

<div id="wrapper"> 
  <div id="header">HEADER</div> 
  <div id="faux"> 
    <div id="menu">MENU</div> 
    <div id="content">CONTENT <br /><br /><br />MEER CONTENT</div> 
  </div> 
  <div id="footer">FOOTER</div> 
</div> 
   
  </body> 
</html>


Ik gebruik zelf altijd de css-class, wel zo simpel en altijd te hergebruiken, gewoon toepassen op het block-element waarin floatende elementen zich bevinden.

[ Voor 67% gewijzigd door C0rnelis op 09-02-2011 22:21 ]

Pagina: 1