élements de type bloc ne se placent pas l'un sous l'autre

zarathoustra

Membre actif
2 Avril 2007
851
7
Borobodur
Bonjour à tous,

J'essaie d'apprendre xthml et CSS.

Pour le moment, j'essaie
- de mettre un bandeau avec un logo en haut a gauche
- Et ensuite de mettre un conteneur qui se placera en dessous (ou je mettrais le contenu, les menus, etc).

or j'ai cru comprendre que les éléments de rendu "bloc" se placent toujours l'un en dessous de l'autre par défaut "
=>je pensais que c'était valable pour les div.
Mais en fait, non. Mon conteneur va a droite du header (au lieu d'aller en dessous).

Savez-vous ou j'ai fait une erreur?
(en post scriptum, j'ai mis une image du rendu)

Merci pour votre aide !

voici le code html :
Bloc de code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>vive la galette des rois</title>
    <link href="style.css" rel="stylesheet" type="text/css" media="screen"
</head>
<body>
	<div id="header">
		<img width="170" height="232" alt="une galette des rois" src="theme/logo1.jpg">
		<h1>vive la galette des rois</h1>
		<p>Concevoir des galettes des rois avec HTML et CSS</p>
	</div>
	<div id="conteneur">
	voici comment on fait une galette des rois avec CSS
	</div>
</body>
</html>

Et le CSS:
Bloc de code:
@charset "UTF-8";
/* CSS Document */
body{
background-color: #eaeaea;
margin:0;
padding:0;
font-family: "Lucida Handwriting", "Monotype Corsiva", sans-serif;
font-size:80%;
}
#header{
margin:5px;
}
#header img{
float:left;
margin:5px 0 0 5px
}
#header h1{
text-indent: -5000px;
margin:0;
line-height:0;
}
#header p{
margin: 45px 0 0 200px;
font-weight:bold;
color:black;
font-size:1.1em;
}
#conteneur{
background-color:#CCFF66;
width:500px;
margin:0 auto;
}
#menu_top{
}

ps :
Voir la pièce jointe 107342
 
J'ai trouvé.

Si cela peut aider qqn,

il faut mettre une classe et l'appeler dans le html apres le bloc ou l'on veut que ca aille en dessous
Bloc de code:
.clear{
     clear: both;
}
 
Merci pour ton message, j'ai eu le même soucis et j'ai ainsi pu arranger les choses.

Mais ce que je ne comprends pas, c'est que sur un autre site que j'ai réalisé, j'ai fait la même opération (en fait deux colonnes, deux conteneurs en "flottant", l'un à droite et 'autre à gauche) et je n'ai pas eu ce soucis.

Quelqu'un pour éclairer ma lanterne ? Pourquoi dans un cas j'ai dû faire un "clear" et pas dans l'autre cas ?

Merci !
 
