28173 sujets

CSS et mise en forme, CSS3

Bonjour,

Voilà, j'ai un problème, j'aimerais aligner sur une ligne :

"un texte de quelques mots" à gauche, et "un titre d'un mot" à droite.

voici l'organisation du bout d'html:


<div id="ligne">
     <span id="gauche">Ma ligne de texte</span>
     <span id="droite"><h1>Titre</h1></span>
</div>


voici le CSS utilisé (il y a surement plus simple):


#ligne {}
#gauche{width:49%; float:left;}
#droite{width:49%; float:right;}
#droite h1 {display:inline;}


J'aimerais arriver à :
------------------------------------------------------
| mon texte________________________________TITRE |
------------------------------------------------------

Le problème qui survient aussi c'est qu'apparement il y une marge entre le bloc droite et son enfant le bloc h1 (vérifié à l'aide de WebDevelopper dans Firefox)

Merci.
Modifié par Titums (09 Oct 2007 - 03:41)
+1 pour les indications de papillon41.

Par ailleurs, une question: le titre (h1) introduit le texte placé à gauche?
Si c'est le cas, le titre devrait être placé en premier dans le code. On pourrait alors avoir:
[b]HTML:[/b]<h1>Titre</h1>
<p>Texte.</p>

[b]CSS:[/b]
h1 {float: right; margin: 0; width: 48%;}
p {margin-right: 50%;}
Bonjour et merci pour vos réponses !

pour papillon41:

Merci pour la remarque. J'avais déjà lu cette page, mais en la relisant en prenant mon temps je me rend compte que c'est carrément INTERDIT !

Je pensais aussi que le fait de caractériser la balise <h1> dans le CSS en display:inline; rendait cette structure OK.

pour Florent V.:

le titre (h1) n'introduit que très relativement le texte placé à gauche Smiley langue . En fait, à gauche, je voulais mettre un "chemin de fer" (ou "fil d'ariane"), et à droite, le titre de la page.

Je vais essayer ton code, je crois qu'il fonctionnera.

A tout de suite Smiley cligne

PS: grâce aux liens que vous m'avez envoyé relire je me suis rendu compte que j'avais oublié une chose: les balises de type bloc (sauf div) reçoivent par défaut des margin et padding de la part des navigateurs (et ça change d'un navigateur à l'autre Smiley sweatdrop )
Aille aille aille, ça ne change pas grand chose... (sauf que ça rentre mieux dans les normes).

Voici les différents effets, en image, que je commenterai plus bas.

upload/12021-problemes.PNG

Pour le 1, la partie gauche est bien placée. Le titre à droite descend vers le bas et est masqué. C'est lorsque je ne mets pas "overflow:hidden;" dans le CSS à #ligne

Pour le 2, la partie de gauche est trop dans les airs, alors que j'aurais aimé qu'elle soit alignée sur le titre. Le titre est bien placé parce que j'ai ajouté un "overflow:hidden;" dans le CSS à #ligne

Pour le 3, c'est ce à quoi j'aimerais arriver...

Voici les codes actuels:

HTML:

<div id="ligne">
  <h1>Titre</h1>
  <div id="chemin-de-fer">mon chemin de fer</div>
</div>


CSS:

#ligne {
overflow:hidden;
}

#ligne h1 {
float: right; 
margin: 0;
padding:0; 
width: 48%;
text-align:right;
}

#chemin-de-fer {
margin-right: 50%;
}


Vous en dites quoi ?
Aussi, pourquoi le h1 possède-t-il encore une certaine marge au-dessus et en-dessous du texte alors que j'ai bien spécifié 0 pour padding et margin ?
Modifié par Titums (10 Oct 2007 - 01:37)
Titums a écrit :
Aussi, pourquoi le h1 possède-t-il encore une certaine marge au-dessus et en-dessous du texte alors que j'ai bien spécifié 0 pour padding et margin ?

Ben normalement il ne devrait pas. Avec la page complète sous les yeux, il serait plus simple de t'en dire plus (il y a peut-être d'autres styles qui interfèrent?).

Mais à priori, c'est une simple histoire de hauteur de ligne: tu as une ligne qui est très haute (car les caractères y sont gros), et une ligne qui est sensiblement moins haute (texte en taille normale).

Exemple rapide avec des hauteurs de ligne plus ou moins équilibrées:
<!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">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Test</title>
	<style type="text/css">
	#ligne {
		width: 500px;
		background: yellow;
		border-bottom: solid 3px red;
		overflow:hidden;
	}
	#ligne h1 {
		float: right;
		margin: 0;
		padding:0;
		width: 48%;
		text-align:right;
		font-size: 1.5em;
		line-height: 1em;
	}
	#chemin-de-fer {
		margin-right: 50%;
		line-height: 1.8em;
	}
	</style>
