28173 sujets

CSS et mise en forme, CSS3

Bonjour à tous.

Je me permet de commencer ce sujet car j'ai un problème de CSS que je n'arrive décidément pas à résoudre, malgrés les recherches que j'ai pu faire sur ce forum ou sur le site.

Je vous explique brièvement la situation : j'ai un menu avec des onglets; ce menu est en faite une liste toute bête en html avec une jolie feuille de style. La structure est un peu particulière dans le sens où il s'agit d'un mix de styles entre <a>, <li>, ... pour faire de jolis onglets qui ont du style Smiley smile Les <li> sont affichées en ligne et les <a> sont affichés en block et ca marche très bien.

Mon problème c'est que je voudrai centrer ce menu sur ma page. J'ai donc mis l'attribut text-align: center sur mon container de menu, j'ai viré les attributs float et display : ca marche mais j'ai un soucis graphique que je n'arrive pas à résoudre et que je vous soumet.

Voici un visuel du menu actuel :

upload/6259-menuavant.jpg

Voici un visuel du menu après :

upload/6259-menuapres.jpg

Et voici le code associé :

CSS (les lignes commentées sont celles qui différent entre la version "avant" et la version "après" de mon menu)


#header {
	height: 70px;
	position: relative;
}
#header_gauche {
	position: absolute;
	left: 0;
	width: 200px;
	height: 70px;
	background: #ff0000;
}
#header_droit {
	position: absolute;
	right: 0;
	width: 200px;
	height: 70px;
	background: #0000ff;
}
#header_centre {
	position: absolute;
	top: 50px;
	width: 100%;
	text-align: center;
	background: #00ff00;
}
#header_menu {
	position: relative;
	margin-left: auto;
	margin-right: auto;
	text-align: center;
	margin:auto;
}
#header_menu ul {
	margin: 0px;
	padding: 0px;
}
#header_menu ul li {
	behavior: url('fix_ie_hover.htc');
	font-size: 8pt;
	font-weight : bold;
}
#header_menu li {
	background : transparent url('img_portail/menu_onglets.gif') no-repeat 100% -600px;
	display : inline;
	/*float : left;*/
	margin : 0 1px 0 0;
	padding : 0 6px 0 0;
	white-space: nowrap;
}
#header_menu ul a {
	background : transparent url('img_portail/menu_onglets.gif') no-repeat 0% -600px;
	color : #05294e;
	/*display: block;*/
	padding : 4px 4px 4px 10px;
	text-decoration : none;
}
#menu_degrade_violet {
	clear: both;
	background : transparent url('img_portail/menu_degrade_violet.gif') repeat-x;
}
.centrage {
	text-align:center; 
	margin:auto;
}


HTML


<div id="header">		
	<div id="header_gauche">
		&nbsp;
	</div>
	<div id="header_droit">
		&nbsp;
	</div>
	<div id="header_centre">
		<div id="header_menu">
			<ul class="centrage">
				<li><a href="">Accueil</a></li>
				<li><a href="">Mes infos</a></li>
				<li><a href="">Contacts</a></li>
				<li><a href="">Déconnexion</a></li>
			</ul>
		</div>
	</div>
</div>
<div id="menu_degrade_violet">
	&nbsp;
</div>


Je pense qu'il s'agit d'un problème de "display" qui n'est pas bon pour la propriété "text-align" mais j'ai beau tester je vois pas. Ca marche globalement si on veut mais ca me gêne de devoir bidouiller pour faire que l'affichage soit OK.

Est-ce que quelqu'un aurait une piste? Smiley murf
Modifié par vielos (28 Apr 2006 - 11:29)
blue a écrit :
Mon problème c'est que je voudrai centrer ce menu sur ma page. J'ai donc mis l'attribut text-align: center sur mon container de menu

Pour centrer le conteneur du menu, les marges automatiques n'auraient pas été plus simples ?
blue a écrit :
Bonjour vielos,

Peux-tu décrire ton souci stp ?


J'ai mis à jour les visuels Smiley smile En fait le menu est bien centré comme il faut mais le bout de mon onglet (qui dépend du <li>) n'a plus du tout la même tête que lorsque j'affiche mon <a> en block.

mpop a écrit :
Pour centrer le conteneur du menu, les marges automatiques n'auraient pas été plus simples ?


Le soucis c'est qu'il faut spécifier une width pour que ca marche et je ne sais pas la largeur de mon menu

-----

J'ai fait un petit jpg pour vous montrer de plus près le soucis :

upload/6259-menucasconc.jpg

Bon faut bien capter le système de background sur le <a> et le <li> pour faire un onglet à dimension variable... Mais ce qui me chagrine c'est que si je met le <a> en display:block, l'affichage est bon mais impossible de centrer tout ca.
Modifié par vielos (25 Apr 2006 - 09:50)
Si tu as mis ton travail en ligne, j'aimerais bien que tu le mettes stp, car ce serais mieux pour se rendre compte avec les images
Je serais toi, j'inverserais les images pour le li et le a. Il serait plus logique d'avoir l'image de fond (fond et bord gauche ou droit, par exemple) sur le bloc conteneur (ici le li), et la petite image pour le bord restant sur le contenu (ici le a. Du coup, on peut se débarasser de ce padding-right de 6px qui ne sert pas à grand chose.

En display: block, on peut fixer la hauteur des li et donner aux a (eux aussi en display:block) une hauteur et une largeur de 100%. Ce qui évite de devoir bidouiller le comportement d'IE pour le survol, vu que le survol se fera sur le lien.