Je ne comprend rien à ta première question Zarathoustra, le code que tu fournis donne un résultat correct (j'ai mis une couleur de fond à header) :

float_etape_1.jpg


Par contre tu mets une image en float dans le bandeau, elle est très haute et donc va "sortir" du bandeau qui n'a pas de hauteur indiquée :

float_etape_2.jpg


Si tu ajoutes
overflow: hidden;

&#8230;dans les styles du header il prendra toute la hauteur de son contenu flottant :

float_etape_3.jpg


Mais bon, je n'ai toujours pas compris où est le bloc qui ne passe pas "dessous" ? :p :rateau: :cool:
 
CA dépend peut-être du navigateur ?
Je ne sais pas,

Mais par contre, merci momo pour ton commentaire, je ne comprenais pas (plus) comment il était possible qu'une image "sorte" de son conteneur ; en fait ça arrive dès que l'on ne spécifie pas de hauteur à ce dernier et que l'image est plus "haute".

Une chose que je ne comprends pas (une autre donc !) : avec du texte entre <p>, le conteneur s'ajuste automatiquement à la hauteur du texte, non ? j'ai pas de quoi essayer immédiatement, mais il me semble que ça a toujours été le cas sur mes pages. Alors, pourquoi avec <p> et pas avec <img> ?
 
Mais par contre, merci momo pour ton commentaire, je ne comprenais pas (plus) comment il était possible qu'une image "sorte" de son conteneur ; en fait ça arrive dès que l'on ne spécifie pas de hauteur à ce dernier et que l'image est plus "haute".

Une chose que je ne comprends pas (une autre donc !) : avec du texte entre <p>, le conteneur s'ajuste automatiquement à la hauteur du texte, non ? j'ai pas de quoi essayer immédiatement, mais il me semble que ça a toujours été le cas sur mes pages. Alors, pourquoi avec <p> et pas avec <img> ?
Je crois que tu nages en pleine incompréhension… ici l'image du header est "flottante" (float left), cet attribut fait "sortir" l'image du flux HTML, elle ne "pousse" plus les éléments qui sont en dessous d'elle puisque sa valeur de hauteur n'est pas prise en compte.

Si j'enlève l'attribut de float voilà ce que j'obtient dans l'exemple, comme tu peux voir tout rentre dans l'ordre :

float_etape_4.jpg


Quelques infos sur le float…
Un petit jeu de float
 
Je ne comprend rien à ta première question Zarathoustra, le code que tu fournis donne un résultat correct (j'ai mis une couleur de fond à header) :

float_etape_1.jpg


Par contre tu mets une image en float dans le bandeau, elle est très haute et donc va "sortir" du bandeau qui n'a pas de hauteur indiquée :

float_etape_2.jpg


Si tu ajoutes


…dans les styles du header il prendra toute la hauteur de son contenu flottant :

float_etape_3.jpg


Mais bon, je n'ai toujours pas compris où est le bloc qui ne passe pas "dessous" ? :p :rateau: :cool:
Bonjour Momo,

Oui, overflow sur le header, ca marche. Merci. ;)
Il prend toute la hauteur de son flottant, c'est bien expliqué comme ca....:cool:

C'est meme mieux que Clear, car c'est inutile de rajouter un élément vide .
=> qu'en penses-tu?

Sinon, moi, entre temps, j'étais allé creuser un peu dans toutes les méthodes....lol....et ayant un peu progressé depuis, je crois que c'est

Bloc de code:
#header{
background-color:#33FF00;
overflow: hidden;
}
qui a permis que "ca marche" entre guillemet.

Car j'ai l'impression que,

Bloc de code:
#header img{
float:left;
margin:5px 0 0 5px;
clear:both;
}
et

Bloc de code:
#wrap{
overflow:hidden;
}
c'est du grand n'importe quoi après coup. Qu'en penses tu ?

Cet article présente bien les avantages et les inconvénients de chaque méthode.

Et dans cet article est donné un package intéressant....les nettoyeurs !

Pour répondre à tes questions :

