28173 sujets

CSS et mise en forme, CSS3

Bonjour,

Je cherche désespérément une solution à mon problème : j'ai un menu déroulant à plusieurs niveaux en CSS/javascript, mais je ne peux le mettre qu'1 fois dans mon code html, puisqu'il est défini par un ID. Et moi, j'aurai besoin d'en mettre plusieurs (au minimum 3) sur la même page.

Voici le code CSS:
ul#primary-nav,
ul#primary-nav ul {
	margin: 0;
	padding: 0;
	width: 150px; /* Width of Menu Items */
	border-bottom: 1px solid #ccc;
	background: #fff; /* IE6 Bug */
	font-size: 100%;
	}

ul#primary-nav li {
	position: relative;
	list-style: none;
	}

ul#primary-nav li a {
	display: block;
	text-decoration: none;
	color: #777;
	padding: 5px;
	border: 1px solid #ccc;
	border-bottom: 0;
	}

/* Fix IE. Hide from IE Mac \*/
* html ul#primary-nav li { float: left; height: 1%; }
* html ul#primary-nav li a { height: 1%; }
/* End */

ul#primary-nav ul {
	position: absolute;
	display: none;
	left: 149px; /* Set 1px less than menu width */
	top: 0;
	}

ul#primary-nav li ul li a { padding: 2px 5px; } /* Sub Menu Styles */

ul#primary-nav li:hover ul ul,
ul#primary-nav li:hover ul ul ul,
ul#primary-nav li.over ul ul,
ul#primary-nav li.over ul ul ul { display: none; } /* Hide sub-menus initially */

ul#primary-nav li:hover ul,
ul#primary-nav li li:hover ul,
ul#primary-nav li li li:hover ul,
ul#primary-nav li.over ul,
ul#primary-nav li li.over ul,
ul#primary-nav li li li.over ul { display: block; } /* The magic */

ul#primary-nav li.menuparent { background: transparent url(arrow.gif) right center no-repeat; }

ul#primary-nav li.menuparent:hover,
ul#primary-nav li.over { background-color: #f9f9f9; }

ul#primary-nav li a:hover { color: #E2144A; }


Le code html (avec le javascript dans le head)

<head>
<script type="text/javascript">
function IEHoverPseudo() {

	var navItems = document.getElementById("primary-nav").getElementsByTagName("li");
	
	for (var j=0; j<navItems.length; j++) {
		if(navItems[j].className == "menuparent") {
			navItems[j].onmouseover=function() { this.className += " over"; }
			navItems[j].onmouseout=function() { this.className = "menuparent"; }
		}
	}

}
window.onload = IEHoverPseudo;
</script>
</head>

<body>
<ul id="primary-nav">
  <li><a href="#">Home</a></li>

  <li class="menuparent"><a href="#">About</a> 
    <ul>
      <li><a href="#">History</a></li>
      <li><a href="#">Team</a></li>
      <li><a href="#">Offices</a></li>
    </ul>
  </li>

  <li class="menuparent"><a href="#">Services</a> 
    <ul>
      <li><a href="#">Web Design</a></li>
      <li><a href="#">Internet Marketing</a></li>
      <li class="menuparent"><a href="#">Hosting</a> 
        <ul>
          <li><a href="#">Dedicated</a></li>

          <li><a href="#">Virtual</a></li>
          <li><a href="#">Shared</a></li>
          <li><a href="#">Managed</a></li>
        </ul>
      </li>
      <li><a href="#">Domain Names</a></li>
      <li><a href="#">Broadband</a></li>

    </ul>
  </li>
  <li class="menuparent"><a href="#">Contact Us</a> 
    <ul>
      <li><a href="#">United Kingdom</a></li>
      <li><a href="#">France</a></li>
      <li><a href="#">USA</a></li>

      <li><a href="#">Australia</a></li>
    </ul>
  </li>
</ul>
</body>


J'ai bien essayé de feinter en créant une classe primavy-nav1, une classe primary-nav2, etc... et en mettant également plusieurs javascripts correspondants, mais ça ne fonctionne pas...
Je sais plus quoi faire!! Smiley bawling
Un grand merci d'avance à celui ou celle qui pourra me donner la solution.

