28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous

je cherche à créer un menu incliné et déroulant ressemblant à un plan de ligne de métro, mais je ne sais pas comment m'y prendre.

Je vous joins en image ce à quoi j'aimerai que cela ressemble pour vous donner une idée.

upload/56597-menu3.png

upload/56597-menu2.png

upload/56597-menu.png

J'ai bien trouvé un possibilité avec "transform: rotate(45deg)" mais je suis loin du compte. Je suis complètement perdu. Si quelqu'un avait une idée de comment je devrai m'y prendre je lui en serais reconnaissant.

Merci d'avance.
Modifié par justing (02 Nov 2014 - 23:07)
Merci pour le tuyau, je viens de regarder le tuto sur la transformation skew.

Ca m'a pas l'air simple pour faire le menu que je veux mais je vais tenter quand même. Depuis le temps que je n'ai pas tapé un ligne de HTML et CSS, je sens que je vais en avoir pour des semaines lol
Hello,

astuce 1 : attention le skew déforme aussi le contenu, donc si tu l'appliques à un item de ton menu, le texte sera aussi déformé. donc il faut jouer avec du absolute ou relative pour positionner le bloc en trapère sous ton texte.

astuce 2 : pas besoin d'image, le trait noir peut être fait avec un "border" et la puce ronde avec border-radius:50%

t'as plus qu'à bidouiller le positionnement.
voilà un essai :


<ul class="sous-menu">
  <li>
    <a href="#">
      <span></span>
      rubrique 1
    </a>
    <div class="trapeze"></div>
  </li>
  <li>
    <a href="#">
      <span></span>
      rubrique 2
    </a>
    <div class="trapeze"></div>
  </li>
  <li>
    <a href="#">
      <span></span>
      rubrique 3
    </a>
    <div class="trapeze"></div>
  </li>
  <li>
    <a href="#">
      <span></span>
      rubrique 4
    </a>
    <div class="trapeze"></div>
  </li>
</ul>


ul.sous-menu{
	list-style: none;	/* ici on vire les puces */
}
ul.sous-menu li{ 
	width: 120px;height: 40px; /* on donne une taille fixe aux items de ton menu*/
	margin: 0; padding: 0; 		
}
ul.sous-menu li a{
	display: block;	/* on transforme le "a" en bloc pour avoir tjs la meme largeur et avoir le retour à la ligne */
	position: relative; z-index: 50; /*  en relative pour le positionner à un z index 50 */
	 width: 100%; height: 100%;	
	margin: 0; padding: 12px 10px 12px 20px;
	text-align: center;
}
ul.sous-menu li+li{ 					margin-left: 15px;} /* on décalle un peu chaque <li>. il y a surement une syntaxe plus propre que ça mais je l'ai pas en tête.*/
ul.sous-menu li+li+li{ 					margin-left: 30px;}
ul.sous-menu li+li+li+li{ 				margin-left: 45px;}
ul.sous-menu li+li+li+li+li{ 			margin-left: 60px;}
ul.sous-menu li+li+li+li+li+li{ 		margin-left: 75px;}
ul.sous-menu li+li+li+li+li+li+li{ 		margin-left: 90px;}
ul.sous-menu li+li+li+li+li+li+li+li{ 	margin-left: 105px;}
ul.sous-menu li+li+li+li+li+li+li+li+li{margin-left: 120px;}

ul.sous-menu li .trapeze{
	width: 100%;height: 100%; /* on s'assure ici qu'il fasse la même taille que le "a" et que le conteneur */
	position: relative; z-index: 40; /* ici on le positionne sous le "a" avec un z-index inférieur */
	margin-top: -40px; /* on le positionne avec -40px de hauteur vu que notre li fait 40px de haut donc on lep lace pile sous le a */
	background-color: green;
	border-left: 5px solid black; /* on gère le trait noir de la ligne de métro avec un border */
	transform: skewX(20deg); /* avec ça on transforme le rectangle en trapèze */
}
ul.sous-menu li a span{ /* avec ça tu gères ta puce noire. */
	display: block;
	width: 15px;height: 15px;
	border-radius: 50%;	
	background-color: black;
	position: absolute;
	left:0;
	margin-left: -5px;
}
ul.sous-menu li a:hover span{
	/* ici tu peux changer la couleur de ta puce quand le lien est hover*/
}



voilà, j'espère que ça t'aidera autant que ce forum a pu m'aider Smiley smile
(attention j'ai pas gérer les préfixes, tu peux en avoir besoin sur le border-radius et le skew pour que ça marche bien sur tous les nav)
a+
a+
Modifié par kalmah (07 Nov 2014 - 11:10)
Bonjour,

le skew deforme en effet , mais avec 2 valeurs opposées , l'effet du premier peut -être visuellement annulé sur le deuxieme.

Pour les 'puces', on peut se contenter d'un pseudo-element vu que l'on s’appuie déjà sur un transform (CSS3).

Pour le problème du choix de display inline-block et block; il ne se pose pas vraiment, un élément en inline-block gère très bien des enfant se comportant en block. et les float peuvent être esquivés.

Voici un autre test inline-block/block, transform et :before : http://codepen.io/gc-nomade/pen/hHeDd
Je me permet de mettre aussi celui de kalmah qui est visible ici : http://codepen.io/anon/pen/tyHuB

Ces deux test/exemple sont modifiables en ligne Smiley cligne

Cdt

<edit> les li de premiers niveau et les ul sont en inline-block. ensuite au choix, li dd deuxieme niveau ou les liens en blocks.
ul en skew, puis les lien en skew opposé/inversé.
Les fond via des gradients (image + background-position possible aussi).
...
</edit>
Modifié par gc-nomade (07 Nov 2014 - 20:17)