Je ne comprend rien à ta première question Zarathoustra, le code que tu fournis donne un résultat correct (j'ai mis une couleur de fond à header) :
=>oui pour l'étape 1.
Mais on voit pour l'étape 2, que le 'bloc' jaune ne descend pas en dessous de la hauteur "déterminée par le logo".
Je voulais qu'il "descende en dessous".
Et c'est ce que tu as réussi dans l'étape 3. Merci, :up:

Donc 2 méthodes en réponse à ma question,

1. une cellule a fin du bloc avec la propriété clear pour "tout" redescendre...
nuance : le pseudo élément, :after....

2. ou bien un overflow:hidden qui va "obliger le bloc jaune"a descendre en faisant en sorte que le header prenne toute la hauteur de son contenu flottant.

Mais bon, je n'ai toujours pas compris où est le bloc qui ne passe pas "dessous" ? :p :rateau: :cool:
C'était le bloc jaune dans tes schémas. Est-ce que j'ai été plus clair?

Z.

ps : le code complet dont je fais mention.
html
Bloc de code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>La vraie galette de chez Galette</title>
    <link href="test.css" rel="stylesheet" type="text/css" media="screen"
</head>
<body>
	<div id="conteneur">
		<div id="header">
			<img width="170" height="232" alt="LA bonne galette des rois" src="theme/logo1.jpg">
			<h1>La bonne galette</h1>
			<p>Ici sera placée l'animation Shockwave</p>
		</div>
		<div id="wrap">
			<div id="sidebar">
				<div id="menu_left">
					<ul>
						<li id="coin"><a href="index.html">Accueil</a></li>
						<li id="coin"><a href="votre_galette">la galette</a></li>
						<li id="coin"><a href="bons_cadeaux">Bons cadeaux</a></li>
						<li id="coin"><a href="promotions.html">Promotions</a></li>
						<li id="coin"><a href="tarifs.html">Tarifs</a></li>
						<li id="coin"><a href="contact.html"> Contact</a></li>
					</ul>
				</div>
			</div>	
			<div id="contenu">
				<div id="menuhaut">
				<!-- Menu horizontal-->
					<ul id="menuhaut" class="coin">
					<li class="coin"><a href="index.html">Accueil</a></li>
					<li><a href="votre_galette">les soins</a></li>
					<li><a href="promotions.html">Promotions</a></li>
					<li><a href="tarifs.html">Tarifs</a></li>
					<li><a href="contact.html"> Contact</a></li>
					</ul>
				</div>
			</div>
		 </div>		
		<div id="footer">
		</div>
	</div>
</body>
</html>
CSS
Bloc de code:
@charset "UTF-8";
/* CSS Document */
body{
background-color: #eaeaea;
margin:0;
padding:0;
font-family: "Lucida Handwriting", "Monotype Corsiva", serif;
font-size:80%;
}
#conteneur{
background-color:#33FF00;
width:760px;
margin:0 auto;
}
#header{
background-color:#33FF00;
overflow: hidden;
}
#header img{
float:left;
margin:5px 0 0 5px;
clear:both;
}
#header h1{
text-indent: -5000px;
margin:0;
line-height:0;
}
#header p{
margin: 45px 0 0 200px;
font-weight:bold;
color:black;
font-size:1.1em;
}
#wrap{
overflow:hidden;
}
#sidebar{
margin-left:5px;
background-color:#9900FF;
position:absolute;
width:170px;
}
#contenu{
margin-left:170px;
background-color:#CC99CC;
}
#menu_left {
float: left;
width: 15em;
padding: 3em 0 8em 0;
margin: 0px;
background color: red;
}
#menu_left ul {
list-style-type: none;
padding: 0;
margin: 0 1em;
}
#menu_left li a {
display: block;
text-decoration: none;
height: 3em;
line-height: 1em; /* pour centrer verticalement le texte
dans le bouton de lien */
color: white;
font-weight: bold;
font-size: 120%;
text-indent: 1em;
}
#menu_left li a:hover {
background: #cccc33;
color:#FF33FF;
}
#menuhaut {
margin: 0 0 0 9px;
padding: 0.5em 0.1em 0.1em 0,5em;
color: white;
text-align: center;
}
#menuhaut ul{
 padding:0;
 margin:0;
 list-style-type:none;
 }
#menuhaut li {
 border-left:1px solid black;
 border-radius: 5px; 
 float:left; /*pour IE*/}
#menuhaut li a {
display:block;
 float:left;   
 width:100px;
 background-color:#6495ED;
 color:black;
 text-decoration:none;
 text-align:center;
 padding:5px;
 border:2px solid;
 /*pour avoir un effet "outset" avec IE :*/
 border-color:#DCDCDC #696969 #696969 #DCDCDC;
}
#menuhaut a:hover {
 background-color:#D3D3D3;
 border-color:#696969 #DCDCDC #DCDCDC #696969;
 }
 
La propriété "overflow:hidden" est la plus utilisée, le défaut qu'elle peut généré est infime, ça empêche de sortir un élément du contenant… très rare comme comportement.

Donc on applique cette propriété au contenant et ça roule.

Va aussi lire cette discussion sur la DTD et la déclaration XML que tu utilises en début de code…

EDIT : je viens de jeter un oeil à ta proposition de code… on utilise la notion "id" pour un seul élément dans la page, sinon on prend une classe :
<ul>
<li id="coin"><a href="index.html">Accueil</a></li>
<li id="coin"><a href="votre_galette">la galette</a></li>
<li id="coin"><a href="bons_cadeaux">Bons cadeaux</a></li>
<li id="coin"><a href="promotions.html">Promotions</a></li>
<li id="coin"><a href="tarifs.html">Tarifs</a></li>
<li id="coin"><a href="contact.html"> Contact</a></li>
</ul>
Là il y a une erreur répétée… :p :D

