Bonjour,

je suis parti du tuto menu-horizontal.htm, mais ça ne me convenait pas trop. Ce qui me pose problèmes c'est que le sous-menu est parfaitement aligné et de la même taille que le menu correspondant si on utilise des dd dl et dt.

Or j'ai besoin de faire un truc ressemblant à ce menu, on peut voir que la liste des sous menu est plus large que la taille du lien menu, et qu'il vient même "mordre" un peu sur le deuxième menu.

J'ai donc voulu repartir de 0 ou presque en m'inspirant de cet exemple, mais j'ai un peu de mal. J'ai essayé avec 2 listes imbriquées.

Voici mon code :

Source HTML

<ul id="menu">
	<li id="menu1" onmouseover="javascript:montre('smenu1');" onMouseOut="javascript:montre();">
		<a href="les-objectifs.html">l'association</a>
		<ul class="smenu" id="smenu1">	
			<li>
				<a href="les-objectifs.html">Les objectifs</a>
			</li>
			<li>
				<a href="notre-action.html">Notre action</a>
			</li>
			<li>
				<a href="composition-association.html">Composition de l'association</a>
			</li>	
			[...]
		</ul>
	</li>

	<li id="menu2" onmouseover="javascript:montre('smenu2');" onMouseOut="javascript:montre();">
		<a href="usage-produits.html">les dépendances</a>
		<ul class="smenu" id="smenu2">	
			<li>
				<a href="usage-produits.html">L'usage de produits</a>
			</li>
			<li>
				<a href="dependances-physique-psychologique.html">Dépendances physique et psychologique</a>
			</li>
			[...]
		</ul>
	</li>
	[...]
</ul>


Fichier CSS :
/********** MENU **********/

/*** NIVEAU 1 ***/
 
#menu {
	float:left;
	position: relative;
	z-index:100;
	height:34px;
	font-family: Tahoma, Verdana, Arial; 
	font-weight: bold;
	list-style-type: none;
	padding: 0;
	margin: 0 0 0 63px;
}

#menu li {
	float: left;
	margin: 5px 27px 0 0;
	font-size:18px; 
	background-image:url(images/interface/puce_menu.png);
	background-repeat: no-repeat;
	background-position: 0 3px;
	padding-left: 1.2em;
}

#menu li a {
	text-decoration: none;
}


#menu1 a{
	color:#001F6C;
}

#menu2 a {
	color:#A1B1C6;
}

#menu3 a {
	color:#BED945;
}

#menu4 a {
	color:#FC9410;
}

#menu5 a {
	color:#716663;
}

/*** NIVEAU 2 ***/
.smenu {
	position: relative;
	z-index:100;
	font-family: Tahoma, Verdana, Arial; 
	font-weight: bold;
	list-style-type: none;
	padding: 0;
	margin:0;
	background:red;
}

.smenu li {
	list-style-type: none;
	background:yellow;
	background-image:url(images/interface/puce_ss_menu.png);
	background-repeat: no-repeat;
	background-position: 0 3px;
	padding-left: 1.2em;
	font-size:10px; 
}


2 questions, 3 mêmes :