</head>
<body>
<div id="ligne">
	<h1>Titre</h1>
	<div id="chemin-de-fer">mon chemin de fer</div>
</div>
</body>
</html>
Salut Florent,

Voici le code avec les options qui me permettent d'arriver au visuel que je veux:

<!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">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<meta http-equiv="Content-Language" content="fr" />
    <title>test</title>
    <style type="text/css">
		#title {
			width:800px;
			margin:auto;
			overflow:hidden;
			border-bottom: 4px solid #a11b1a;
		}

		#chemin-de-fer {
			margin-right:50%;
			padding-top:17px;
			padding-left:5px;
			padding-bottom:0;
			font-size:0.8em;
		}

		#title h1 {
			font-size:1.5em;
			color:#a11b1a;
			font-family:"comic sans ms", "times new roman", "trebuchet ms", verdana, sans-serif;
			float:right; 
			margin:0; 
			padding:0;
			padding-right:5px; 
			width:48%;
			text-align:right;
		}
	</style>
</head>
<body>
 <div id="main">
	  <div id="title">
	     <h1>Accueil</h1>
	     <div id="chemin-de-fer">
		    vous êtes ici: > Accueil
		 </div>
	  </div>
 </div>
</body>
</html>


Comme tu le vois j'y arrive grâce au padding-top que j'ajoute au bloc "chemin-de-fer", mais ça ne me semble pas très correct... si ? En fait je pensait qu'il était possible d'obliger le bloc "chemin-de-fer" de coller au bas du bloc conteneur autrement (plus proprement...).

Le code de base qui fait donc défaut (suffit d'enlever le padding-top):

<!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">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<meta http-equiv="Content-Language" content="fr" />
    <title>test</title>
    <style type="text/css">
		#title {
			width:800px;
			margin:auto;
			overflow:hidden;
			border-bottom: 4px solid #a11b1a;
		}

		#chemin-de-fer {
			margin-right:50%;
			padding-top:17px;
			padding-left:5px;
			padding-bottom:0;
			font-size:0.8em;
		}

		#title h1 {
			font-size:1.5em;
			color:#a11b1a;
			font-family:"comic sans ms", "times new roman", "trebuchet ms", verdana, sans-serif;
			float:right; 
			margin:0; 
			padding:0;
			padding-right:5px; 
			width:48%;
			text-align:right;
		}
	</style>
</head>
<body>
 <div id="main">
	  <div id="title">
	     <h1>Accueil</h1>
	     <div id="chemin-de-fer">
		    vous êtes ici: > Accueil
		 </div>
	  </div>
 </div>
</body>
</html>


Une autre question: avec d'autres codes pour le design d'un site j'ai un rendu parfait sur firefox, mais un rendu tout crade (chevauchements etc.) avec IE6. Faut-il essayer de corriger cela étape par étape, ou puis-je terminer mon code en le testant uniquement sur Firefox, et essayer de rattraper le coup sur IE plus tard ?

Merci.
Titums a écrit :
Comme tu le vois j'y arrive grâce au padding-top que j'ajoute au bloc "chemin-de-fer", mais ça ne me semble pas très correct... si ?

Tu veux aligner horizontalement le texte de deux blocs dont les hauteurs dépendent de leurs contenus respectifs. Or, ces contenus, ce sont deux lignes de texte, mais de hauteur très différente, vu que le corps utilisé (font-size) est très différent. Le positionnement de ton texte se faisant à partir du haut, tu as (en unités fictives):
- une première ligne de texte commençant à 0 à partir du haut, et descendant jusqu'à 12;
- une deuxième ligne de texte commençant à 0 à partir du haut, et descendant jusqu'à 20.

Deux solutions, à vue de nez:
- donner un line-height de 20 aux deux éléments;
- donner un padding-top de 8 (20-12) au premier élément.

C'est très mathématique tout ça, il n'y a pas de grand mystère ou de solution miracle. Smiley cligne

À priori, la solution du padding est encore celle qui fonctionne le mieux. Avec les hauteurs de ligne, il faudra en réalité jouer sur des hauteurs de ligne différentes pour obtenir un équilibre visuel (voir l'exemple que je donne dans mon précédent message).

Titums a écrit :
En fait je pensait qu'il était possible d'obliger le bloc "chemin-de-fer" de coller au bas du bloc conteneur autrement (plus proprement...).

En le positionnant en absolu, c'est jouable, mais un peu disproportionné. Avec un tableau à deux colonnes (ou, en CSS uniquement, avec display: table-cell), cela se fera facilement grâce à vertical-align: bottom.

Un exemple avec display: table-cell (non compatible IE):
<!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">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="Content-Language" content="fr" />
    <title>test</title>
    <style type="text/css">
		#title {
			display: table;
			width:800px;
			margin: 0 auto;
			border-bottom: 4px solid #a11b1a;
		}
		#chemin-de-fer {
			display: table-cell;
			width: 50%;
			font-size:0.8em;
			line-height: 1.5em;
			vertical-align: bottom;
		}
		#title h1 {
			display: table-cell;
			font-size:1.5em;
			color:#a11b1a;
			font-family:"comic sans ms", "times new roman", "trebuchet ms", verdana, sans-serif;
			width:50%;
			text-align:right;
			vertical-align: bottom;
		}
	</style>