Un autre point pour alléger le code tu créés une div sidebar puis tu ajoutes une div menu avec une id, pourquoi pas, mais le plus simple c'est de faire l'ul avec l'id menu et virer la div menu qui ne sert (à priori) à rien.
J'ai fait comme toi à mes débuts, chaque contenant en id et chaque élément en div, alors que travailler avec des classes assouplie ton travail par la suite (si tu as besoin d'un autre menu plus bas dans ta page par exemple) et simplifier la structure éclaircie le code pour sa lecture.
<div id="sidebar">
<ul class="menu_left">
<li><a href="index.html">Accueil</a></li>
<li><a href="votre_galette">la galette</a></li>
<li><a href="bons_cadeaux">Bons cadeaux</a></li>
<li><a href="promotions.html">Promotions</a></li>
<li><a href="tarifs.html">Tarifs</a></li>
<li><a href="contact.html"> Contact</a></li>
</ul>
</div>
Dans mon exemple j'ai viré l'id "coin", je ne sais pas ce que c'est mais de toute façon le style de la "li" sera dans la classe .menu_left li.

Itou pour ton menu horizontal… sauf besoin spécifique d'un sur-conteneur.
 
Dernière édition:
Salut Momo,

Merci pour ta réponse (encore) bien détaillée.

Overflow :
La propriété "overflow:hidden" est la plus utilisée, le défaut qu'elle peut généré est infime, ça empêche de sortir un élément du contenant… très rare comme comportement.

Donc on applique cette propriété au contenant et ça roule.
En cherchant, j’ai remarqué qu’ils « mélangeaient ca »avec du clear ou bien enlevaient carrément overflow pour ne laisser que du clear :
Ici, elle utilise que du clear….
http://romy.tetue.net/espaceurs-de-blocs?lang=fr
Bloc de code:
.clear { clear: both; }
br.clear { margin: 0; padding: 0; border: 0; height: 0; line-height: 1px; font-size: 1px; }
hr.clear { visibility: hidden; }

Et puis on peut trouver du mix ou l’on mélange clear et overflow.
Comme ici :

1.

Que penser de son clearfix ?
Bloc de code:
.clearfix:before, 
.clearfix:after {
content: ".";
display: block;
height: 0;
overflow: hidden;
} 
.clearfix:after {
clear: both;
} 
.clearfix {zoom: 1;} /* IE < 8 */
J’ai compris sa démontration avec overflow et position : relative.
Mais que penser de sa solution idéale ?
Bloc de code:
display: inline-block; width: <any explicit value>;
=>que conseilles tu dans la pratique ?
Va aussi lire cette discussion sur la DTD et la déclaration XML que tu utilises en début de code
=> merci pour ce lien fort intéressant !
Je reprends ses trois points :

Conclusion:
- arrêtez de faire du XHTML bidon, faites plutôt du HTML 4.01 valide.
- ne mettez pas de prologue XML
- mettez un doctype HTML décent.
Donc, si j’ai bien compris :
Il ne faut pas mettre <?xml version="1.0" encoding="UTF-8"?> en entête de la page ?
Question : que faut il comprendre lorsqu’il dit :
- arrêtez de faire du XHTML bidon, faites plutôt du HTML 4.01 valide.
=> faut il bannir : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
?
- mettez un doctype html decent?​
Quand on arrivera au html5 ca sera juste <!DOCTYPE HTML>, mais jusque là, que faut-il faire?

EDIT : je viens de jeter un oeil à ta proposition de code… on utilise la notion "id" pour un seul élément dans la page, sinon on prend une classe :

=> oui, id, c’est unique, et classe c’est quand ca revient.
Donc
Bloc de code:
<ul>
<li id="coin"><a href="index.html">Accueil</a></li>
<li id="coin"><a href="votre_galette">la galette</a></li>
<li id="coin"><a href="bons_cadeaux">Bons cadeaux</a></li>
<li id="coin"><a href="promotions.html">Promotions</a></li>
<li id="coin"><a href="tarifs.html">Tarifs</a></li>
<li id="coin"><a href="contact.html"> Contact</a></li>
</ul>
=C’est une grave erreur. C’est clair. Mais c’était il y a un mois ! Depuis, j’ai un peu progressé ! lol