- est ce que vous voyez des gros problèmes dans mon CSS ou dans la structure de mon menu html ?
- un premier problème que j'ai concerne les attributs des <li> du sous menu, ils gardent les attributs des <li> du menu principal ce qui est plutôt embetant. Ce qui est bizarre c'est que pour certain attributs ça marche et pas pour d'autres. Par exemple j'ai mis un fond jaune juste pour tester, et le fond jaune se voit bien pour les <li> du sous menu, par contre la taille de la police ainsi que l'image de fond (la puce) sont les mêmes que pour les <li> du menu principal. Comment puis je faire pour régler ce problème ?
- autre problème, par contre là j'avoue que j'ai pas encore beaucoup cherché là dessus, c'est comment placer les éléments de la liste du sous menu en dessous du menu correspondant, puisque ce n'est plus automatique (ce n'est plus un tableau dd dt et dl) ?


Merci beaucoup à celui (celle ?) qui pourra bien m'aider Smiley smile
Modifié par vichenze (25 Mar 2008 - 14:14)
Bon alors je viens de résoudre en partie quelques problèmes, mais ça en soulève d'autres.

J'y avais penser mais sans rechercher vraiment, les attributs des id sont prioritaires sur ceux des class.
---> problème : vaut il mieux utiliser des classes avec !important ou alors faire un id pour chaque sous menu ?

Le problème d'affichage de la liste du sous menu venait de ce même problème, puisqu'il conservait le float:left du niveau supérieur.
J'ai cependant un problème de décalage quand un sous menu est déplié :
upload/16170-menusimple.JPG

puis

upload/16170-menuligne.JPG

Les menus suivants sont décalés vers la droite, et passe à ligne. Ce qui est bizarre c'est qu'il y a juste les menus de décaler, le contenu qui se trouve en haut de la page se place normalement sous les sous menus.
Il faut bien jouer sur le position:relative et sur le z-index pour la superposition non ?
parce que là il me semble avoir fait le nécessaire, le contenu avec un z-index à 1, le menu principal avec un z-index à 100 et les sous menus avec un z-index à 200.

Voici les nouveaux fichiers :

HTML :

<ul id="menu">
	<li id="menu1" onmouseover="javascript:montre('smenu1');" onMouseOut="javascript:montre();">
		<a href="les-objectifs.html">l'association</a>
		<ul class="smenu" id="smenu1">	
			<li>
				<a href="les-objectifs.html">Les objectifs</a>
			</li>
			<li>
				<a href="notre-action.html">Notre action</a>
			</li>
			[...]
		</ul>
	</li>
	<li id="menu2" onmouseover="javascript:montre('smenu2');" onMouseOut="javascript:montre();">
		<a href="usage-produits.html">les dépendances</a>
		<ul class="smenu" id="smenu2">	
			<li>
				<a href="usage-produits.html">L'usage de produits</a>
			</li>
			<li>
				<a href="dependances-physique-psychologique.html">Dépendances physique et psychologique</a>
			</li>	
			[...]
		</ul>
	</li>
</ul>


CSS :

/*** NIVEAU 2 ***/
.smenu {
	position: relative !important;
	z-index:200 !important;
	list-style-type: none !important;
	padding: 0 !important;
	margin:7px 0 0 0 !important;
}

.smenu li {
	float:none !important;
	background:#FFFFFF;
	background-image:url(images/interface/puce_ss_menu.png) !important;
	background-repeat: no-repeat;
	background-position: 14px 3px !important;
	padding: 5px 10px 5px 25px !important;
	font-size:10px !important; 
	margin:0 !important;
	border-bottom:solid 1px #B2B4B6;
	border-left:solid 1px #B2B4B6;
	border-right:solid 1px #B2B4B6;		
}

#smenu1 {
	width:200px;
	color:#001F6C;
}

#smenu1 li:hover, #smenu1 li:hover a{
	background:#001F6C;
	color:#FFFFFF;
	background-image:none !important;
}

[...]


Merci encore Smiley smile
Bonjour,

Le plus simple serait sans doute une classe avec important, où tu redéfinis un padding ou margin-left et une width (en "em" bien sûr, la width Smiley cligne ).

Peut-être ce sujet t'intéressera-t-il si tu veux approfondir sur les questions que pose ce genre de menu : Sujet sur le menu.