</head>
<body>
 <div id="main">
	  <div id="title">
	     <div id="chemin-de-fer">
		    vous êtes ici: &gt; Accueil
		 </div>
		 <h1>Accueil</h1>
	  </div>
 </div>
</body>
</html>


Titums a écrit :
Une autre question: avec d'autres codes pour le design d'un site j'ai un rendu parfait sur firefox, mais un rendu tout crade (chevauchements etc.) avec IE6. Faut-il essayer de corriger cela étape par étape, ou puis-je terminer mon code en le testant uniquement sur Firefox, et essayer de rattraper le coup sur IE plus tard ?

On peut faire ça étape par étape, mais tout dépend de ce qu'on appelle une «étape». Vérifier le rendu dans IE à chaque changement même mineur dans la feuille de style et corriger les éventuelles erreurs, cela fera perdre trop de temps. Mieux vaut le faire à chaque grande étape: lorsque le positionnement des principaux blocs est en place, puis le détail de la mise en forme, etc.
Modifié par Florent V. (15 Oct 2007 - 10:36)
Salut Florent,

Grand merci pour cette mise au point concernant les hauteurs de ligne. J'y vois clairement plus clair maintenant (sans jeu de mot Smiley langue ) !

Pour ton exemple avec "display:table-cell", c'est un peu chaud, je n'y suis pas encore. Surtout que c'est pas compatible avec cet insolent d'IE ! (et bcp de surfeurs en dépendent encore.

Pour les grandes étapes, je suis d'accord avec toi ! C'est clair que s'arrêter pour corriger chaque ligne incompatible fait perdre énormément de temps.

Au passage, félicitations pour http://www.covertprestige.info/ressources. C'est la première fois que je le visite et c'est extrêmement intéressant !

A bientôt !
Yop,

Tiens, vous m'étonnez :
a écrit :
Tu ne peux pas mettre un <h1> (élément block) dans un <span> (élément en ligne).

Un élément flottant (le span) ne devient-il pas automatiquement de type block ?
Et comme Titums le dit, préciser que le h1 est inline ne devrait-il pas résoudre le problème ?

a écrit :
Faut-il essayer de corriger cela étape par étape, ou puis-je terminer mon code en le testant uniquement sur Firefox, et essayer de rattraper le coup sur IE plus tard ?

Par expérience, je te conseille de "corriger" les problèmes d'affichage sous IE6 uniquement en dernier, concentre toi sur un beau code pour Firefox et consorts dans un premier temps.
Salut,
Tymlis a écrit :
Et comme Titums le dit, préciser que le h1 est inline ne devrait-il pas résoudre le problème ?

Non, c'est une confusion assez courante, mais les règles spécifiées pour les langages (X)HTML, pour lesquelles on utilise les termes "en ligne" ou "bloc" ne sont pas directement liées au type de rendu appliqué ensuite grâce aux CSS.
Tymlis a écrit :
Tiens, vous m'étonnez :
Tu ne peux pas mettre un <h1> (élément block) dans un <span> (élément en ligne).

Un élément flottant (le span) ne devient-il pas automatiquement de type block ?
Et comme Titums le dit, préciser que le h1 est inline ne devrait-il pas résoudre le problème ?
Non, ça n'a rien à voir. La règle «pas d'élément de type bloc dans un élément de type en-ligne» n'est pas une règle CSS, mais bien une règle de syntaxe HTML. ul ne peut avoir que des li comme enfants, p ou h1 ne peuvent avoir que certains éléments dits «inline» comme enfants, etc. Ce sont des règles syntaxiques.

En l'occurrence, on pourra regarder dans la DTD HTML 4.01 Transitional (pour prendre large):
<!ELEMENT SPAN - - [#red](%inline;)*[/#]         -- generic language/style container -->
<!ATTLIST SPAN
  %attrs;                              -- %coreattrs, %i18n, %events --
  %reserved;                   -- reserved for possible future use --
  >

Le %inline; renvoie à l'entité %inline définie ainsi:
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Les entités %fontstyle, %phrase, %special et %formctrl sont définies ainsi (on notera la liste des éléments HTML qui les composent):
<!ENTITY % fontstyle
 "TT | I | B | U | S | STRIKE | BIG | SMALL">

<!ENTITY % phrase "EM | STRONG | DFN | CODE |
                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >

<!ENTITY % special
   "A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
    MAP | Q | SUB | SUP | SPAN | BDO | IFRAME">

<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">


Voilà pour le détail.