Texte non aligné dans deux DIVs côte à côte

[MGZ] Shralldam

Gendarmette déchue
Club iGen
Bonjour à toutes et à tous, :)

Après de nombreuses années sans plus trop m'intéresser au sujet, je me suis remis récemment au design web. Heureusement, j'ai retrouvé assez rapidement mes marques, mais je n'étais pas encore trop familier des DIVs et leur positionnement (j'utilisais des tableaux… Peut-être moins moderne mais efficace). Bref, je mets les mains dans le cambouis et je crois que je m'en sors assez bien, cela dit il y a un problème qui m'irrite dans un modèle que je suis en train de réaliser : le texte n'est pas aligné dans deux DIVs se trouvant côte à côte. J'ai beau réfléchir sur mon code CSS, je n'arrive pas à résoudre le problème. Jugez-en plutôt l'image ci-dessous :

20090412-x9kksh7hwgap9xu32ynnxcx7jc.png


Pour information, j'ai 5 DIVs :

  • DIV 1 (id="top") qui définit la barre supérieure
  • DIV 2 (id="container") contenant deux autres DIVs : DIV 3 (id="left") pour la barre de navigation gauche et DIV 4 (id="content") pour le contenu sur la droite
  • DIV 5 (id="bottom") qui définit le pied du contenu de la page

La DIV 3 (la barre de navigation gauche) est réglée en float: left, et comme vous pouvez le constater, les premières lignes des DIVs 3 et 4 ne sont pas alignées ! J'ai bidouillé avec les margins et les paddings mais rien n'y fait, sauf en trichant, et je suis convaincu que ça doit marcher sans tricheries !

Voici le code CSS (c'est du temporaire, excusez si ce n'est pas très complet) :

Bloc de code:
		body {
		font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', Helvetica, Arial, sans-serif;
		margin: 0 0 0 0;
		}
		
		#top {
		clear: both;
		padding: 10pt 0pt 0pt 10pt;
		color: white;
		background: olive;
		height: 100px;
		}
		
		#left {
		padding-left: 10pt;
		float: left;
		width: 180px;
		height: 100%;
		}
				
		#right {
		margin-left: 200px;
		padding-left: 10pt;
		border-left-style: solid;
		border-left-width: 1px;
		}
		
		h4 {
		padding-left: 15pt;
		}
		
		#bottom p {
		height: 50px;
		color: white;
		background: black;
		text-align: center;
		}

Et pour suivre, le code HTML :

Bloc de code:
<body>
	
	<!-- D'abord, nous créons la DIV de navigation haute -->
	
	<div id="top"><h1>LOGO</h1></div>

	<!-- Ensuite, nous créons la DIV de contenu qui comprendra la barre de navigation gauche, et le contenu (sur la droite) -->

	<div id="content">
	
		<!-- Voici la DIV de la barre de navigation gauche -->
	
		<div id="left">

		<h3>Rubriques</h3>
		
		<ul>
			<li><a href="#">Lien</a></li>
			<li><a href="#">Lien</a></li>
			<li><a href="#">Lien</a></li>
			<li><a href="#">Lien</a></li>
			<li><a href="#">Lien</a></li>
			<li><a href="#">Lien</a></li>
		</ul>
		
		<h3>Partenaires</h3>
		
		</div>

		<!-- Voici la DIV du contenu (sur la droite) -->

		<div id="right">
	
		<h1>Bienvenue sur ma page réalisée entièrement par code !</h1>
	
		<h3>1. Introduction</h3>
	
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
	
		<h3>2. En profondeur</h3>
	
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		
		<h4>Voici un peu de code CSS :</h4>

		<p><tt>#right { margin-left: 200px; padding-left: 10pt; border-left-style: solid; border-left-width: 1px; }</tt></p>

		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

		<h3>3. Conclusion</h3>
	
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

		</div>

	<!-- Nous fermons ici la balise DIV qui a pour ID "content" -->

	</div>

	<!-- Et pour finir, la DIV qui définit le pied du contenu de la page -->

	<div id="bottom">

		<p>&copy; 2009 Moi-même.</p>
	
	</div>
	
	</body>

Voilà… Ma plus grosse peur : que l'erreur soit stupide et que je sois passé à côté comme un cornichon ! Mais bon, là j'ai un doute. :hein:

L'un(e) d'entre-vous aurait une idée ?

Merci d'avance ! :zen:
 
Je sais pas trop mais j'ai deux pistes :

- Vérifies que les deux divs sont alignés en ajoutant une bordure, mais à priori c'est bon.
- C'est peut-être une problème de typo : voir les paddings/margin de h3 et h2 ainsi que les line-height

C'est tout ce qui me passe par la tête...
 
deux trois choses :
d'un navigateur à l'autre, les valeurs par défaut ne sont pas les mêmes.