Un autre point pour alléger le code tu créés une div sidebar puis tu ajoutes une div menu avec une id, pourquoi pas, mais le plus simple c'est de faire l'ul avec l'id menu et virer la div menu qui ne sert (à priori) à rien.
J’essayais de me “mettre a la sauce” de 960 Grid S (que tu dois connaitre). C’est pour me faciliter avec les templates des CMS.
SI j’ai bien compris, une des caractéristiques (qui est aussi un point faible) des systèmes fondés sur 960 GS c’est la tendance à la “divite” (pour reprendre Goetter) dans le code?
Itou pour ton menu horizontal… sauf besoin spécifique d'un sur-conteneur.
A quel besoin spécifique un sur-conteneur peut il répondre?

S.
 
Quand on arrivera au html5 ca sera juste <!DOCTYPE HTML>, mais jusque là, que faut-il faire?

En vitesse, avant de partir faire souffrir mon corps, je réponds sur ce point : cette déclaration de doctype sera comprise par tous les navigateurs, même les vieux, tout en assurant qu&#8217;ils restent en mode standard (et non quirks, tant redouté).

L&#8217;utiliser c&#8217;est que du bénèf :up:même si tu n&#8217;utilises pas les nouveaux éléments composant le HTML5.

facile à retenir, léger, fonctionnel ;)
 
Dernière édition:
Que penser de son clearfix ?
=>que conseilles tu dans la pratique ?
J'avoue que là, tu me poses une colle, j'en suis resté à l'overflow:hidden bien pratique (Alsacréations) mais cette page fait, je pense le tour du sujet, à chacun de voir, je n'ai pas d'avis tranché.


Donc, si j’ai bien compris :
Il ne faut pas mettre <?xml version="1.0" encoding="UTF-8"?> en entête de la page ?
Question : que faut il comprendre lorsqu’il dit :
- arrêtez de faire du XHTML bidon, faites plutôt du HTML 4.01 valide.
=> faut il bannir : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
?
- mettez un doctype html decent?​
Quand on arrivera au html5 ca sera juste <!DOCTYPE HTML>, mais jusque là, que faut-il faire ?
Hors CMS moderne (et thème en HTML5) j'utilise du XHTML1 strict :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
De toute façon xhtml2 est mort si j'ai tout compris… :rolleyes:
 
Salut Momo,

Merci pour ta réponse.

J'avoue que là, tu me poses une colle, j'en suis resté à l'overflow:hidden bien pratique (Alsacréations) mais cette page fait, je pense le tour du sujet, à chacun de voir, je n'ai pas d'avis tranché.

Dans cette page, il propose :

Bloc de code:
<style type="text/css">

  .clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
    }

.clearfix {display: inline-block;}  /* for IE/Mac */

</style><!-- main stylesheet ends, CC with new stylesheet below... -->

<!--[if IE]>
<style type="text/css">
  .clearfix {
    zoom: 1;     /* triggers hasLayout */
    display: block;     /* resets display for IE/Win */
    }  /* Only IE can see inside the conditional comment
    and read this CSS rule. Don't ever use a normal HTML
    comment inside the CC or it will close prematurely. */
</style>
<![endif]-->


quand on lit cette page, j'ai l'impression que l'on comprendrait qu'il faut un clearfix comme ca :
Bloc de code:
.clearfix:before,
.clearfix:after {
  content: ".";    
  display: block;    
  height: 0;    
  overflow: hidden;	
}
.clearfix:after {clear: both;}
.clearfix {zoom: 1;} /* IE 5.5/6/7 */

On remarque qu'il utilise du overflow (comme ce que tu disais) sur du after et before, et puis qu'il rajoute un clear botch pour after uniquement. Et apres le zoom pour IE.
C'est pour une histoire de comptabilité des navigateurs si j'ai bien compris. Non?

Si j'ai bien compris,c 'est chacun son clearfix apres tout. Car il y a lui aussi qui reprend la méthode de positioningeverything

Hors CMS moderne (et thème en HTML5) j'utilise du XHTML1 strict :
Tu veux dire quoi par theme?

Sinon, ok pour l'xthml2.

Z.