28173 sujets

CSS et mise en forme, CSS3

Bonjour, j'ai cherché un peu sur le net, mais je n'ai trouvé aucune solution pour réalisé des onglets imbriqués. Je joint une photo, désolé de la pietre qualité :

upload/7597-test.jpg
http://www.bete-et-mechant.com/test_alsa/test.jpg

Comme vous pouvez le voir, les onglets sont imbriqués les uns dans les autres, je ne sais pas trop comment réaliser ce menu le plus simplement et le plus correctement.

Si quelqu'un a une idée Smiley cligne .
Modifié par drakan (21 Sep 2006 - 09:37)
Bonsoir,

On peut imaginer une solution à base de marges négatives. Cela reste relativement simple et la plupart des navigateurs le comprennent. J'ai mis un exemple à cette adresse :
http://www.floatthatbox.com/divers/menuLiensImbriques/

Premièrement, on part d'une structure assez classique pour un menu, avec une liste non ordonnée :
<ul>
	<li id="item1"><a href="#">Item 1</a></li>
	<li id="item2"><a href="#">Item 2</a></li>
	<li id="item3"><a href="#">Item 3</a></li>
</ul>

Pour cet exemple, j'ai choisi pour simplifier de remplacer les textes par des images ayant toutes la même taille. Pour que la chose soit plus efficace, j'utilise aussi une seule image (voir le tuto : http://css.alsacreations.com/Tutoriels-et-articles-divers/roll-over-css-image-unique). Il est aussi possible d'utiliser de simple backgrounds avec un texte HTML non remplacé, mais ce sera plus complexe !
Sinon, voici la CSS :
ul {
	margin:0; padding:0;
	list-style:none;
}

li, li a {
	width:224px;
	float:left;
}

li a {
	padding-top:30px;
	height:0 !important; height /**/:30px;
	position:relative;/*IE*/
	overflow:hidden;
	background:url(menu.gif) no-repeat 0 0;
}

#item2 a {
	margin-left:-22px;
	background-position:-202px 0;
}
#item3 a {
	margin-left:-44px;
	background-position:-404px 0;
}

li a:hover {z-index:1;}/*Passage au 1er plan en hover*/

#item1 a:hover {background-position:0 -30px;}
#item2 a:hover {background-position:-202px -60px;}
#item3 a:hover {background-position:-404px -90px;} 

/*Clearing*/
ul:after {
	display:block;
	height:0;
	clear:both;
	visibility:hidden;
	content:".";
}

/*IE7*/
ul {display:inline-block;}
ul {display:block;}

/*IE<7*/
* html ul {height:0;}

Avant de commencer, il est important de noter le "position:relative" appliqué à "li a", pour qu'IE se comporte correctement.
On utilise donc des marges négatives, ici sur #item2 et #item3 pour que les liens viennent s'imbriquer : si aucun lien n'est survolé, on a #item3 au-dessus de #item2 lui-même au-dessus de #item1. En hover, il suffit alors de faire passer le lien survolé par dessus les autres, en affectant un simple "z-index:1". Pour le reste, il ne s'agit que de positionnement du background utilisé...

Juste un mot aussi sur la technique de remplacement d'image utilisée ici et qui nécessite un hack pour fonctionner sur IE5, d'où le très laid :
height:0 !important; height /**/:30px;

Il peut être bon de séparer ces hacks utiles à IE dans une autre feuille de style...

Un petit mot enfin sur la partie "clearing" : bien que non nécessaire sur ce simple exemple, ce serait probablement utile sur un vrai site pour couper les floattants (li et a). La méthode utilisé ici est le "easy clearing", qui permet de ne pas utiliser de balisage supplémentaire, et dont une description détaillée est donnée sur http://www.positioniseverything.net/easyclearing.html . C'est relativement complexe (notamment car il faut prendre en compte les manques d'IE et ses comprtements différents suivant les versions), mais très pratique...

Pour terminer, ce menu semble fonctionner sur IE5+, Firefox1+, Safari1.3+ et Opera9
Re bonjour,

Ok mais pourquoi faire compliqué quand c'est simple ...

upload/5854-testbouton.gif


<!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></title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">



<style type="text/css">

<!--
/* CSS issu des tutoriels  www.alsacreations.com/articles  */
body {margin: 10px; padding: 0; font: 14px Verdana, sans-serif;}

#fond{
width: 500px;
height: 17px;
background: #fdfe6c;
clear:both;
margin:0;
padding: 0;
}

ul {
list-style-type: none;
width: 100%; /* précision pour Opera */	
margin:0;
margin-left: 50px;
padding: 0;
}

.menu li {
float: left;
margin-left:0;
}

.menu a {

width: 105px;
height: 17px;
display: block;
text-align: center;
background-image: url(test_bouton.gif);
background-position: 0 17px ; 
text-decoration: none;
margin-left: -12px;
color: #fff;

}

.menu a:hover {

background-image: url(test_bouton.gif);
background-position: 0 0 ;
color: #000; 
}

</style>

</head>
<body>


  <ul class="menu">
    <li><a href="">Menu 1</a></li>
	<li><a href="">Menu 2</a></li>
	<li><a href="">Menu 3</a></li>
	<li><a href="">Menu 4</a></li>
  </ul>
<div id="fond"></div>

</body>

</html>


Côté graphisme, je ne suis pas foulé ... Mais c'est pour le principe
Modifié par ghost (21 Sep 2006 - 02:38)
ghost,

Les 2 solutions sont assez proches en fait. Le problème principal avec ton exemple est que cela ne fonctionne pas sous IE. Un simple "position:relative" sur ".menu a" permettra à IE6 de se comporter correctement, mais pour IE5 cela ne suffit pas. Autre problème ennuyeux : lorsque l'on redimensionne la police, on ne peut plus lire grand chose vu que les onglets ont une taille fixe ! Pour ce genre de graphisme, le plus simple est encore de prévoir des images en remplacement total du texte... Sinon, il est certainement possible avec des navigateurs corrects de s'en sortir avec des onglets imbriqués flexibles, mais sur IE ce sera une autre histoire (un tout petit peu de javascript permettrait de régler facilement l'affaire, tout en permettant une dégradation tout à fait correcte).
En ce qui concerne la partie réellement complexe, à savoir le "easy clearing", c'est très pratique pour disposer à nouveau de la possibilité de mettre des margins/paddings sur l'élément contenant les flottants ou le suivant, sans avoir à ajouter un "clearer" dans le HTML. Actuellement, si tu veux mettre une marge inférieure sur ton menu, ce sera difficile... idem si tu veux mettre une marge supérieure sur ton div "fond".