ainsi, les marges par défaut seront différentes, comme les polices etc. Ce qui implique des différences&#8230;

par ailleurs, la hauteur de ligne n'est pas fixe : un texte plus grand implique une hauteur de ligne plus grande.

Donc, primo contrôler les marges, padding et tailles des caractères : les fixer à 0 pour les éléments sensibles.
ici, on peut écrire h1,h2,h3,h4 {border:0;margin:0;padding:0;}

rien n'empêche ensuite de "corriger" au besoin (via une classe par exemple)

Secundo fixer arbitrairement la hauteur de ligne pour les éléments à aligner parfaitement.

là, comme seuls les premiers titres h1 et h3 des sections left et right sont concernés, utilise une classe

.alignement {line-height:50px; background:#ccc;}

le background n'a d'intérêt que pour la visualisation de la hauteur de ligne.

Ce sera déjà un bon début mais pas la perfection&#8230;
 
Merci pour tes idées !

Ta réflexion à propos de la typo m'a fait penser à un truc, que j'ai essayé aussitôt :

Bloc de code:
#left h3 {
margin-top: 0;
}

Ca a effectivement remonté le texte… Mais j'essaie toujours de comprendre pourquoi je dois le faire pour cette DIV-là et pas l'autre (je n'ai pas dû faire de règle h1 { margin-top: 0; } pour la DIV #content, le texte colle en haut de la DIV directement). Parce que j'avais fait le test en mettant un texte en h1 dans #left également, mais ils ne s'alignaient pas non plus… Comment la même balise peut-elle avoir deux marges différentes (dans deux DIVs distinctes) sans qu'on lui ait demandé (càd sans règle CSS) ?

Dans tous les cas, merci à toi, ça m'a fait bien avancer ! :up:

---------- Nouveau message ajouté à 20h19 ---------- Le message précédent a été envoyé à 20h14 ----------

Désolé Da Capo, je n'ai pas vu ta réponse alors que j'écrivais la mienne… Merci pour tes conseils, je vais vérifier tout ça… Mais comme je l'ai dit dans mon post précédent, même en mettant un h1 au début de chaque DIV (#left et #right), ils ne s'alignent pas, comme si leurs marges et/ou retraits n'étaient pas les mêmes dans chaque DIV, alors que je ne l'ai pas spécifié (c'est ça en fait qui me chipote)…

Un grand merci ! :zen:
 
J'ai un peu investi l'affaire, et en fait le problème semble venir du fait que le bloc de droit n'ayant pas de padding, la marge de 14px du H1 (définie par safari) s'applique hors du bloc. En gros c'est comme si la marge se reportait au bloc qui encapsule le h1. Cela ne se passant pas dans le cas d'un bloc flottant.

Bref tu as deux méthodes pour le vaincre, 1) Mettre la marge des titre à 0 ou bien mettre un padding à 1 à tous les blocs. Dans tous les cas c'est tordu =D
 
Chez moi, si j'utilise un titre h1 au début de chaque section (#left et #right) ils sont parfaitement alignés pour peu que les marges aient été fixées arbitrairement.

Je sais que ça peu paraître étrange que cela soit ainsi&#8230; il faudrait aller jeter un oeil à la norme pour comprendre pourquoi&#8230; mais, bon, autre chose à faire ;)
 
Bonsoir

Une petite astuce pour voir ce qui se passe: ouvrir la page dans Safari, afficher l'Inspecteur web en mode liste (Alt+Cmd+I), et activer l'affichage des propriétés héritées (case à cocher dans la barre de droite).

Il y a probablement des choses à voir dans les propriétés du côté de la marge supérieure ou de l'alignement.
 
Bonjour,

Merci à tous pour vos interventions, elles m'ont vraiment éclairé&#8230; En réalité c'est plus le fait qu'il faille aller contre la "logique" pour obtenir le résultat qui m'a trituré les méninges. Mais bon j'ai déjà vérifié par le passé que parfois en CSS il faut quelque peu oublier la logique :p

Sinon, effectivement h1 et h3 ont respectivement une margin-top par défaut (0.67em pour h1 et 1em pour h3) qui doit donc être "contredite" par une règle CSS spécifique. J'avais déjà observé que les headers avaient leurs propres marges, mais je ne comprenais pas que deux mêmes headers ne s'alignent pas, apparemment c'est lié au float&#8230; Subtil !

Je vais utiliser une classe comme le suggère Da Capo :)

Merci pour vos lumières ! :up:

Edit : j'ai appliqué la classe (.firstheader { margin: 10pt 0 0 0; }) et ça marche super, même mieux qu'avant puisque maintenant le h3 (de la DIV #left) et le h1 (de la DIV #right) sont alignés sur la ligne de base :)