Modérateur
Salut,

Si on externalise toutes les instructions JS dans un fichier script.js, qu'on rajoute la méthode de chargement rapide de Dean Edwards, qu'on modifie le menu de manière à ce que JS désactivé tous les sous-menus soient apparents et qu'on ajoute la navigation clavier, ça donne ceci :

page.html
<!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>
<title>Menu horizontal déroulant sur une ligne en CSS</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="menu.js"></script>
<link rel="stylesheet" type="text/css" media="screen, projection" href="menu.css" />

</head>

<body>

<div id="menu">
	<dl>

		<dt><a href="#">Menu 1</a></dt>
			<dd id="smenu1">
				<ul>
					<li><a href="#">Sous-menu 1.1</a></li>
					<li><a href="#">Sous-menu 1.2</a></li>
					<li><a href="#">Sous-menu 1.3</a></li>
				</ul>
			</dd>
	</dl>
	
	<dl>			
		<dt><a href="#">Menu 2</a></dt>
			<dd id="smenu2">
				<ul>
					<li><a href="#">Sous-menu 2.1</a></li>
					<li><a href="#">Sous-menu 2.2</a></li>
				</ul>
			</dd>
	</dl>
	
	<dl>	
		<dt><a href="#">Menu 3</a></dt>
			<dd id="smenu3">
				<ul>
					<li><a href="#">Sous-menu 3.1</a></li>
					<li><a href="#">Sous-menu 3.2</a></li>
					<li><a href="#">Sous-menu 3.3</a></li>
					<li><a href="#">Sous-menu 3.4</a></li>
					<li><a href="#">Sous-menu 3.5</a></li>
				</ul>
			</dd>
	</dl>

	
	<dl>	
		<dt><a href="#">Menu 4</a></dt>
			<dd id="smenu4">
				<ul>
					<li><a href="#">Sous-menu 4.1</a></li>
					<li><a href="#">Sous-menu 4.2</a></li>
					<li><a href="#">Sous-menu 4.3</a></li>
				</ul>
			</dd>
	</dl>
	
</div>

<div class="mentions">Raphaël GOETTER<br />
  <a href="http://www.alsacreations.com">Alsacréations</a><br />
  <a href="http://css.alsacreations.com/Construction-de-menus-en-CSS/Un-menu-deroulant-en-CSS-et-XHTML-vertical-et-horizontal">Explications / Explanations</a></div>

</body>
</html>


menu.css
/* CSS issu des tutoriels  http://css.alsacreations.com  */
body {margin: 10px;
padding: 0;
font: 1em Verdana, sans-serif;}

dt, dl, dd, ul, li {
list-style-type: none;
margin: 0 10px 0 0;
padding: 0;
}

#menu {
position : absolute;
left: 50px;
top: 20px;
}

#menu dl {
float: left;
}
#menu li {
display: inline;
}

#menu a {
text-decoration: none;
color: #000;
background: #fff;
}

#smenu1, #smenu2, #smenu3, #smenu4 {
position: relative;
left: 0;
font-size: 0.7em;
border-top: 1px solid gray;
width: 400px;
}


.mentions {
position: absolute;
bottom : 300px;
left : 10px;
color: #000;
background-color: #ddd;
}
a {text-decoration: none;
color: #222;
}
.cache {
	display: none;
}
.montre {
	display: block;
}


menu.js
function hideSsMenus()
{
	var oMenu, aSsMenus, iSsMenu;
	
	oMenu = document.getElementById('menu');
	aSsMenus = oMenu.getElementsByTagName('dd');
	iSsMenu = aSsMenus.length;
	
	do aSsMenus[--iSsMenu].style.position = 'absolute';
	while(iSsMenu > 0);

	iSsMenu = aSsMenus.length;
	
	do aSsMenus[--iSsMenu].className = 'cache';
	while(iSsMenu > 1);
}

function addBehaviour()
{
	var oMenu, aDts, iDt;
	
	oMenu = document.getElementById('menu');
	aDts = oMenu.getElementsByTagName('dt');
	iDt = aDts.length;
	
	do
	{
		aDts[--iDt].getElementsByTagName('a')[0].onmouseover = displaySsMenu;
		aDts[iDt].getElementsByTagName('a')[0].onfocus = displaySsMenu;
	}
	while(iDt > 0);
}

function displaySsMenu()
{
	var oMenu, aSsMenus, iSsMenu, oCurrent;
	
	oMenu = document.getElementById('menu');
	aSsMenus = oMenu.getElementsByTagName('dd');
	iSsMenu = aSsMenus.length;
	oCurrent = this.parentNode.parentNode.getElementsByTagName('dd')[0];
	
	do if(aSsMenus[--iSsMenu] != oCurrent)
			aSsMenus[iSsMenu].className = 'cache';
		else
			aSsMenus[iSsMenu].className = 'montre';
	while(iSsMenu > 0);
}

// Dean Edwards/Matthias Miller/John Resig

function init() {
    // quit if this function has already been called
    if (arguments.callee.done) return;

    // flag this function so we don't do the same thing twice
    arguments.callee.done = true;

    // kill the timer
    if (_timer) clearInterval(_timer);

    // do stuff
	hideSsMenus();
	addBehaviour();
};

/* for Mozilla/Opera9 */
if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
    var script = document.getElementById("__ie_onload");
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            init(); // call the onload handler
        }
    };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
    var _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            init(); // call the onload handler
        }
    }, 10);
}

/* for other browsers */
window.onload = init;


Ca doit faire ce que tu veux... Smiley cligne

Néanmoins, la structure du menu pourrait être améliorée car la liste descriptive n'est pas des plus adaptées à la situation (ça impliquerait de tout modifier) et le code JS pourrait encore être amélioré.

Bref, je l'ai fait un peu vite mais en attendant mieux, c'est déjà plus accessible. Smiley smile
merci koala64 Smiley smile

par contre, si je veut faire comme ça;

<div style="height: 100px; width: 900px; margin: 0 auto; background-color: #eeeeaa;"></div>
<div style="height: 100px; width: 900px; margin: 0 auto; background-color: #800000;"></div>

<div style="height: 250px; width: 900px; margin: 0 auto; background-color: #eeeeaa;">
<div id="menu">
avec les 4 menus etc... (je remet pas le code entier^^)
</div>
</div>


je m'y perds un peu avec la position absolute du #menu, que faire pour avoir un bon positionnement dans le cadre de couleur #eeeeaa (le deuxième en partant du haut)?

++
Modifié par csseur666 (24 Sep 2007 - 00:03)
Modérateur
Salut,

Le positionnement absolu s'effectue par rapport au premier élément positionné ou, à défaut, par rapport au body. Tu n'as qu'à positionner le div conteneur en relatif ce qui te permettra de mieux contrôler le positionnement du div "menu".

Je pense qu'une petite relecture de ce tuto ne serait pas superflu non plus Smiley cligne :
http://openweb.eu.org/articles/initiation_absolue/