On y explique pas mal de précisions sur ce menu, notamment comment le rendre accessible ET valide, et comment gérer le cas sans JS (en injectant du code CSS depuis JS, sauf pour IE qui n'aime pas trop ça).
Tout d'abord merci pour la réponse Smiley cligne

Les 2 menus donnés en lien dans le message que tu donnes sont quand même pas mal lourd niveau JS, et comme je maitrise presque pas ce langage j'ai pas pu en tirer grand chose.

Je m'en suis quand même inspirer pour mon problème avec !important, au lieu de passer par un id #menu pour le premier <ul> puis par une classe .smenu pour le deuxième niveau, je passe par un #menu ul et #menu ul li pour remplacer le .smenu, et pas besoin d'utiliser de !important dans ce cas là Smiley smile

Par contre j'ai toujours un problème au niveau de la superposition des sous menus par rapport aux autres éléments du menu.
Voilà ce que j'ai pour l'instant : menu actuel

Je ne suis pas arrivé à ne pas décaler le menu au déroulement d'un sous-menu, je voudrais bien faire un truc comme ça : menu qui décale pas
Mais y'a trop de JS pour que je puisse comprendre comment il fait.

Quelqu'un pourrait m'éclairer ? (je pense pas que ce soit un gros truc, mais je trouve pas ce que c'est)

Merci beaucoup.
Bonjour,

Tes sous-menus ne sont pas en position : absolute par rapport aux menus, et donc leur largeur intervient dans le calcul de la largeur des menus. C'est ce qui provoque la différence entre les deux.

Je tiens à préciser que si tu restes sur cette solution, tu devras ajouter des liens sur les menus (ceux dont le survol déclenche l'apparition des sous-menus) pointant vers des pages contenant elles-mêmes des liens vers ces sous-menus (pour gérer le 'pas de js' et la navigation clavier).

Cordialement, SD.
a écrit :
Tes sous-menus ne sont pas en position : absolute par rapport aux menus, et donc leur largeur intervient dans le calcul de la largeur des menus. C'est ce qui provoque la différence entre les deux.

je viens d'essayer, et c'est exactement ce que je veux merci Smiley smile
Par contre ça marche bien sous Firefox, sous IE le sous menu est placé à la suite du menu et non dessous du menu. Un moyen de contourner ce problème ?
Edit : c'est à jour ici


a écrit :
Je tiens à préciser que si tu restes sur cette solution, tu devras ajouter des liens sur les menus (ceux dont le survol déclenche l'apparition des sous-menus) pointant vers des pages contenant elles-mêmes des liens vers ces sous-menus (pour gérer le 'pas de js' et la navigation clavier).
J'en suis pas encore là, mais je tacherai de pas l'oublier Smiley cligne
Modifié par vichenze (27 Mar 2008 - 15:08)
Bonjour,

Il faut utiliser un margin-top (de mémoire) sur ta feuille IE6 (ou IE tout court si problème avec IE7). Dans l'idéal, il est égal à la hauteur du menu, exprimé en 'em' pour avoir la possibilité de zoomer, mais pas trop grand pour pouvoir accéder au menu avec la souris.

Attention aussi à donner un z-index important (70-80 mais pas plus pour éviter les conflits avec de futurs plugins qui mettent souvent dans les 90 - par ex Lightbox) à tes sous-menus ET à ton menu en position:relative (correction d'un bug IE6).

Voilà, en espérant que ça t'aide. N'oublie pas qu'un menu DOIT être accessible à partir de n'importe quel navigateur W3C compliant n'utilisant pas JavaScript ! Donc n'oublie pas ces pages dont je t'ai parlé si tu veux éviter du JS Smiley cligne

Cordialement, SD.
J'ai mis à jour, désolé pour le delai.

J'ai donc fait un css pour IE, en redéfinissant le margin. En effet IE place le <ul> dans l'angle en haut à droite du <li> du niveau supérieur, alors que FF le place en bas à gauche.
Un margin-top me le place en bas du menu (en px pour l'instant juste histoire de tester Smiley lol ), le problème vient du margin-left. Je lui donne une valeur négatif pour le décaler vers la gauche, mais comme les <li> du menu principal non pas tous la même largeur c'est pas très joli parce que du coup le sous menu n'est pas calé au même endroit pour chaque menu Smiley ohwell

Je vois comme solution de faire un nouveau sélecteur pour chaque sous menu afin de donner à chacun un margin-left différent, mais c'est pas très propre et ça doit poser d'autres soucis. Une façon d'harmoniser tout ça ?

Merci