Edit par Felipe: remplacement de la variable i par j sinon le forum interprète tableau[_i] par la mise en italique ...
Modifié par Felipe (30 Jan 2006 - 21:18)
Merci, en fait le mien fonctionne parfaitement si ce n'est que je ne peux pas l'appeler plusieurs fois sur la même page (puisque c'est un ID).

Je ne sais pas comment modifier le code pour pouvoir le faire. J'ai essayé de créer plusieurs id pour UL, (primary-nav1, primary-nav2, etc...) mais du coup j'ai été obligée de recopier plusieurs fois le javascript (qui appelle la classe primary-nav) autant de fois qu'il y a de menus dans la même page, en remplacant à chaque fois par primary-nav1, primary-nav2, mais ça n'a pas l'air de fonctionner comme ça. Snif.

Voici le lien de l'exemple :
http://www.pixeebox.com/test.htm
Modifié par pixie (30 Jan 2006 - 20:59)
Administrateur
Bonjour et bienvenue pixie,

j'ai édité le code JS conformément à ce qui est dit dans le sujet d'annonce du Salon "DOM, Javascript", voir la fin de ton 1er message pour les modifs
Modifié par Felipe (30 Jan 2006 - 21:20)
voila comme ça ça devrait fonctionner:

<script type="text/javascript">
function IEHoverPseudo() {

	var navItems = document.getElementsByTagName("li");//on enlève le getElementById
	
	for (var i=0; i<navItems.length; i++) {
		if(navItems[i].className == "menuparent") {
			navItems[i].onmouseover=function() { this.className += " over"; }
			navItems[i].onmouseout=function() { this.className = "menuparent"; }
		}
	}

}
window.onload = IEHoverPseudo;
</script>

<style type="text/css">
/*et on remplace tous les # par . */
ul.primary-nav,
ul.primary-nav ul {
	margin: 0;
	padding: 0;
	width: 150px; /* Width of Menu Items */
	border-bottom: 1px solid #ccc;
	background: #fff; /* IE6 Bug */
	font-size: 100%;
	}

ul.primary-nav li {
	position: relative;
	list-style: none;
	}

ul.primary-nav li a {
	display: block;
	text-decoration: none;
	color: #777;
	padding: 5px;
	line-height:25px;
	border: 1px solid #ccc;
	border-bottom: 0;
	}

/* Fix IE. Hide from IE Mac \*/
* html ul.primary-nav li { float: left; height: 1%; }
* html ul.primary-nav li a { height: 1%; }
/* End */

ul.primary-nav ul {
	position: absolute;
	display: none;
	left: 149px; /* Set 1px less than menu width */
	top: 0;
	}

ul.primary-nav li ul li a { /*padding: 2px 5px;*/line-height:25px; text-indent:5px; } /* Sub Menu Styles */

ul.primary-nav li:hover ul ul,
ul.primary-nav li:hover ul ul ul,
ul.primary-nav li.over ul ul,
ul.primary-nav li.over ul ul ul { display: none; } /* Hide sub-menus initially */

ul.primary-nav li:hover ul,
ul.primary-nav li li:hover ul,
ul.primary-nav li li li:hover ul,
ul.primary-nav li.over ul,
ul.primary-nav li li.over ul,
ul.primary-nav li li li.over ul { display: block; } /* The magic */

ul.primary-nav li.menuparent { background: transparent url(arrow.gif) right center no-repeat; }

ul.primary-nav li.menuparent:hover,
ul.primary-nav li.over { background-color: #f9f9f9; }

ul.primary-nav li a:hover { color: #E2144A; }
</style>


ensuite dans ton html change:

<ul id="primary-nav">

par:

<ul class="primary-nav">

[/i][/i][/i]
Merci Ilhooq pour ton code, mais après essai, le menu ne fonctionne pas : je n'ai plus le menu déroulant, seuls s'affichent les liens principaux du premier niveau.
Il doit bien y avoir une solution pourtant, mais avec le JS je suis un peu perdue, je n'ai pas l'habitude de l'utiliser...
Modifié par pixie (31 Jan 2006 - 11:23)
Merci!!! ça marche Smiley biggrin
Je ne sais pas pourquoi j'avais dû faire une erreur, autant pour moi!
En tous cas merci beaucoup, mon site avait une structure trop conséquente pour que je puisse renoncer à cette solution. Tu m'as sauvé la vie Smiley cligne
Bonjour,

Est-il possible de transformer l'exemple donné plus haut en menu horizontal?
J'ai essayé en vain et je ne sais pas par quel bout prendre la chose.
Merci d'avance
Salut,

Qu dirais-tu d'utiliser un "float" par exemple ?

J'ai fait un test ICI

Concernant le code CSS ci-dessus, je te déconseille le hack utilisé avec le height 1px (* html ul.primary-nav li a { height: 1%; }) : Le hack ne marchera plus avec IE 7, or il y a de bonnes chances que le bug qu'on essaie d'éviter ici persiste (c'est le cas sur IE7 beta2 Preview). La solution du "height" serait de toute façon mauvaise, puisque IE 7 implémentera correctement la propriété height.. De plus, cela reduit seulement l'écart, mais pas totalement, et sur IE7 bêta Preview dès que la curseur passe au dessus de l'écart, ça se referme... pas pratique !!

Le plus simple est d'utiliser un simple marge négative, seulement pour IE (en commentaire conditionnel), pour réduire complétement l'écart créé. Voir dans sur la page dont je t'ai donné le lien.

A+
Bonjour,

Ce menu est vraiment très bien. Je le fais tout en images et j'ai un problème avec Explorer Mac (je suis sur G5 OS 10.4.4), sur la page d'accueil, tout fonctionne, sur les pages suivantes où il y a une animation flash en dessous, les sous-menus clignotent. J'ai fait une version pour IE Mac car cette version ne lit pas les commentaires conditionnels. J'ai fini par trouver un script php qui ne choisisse qu'IE sans ajouter Opera.
D'autre part, Opera 8 ne lit pas la largeur comme les autres navigateurs (netscape, safari, shiira, je ne peux pas encore tester sous windows) ul { width: 686px; ne lui suffit pas, il a besoin de 14 px en plus soit une marge de 1px de chaque coté des 7 images du menu. Résultat, la dernière image est renvoyée sur une autre ligne à gauche, mais pas la couleur de fond de la barre. Si je rajoute les 14 px, c'est les autres navigateurs qui ont une couleur de fond qui dépasse à droite de la barre des menus.
Merci pour vos conseils.
A+
Bonjour,
Après différentes corrections, il me reste un problème:
Avec Explorer mac, les sous-menus déroulants clignotent lorsqu'il y a une animation flash en dessous.
Avec Opera 8, dans ce cas, les sous-menus disparaissent si l'on descend la souris dessus.
Avec Explorer, le problème disparait si l'on met un "margin-top" de taille suffisante à la div "flash", mais cela descend l'animation trop bas.
Avec Opera 8, la marge ne modifie pas le problème, mais c'est les sous-menus qui descendent!
(les z-index sont de 100 pour les menus et de 1 pour le flash)
où est l'erreur ?
Bonjour

yuzin a écrit :

où est l'erreur ?


Dans le fait de consacrer du temps à développer coûte que coûte une fonctionnalité bricolée à coups de contournements. Le temps passé à bidouiller un menu déroulant nécessairement problématique aujourd'hui n'aurait-il pas été mieux employé à faire du contenu ? A travailler sur la structure de navigation du site ? A investir dans une réflexion sur l'ergonomie ?

<edit>Amusante coquille : j'avais d'abord presque écrit Dans le fait de consacrer du temps à développer coït que coûte Smiley ravi
Smiley cligne
Modifié par Laurent Denis (07 Feb 2006 - 14:45)
Il est vrai que la place du javascript dans l'économie du désir devra bien un jour être réévaluée.

Il est vraiment surtout que toutes ces charmantes fantaisies sont bien un excellent moyen d'éviter le sujet du contenu. Sujet remarquablement absent des forums au passage.