En display: inline, c'est effectivement un peu plus compliqué. Je suppose qu'il faut jouer avec la hauteur des liens en supprimant tout padding pour les li mais en donnant une hauteur de ligne importante aux a.

-------------------------------------
EDIT : Mais dis-donc, elle est beuguée cette page de test ! Smiley biggol

Tu annonces « sans block ni float », mais dans le code pour ton li.test tu annonces :
#header_menu li.test {
	display : inline;
	float : left;
}

Alors forcément, en float: left tes li vont avoir un comportement de bloc, ce qui permet de leur attribuer padding, margin et tout le toutim. Supprimes le float: left, et le tout vient se centrer bien sagement… mais tu récupères le problème de la gestion de la hauteur de l'onglet, les padding n'étant plus fonctionnels (ou si ? Je sais que ça peut poser problème, mais ce n'est peut-être pas systématique).

Deuxième problème
Le fait d'avoir mis les deux tests sur la même page et de partager certaines propriétés (le deuxième test venant comme un "correctif" par rapport au premier) fausse la donne. Mieux vaut faire deux pages séparées, pour éviter les interférences.
Et je peux t'assurer qu'il y en a qui traînent…
Modifié par mpop (26 Apr 2006 - 15:40)
J'ai mis à jour la page pour séparer les deux "versions".

J'essaie de faire ce que tu suggère et je reposte.
Le soucis en fait c'est surtout de vouloir centrer du contenu inline... Parce que l'affichage en block me parais évidemment plus logique mais du coup je n'ai plus de technique pour centrer le menu
J'ai de mon côté trouvé une solution, mais qui ne me satisfait pas du fait que les onglets sont un peu plus éloignés sur FF que sur IE et qu'il y a plus d'espace à droite qu'à gauche, à l'intérieur des onglets sous IE

La voici, c'est toi qui décidera si ça te convient ou pas :

Je suis partie sur ton premier menu, sans float sur <li> et sans display: block sur <ul> a

tu mets :

padding : 4px 6px 4px 0;

à

#header_menu li


et tu rajoutes :

margin-top: -4px;
margin-bottom: -4px;

à

#header_menu ul a


Par contre, j'ai une question, pourquoi dis-tu que tu ne connais pas la largeur de ton menu, le nombre de tes onglets sera toujours le même et les liens idem non ?
vielos a écrit :
Le soucis en fait c'est surtout de vouloir centrer du contenu inline

Ben voilà, maintenant c'est fait. Le problème qui reste est celui de la gestion des hauteurs et des fonds, mais comme je ne sais pas bien comment tu as géré tes images de fond, je te laisse voir ça. Penses juste à mettre une petite image (bord) sur a et une grande image (fond et bord) sur li.
blue a écrit :
Par contre, j'ai une question, pourquoi dis-tu que tu ne connais pas la largeur de ton menu, le nombre de tes onglets sera toujours le même et les liens idem non ?

Sauf dans le cas d'un CMS où chaque catégorie représente un onglet, par exemple. Pouvoir rajouter ou supprimer une catégorie à la volée peut être appréciable.

Enfin, le texte des onglets peut faire varier la largeur de l'onglet…
mpop a écrit :

Ben voilà, maintenant c'est fait. Le problème qui reste est celui de la gestion des hauteurs et des fonds, mais comme je ne sais pas bien comment tu as géré tes images de fond, je te laisse voir ça. Penses juste à mettre une petite image (bord) sur a et une grande image (fond et bord) sur li.


Bah c'est fait mais on ne fait que déplacer le problème : je ne peux pas jouer sur la hauteur de mon <li> vu qu'il est en inline et qu'il n'as pas de float (c'est pas un block donc Smiley lol ). J'ai essayé de jouer avec l'overflow mais rien n'y fait.
blue a écrit :
J'ai de mon côté trouvé une solution, mais qui ne me satisfait pas du fait que les onglets sont un peu plus éloignés sur FF que sur IE et qu'il y a plus d'espace à droite qu'à gauche, à l'intérieur des onglets sous IE

La voici, c'est toi qui décidera si ça te convient ou pas


Ah bien vu merci Smiley smile Je vais étudier ca.
Je viens de faire une découverte concernant la proposition de blue :

Si je met mes <li> en une seule ligne (genre "<li>test</li><li>test 2</li>") au lieu d'un <li> par ligne, les espaces entre les onglets disparaissent aussi bien sous IE que sous FF. Du coup le résultat deviens identique sous les deux navigateurs.
Modifié par vielos (26 Apr 2006 - 17:23)
C'est pourtant vrai Smiley biggrin PTDR

Reste plus que le souci de l'espace plus important à droite à l'intérieur des onglets IE Smiley smile

edit : quoi que, ça le fait plus que sur le dernier onglet lol

reedit : tu mets la balise </ul> à côté du dernier </li> et c'est bon
Modifié par blue (26 Apr 2006 - 17:39)
Merci blue et mpop pour votre aide :

je teste tout ca et j'essaie de voir si ca passe partout Smiley smile Bon c'est certainement du quickfix mais ca me va.
vielos > oki
mpop > comment tu expliques que d'accoler les éléments <li>, dans le html, fassent que l'espace entre les onglets soit le même sous IE et Firefox stp ?
blue a écrit :
mpop > comment tu expliques que d'accoler les éléments <li>, dans le html, fassent que l'espace entre les onglets soit le même sous IE et Firefox stp ?

Il me semble qu'il y a un bug de l'un ou l'autre navigateur qui est lié à ça. Mais je connais mal ce bug, et je ne crois pas avoir bookmarké d'article sur le sujet.