Bonjour,
je suis en train de refaire mon portfolio, et j'avais l'idée de faire un menu avec différents triangles qui se superposent.

Je vous laisse voir ce que ça donne graphiquement :
HORS LIGNE

Donc je crée mes différents triangles en css, j'entame la partie javascript pour animer mon menu. Mais quelle fut ma surprise quand j'ai vu que les navigateurs interprétaient mes triangles comme des carrés... Donc avec le jquery, j'ai bien réussi à sélectionner mes triangles, mais vu que les triangles sont interprétés comme des carrés et bien quand je clique sur un des triangles et bien c'est toujours celui du dessus qui prône. Bon c'est pas évident à expliquer par écrit, donc je vous laisse tester sur mon lien précédent. Voyez avec firebug ce que ça donne niveau superposition...

Donc j'aimerais savoir si vous connaissiez une solution à ce problème ?

Merci d'avance et bonne soirée =)
Modifié par ManiManu (04 Jul 2015 - 12:42)
Ta forme est triangulaire mais tu utilises des DIV pour formater l'ensemble, un DIV par triangle. C'est la raison, car les DIV seront quand même rectangulaire. Donne un border à tes DIV et tu verras bien.

..
Modifié par zardoz (10 Aug 2011 - 22:40)
 
<div id="menu">
   <div id="triangle_rouge"></div>
   <div id="triangle_orange"></div>
   <div id="triangle_jaune"></div>
   <div id="triangle_vert"></div>
   <div id="triangle_bleu"></div>
   <div id="triangle_violet"></div>
</div>



#triangle_rouge{
   width: 0;
   height: 0;
   border-left: 100px solid transparent;
   border-right: 100px solid transparent;
   border-bottom: 160px solid #f01c35;
   margin: auto;
   z-index: 6;
   position: absolute;
   top:130px;
   left: 40%;
}


Comme tu peux le voir mes triangles sont fait à partir de css, donc je ne vois pas comment me séparer de la div qui a pour id un triangle de couleur. Peux-tu m'éclairer ? Smiley smile
J'ai charger ton CSS dans mon logiciel
Je vois que width et height sont : 0.

Ton #menu n'a aucune instruction. Donc inutile. Cependant je n'ai pas charger ton script et je crois qu'il serait important d'avoir ton script JS.


$(document).ready(function(){
   
    var lesTriangles = $("#menu").children();
    lesTriangles.click(varierOpacite);


function varierOpacite(){
    
    var texte = $(this).attr("id");
    alert(texte);
}


});


C'est celui-ci ? - Là je comprend pourquoi tu n'as pas instruit #menu.
C'est sûr qu'une boucle sera essentielle. Pour identifier correctement tes triangles. Il est mieux de parcourir par itération.

Ou »

Il y a des propriétés (event.target) en Flash, qui permet de d'agir directement sur l'objet pointer, mais je ne connais pas assez les évenements en JS pour te confirmer. Je sais que le DOM est le même, donc possible avec les évènements en JS.

..
Modifié par zardoz (10 Aug 2011 - 23:20)
Pour ce qui est des width et heigth à 0, j'ai suivi une méthode pour créer des triangles en css.
Mon code js, c'est bien celui que tu as.

Après aurais-tu une piste pour résoudre mon problème ? Car là, ça me dépasse Smiley ohwell

Bonne soirée à toi
Oui les évènements en JS suivant le DOM.
Je l'ai expliquer sur le message du dessus.

PS : informe toi sur la propriété « target » en JS, qui devrait exister. (event.target), qui a la particularité de reconnaitre l'objet visuel cliquer.

..
Modifié par zardoz (10 Aug 2011 - 23:25)
Un tuto de base sur Alsa : Évènement en JS

Et un autre sur MDN. Intéressant.

Je le connais très bien en Flash. Par contre intéresse toi aux évènements en JS. Ça ouvre des portes sur l'animation en JS, et tout ce qui est interaction avec l'utilisateur.

Un exemple fictif » cette exemple n'est pas adapter à ta suituation.


function avertissement (e)
{
  e.target.id = alerte (texte);	
}
triangleCouleur.addEventListener ('click', avertissement, false);


Ça doit aussi être possible en JQuery event.target. Les informations sont là. Les évènements.

Je te suggère fortement de t'intéresser aux évènements en JS comme JQuery.

..
Modifié par zardoz (11 Aug 2011 - 00:00)
J'ai pas mal vu les évènements en cours. Je vais me replonger la dedans. En tout cas merci beaucoup pour ton aide. Je te retiens au courant de mon avancement.

Bonne soirée Smiley cligne
Nan ba écoute, j'ai essayé la méthode du event.target comme expliqué sur la doc jquery, mais ça ne fonctionne pas. Mes triangles sont toujours considérés comme des carrés !! Smiley bawling

J'abandonne pour ce soir ! ^^
Salut »

Il s'agit donc de l'enveloppe de la forme triangulaire qui sera toujours carré, et ce peut importe la forme. Cependant cette enveloppe n'est pas supposée nuire au bon fonctionnement du programme évènementiel. J'en ai fait longuement l'expérience en Flash et c'est ainsi.

Il est mieux d'approcher (étudier) les évènements via Javascript plutôt que JQuery. Le problème avec l'utilisation de JQuery, c'est qu'il n'est pas transparent au point de saisir le fonctionnement du DOM. N'oubli pas ici que JQuery est une implémentation de méthodes et de propriétés via Javascript d'où son extension (*.js).

Pour une meilleur compréhension du DOM évènementiel, il faut toujours l'approcher via Javascript. JQuery deviendra plus claire de lui-même, par la suite.

Smiley smile

..
Hey !

Ba justement, je suis en train de testé avec map et area. J'ai bien ma zone cliquable triangulaire, mais j'ai toujours les contours carrés de mes triangles Smiley bawling

HORS LIGNE


<div id="menu">
            <div id="triangle_rouge">
              <img src="img/rouge.png" alt="rouge" border="0" usemap="#Map">
                <map name="Map">
               
                  <area shape="poly" coords="107,1,0,186,217,188" href="#" alt="rouge">
                </map>
             
            </div>
       	    <div id="triangle_orange"><img src="img/orange.png" alt="orange" width="217" height="187" border="0" usemap="#Map2">
              <map name="Map2">
                <area shape="poly" coords="108,1,215,185,1,186" href="#" alt="orange">
              </map>
       	    </div>
            <div id="triangle_jaune"><img src="img/jaune.png" alt="jaune" width="217" height="187" border="0" usemap="#Map3">
            <map name="Map3">
              <area shape="poly" coords="108,1,0,187,215,186" href="#" alt="jaune">
            </map>
           </div>
           <div id="triangle_vert"><img src="img/vert.png" alt="vert" width="217" height="187" border="0" usemap="#Map4">
            <map name="Map4">
             <area shape="poly" coords="108,1,-2,188,215,186" href="#">
            </map>
           </div>
            <div id="triangle_bleu"><img src="img/bleu.png" alt="bleu" width="217" height="187" border="0" usemap="#Map5">
              <map name="Map5">
                <area shape="poly" coords="216,186,108,1,2,186" href="#" alt="bleu">
              </map>
            </div>
            <div id="triangle_violet"><img src="img/violet.png" alt="violet" width="217" height="187" border="0" usemap="#Map6">
              <map name="Map6">
                <area shape="poly" coords="215,186,108,1,0,186" href="#" alt="violet">
              </map>
            </div>
</div>



#triangle_rouge{
	
	margin: auto;
	
	position: absolute;
	top:130px;
	left: 40%;
        
}
#triangle_orange{
 
   margin: auto;
   
   position: absolute;
   top:120px;
   left: 42%;
}
#triangle_jaune{
	
	margin: auto;
	
	position: absolute;
	top:110px;
	left: 44%;
}
#triangle_vert{
 
   
   position: absolute;
   top:100px;
   left: 46%;
}
#triangle_bleu{
   
  
   margin: auto;
  
   position: absolute;
   top:90px;
   left: 48%;
}
#triangle_violet{
 
   margin: auto;
  
   position: absolute;
   top:80px;
   left: 50%;
}

Modifié par ManiManu (04 Jul 2015 - 12:42)
L'idée avec les area map, c'est de n'avoir qu'une seule image + une seule balise map qui regroupe toute tes area. Comme ça, tu dis adieu au positionnement absolu qui va forcément de te poser un souci à un moment ou un autre.
Modifié par Florian_R (11 Aug 2011 - 11:26)
J'aimerais bien, mais j'ai besoin de mes triangles en entier Smiley confus , car l'idée c'est que quand j'en survole un, il se superpose par rapport aux autres
Ah oui ! Je n'y avais pas pensé !! Je pense que ça devrait marcher du coup Smiley smile . J'essai ça dans la journée. Merci

EDIT :
j'ai fais une seule image et quand je survole une bout de triangle, il s'affiche à l'aide de jquery. Mais le soucis reviens car le triangle que je fais apparaitre est considéré comme un carré... Je m'arrache les cheveux !

HORS LIGNE
Modifié par ManiManu (04 Jul 2015 - 12:42)
Bonjour,

idée intéressante

Fichier triangle.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <title>Menu triangulaire</title>
  <link href="triangle.css" rel="stylesheet" type="text/css" />
</head>
<body>
	<div id="triangle">
		<img alt="triangle violet" src="images/violet.png"/>
		<img alt="triangle bleu" src="images/bleu.png"/>
		<img alt="triangle vert" src="images/vert.png"/>
		<img alt="triangle jaune" src="images/jaune.png"/>
		<img alt="triangle orange" src="images/orange.png"/>
		<img alt="triangle rouge" src="images/rouge.png"/>
	</div>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
	<script type="text/javascript" src="triangle.js"></script>
</body>
</html>


Fichier triangle.css dans le même répertoire
body {
	background:black
}

div#triangle {
	height: 275px;
	margin:auto;
	width: 382px
}

div#triangle img {
	position:absolute;
}


Fichier triangle.js dans le même répertoire
$(function(){
    // On peut accéder aux éléments.
    
    /**
     * Abscisse de la souris par rapport à la div#triangle
     *
     * @return entier
     */
    function x(e) {
		return e.pageX - $('#triangle').position().left;
    }
    
    /**
     * Ordonnée de la souris par rapport à la div#triangle
     *
     * @return entier
     */
    function y(e) {
		return e.pageY - $('#triangle').position().top;
	}
	
	/**
	 * Retourne vrai si le point (x, y) est à gauche de la droite passant par les points (rx1, ry1), (rx2, ry2)
	 * 
	 * @param x
	 * @param y
	 * @param rx1
	 * @param ry1
	 * @param rx2
	 * @param ry2
	 * @return booléen
	 */
	function aGaucheDe(x, y, rx1, ry1, rx2, ry2) {
		return (rx2 - rx1) * (y - ry1) - (x - rx1) * (ry2 - ry1) > 0;
	}
	
	/**
	 * Retourne vrai si le point (x, y) est à droite de la droite passant par les points (rx1, ry1), (rx2, ry2) ou appartient à cette droite.
	 * 
	 * @param x
	 * @param y
	 * @param rx1
	 * @param ry1
	 * @param rx2
	 * @param ry2
	 * @return booléen
	 */
	function aDroiteDe(x, y, rx1, ry1, rx2, ry2) {
		return !aGaucheDe(x, y, rx1, ry1, rx2, ry2);
	}
	
	/**
	 * Test si le point de coordonnées (x, y) appartient au triangle équilatéral dont le sommet est (sommetTriangleX, sommetTriangleY), dont la longueur des côtés est cote, et dont le côté opposé au sommet est horizontal.
	 * 
	 * @param x abscisse du point
	 * @param y ordonée du point
	 * @param sommetTriangleX abscisse du sommet
	 * @param sommetTriangleY ordonnée du sommet
	 * @param cote longueur du côté
	 * @return booléen
	 */
	function appartientTriangle(x, y, sommetTriangleX, sommetTriangleY, cote) {
		var base1X = sommetTriangleX - cote / 2, base1Y = sommetTriangleY + cote * Math.sqrt(3) / 2 /* sin(&#960;/3) */, base2X = sommetTriangleX + cote / 2, base2Y = base1Y;
		return ((y < base1Y) /* Au-dessus de la base */
			&& aGaucheDe(x, y, sommetTriangleX, sommetTriangleY, base2X, base2Y)
			&& aDroiteDe(x, y, sommetTriangleX, sommetTriangleY, base1X, base1Y));
	}
	
	/**
	 * Retourne vrai si la souris survole le nième triangle
	 * 
	 * @param e
	 * @param n 0=rouge, 1=orange etc…
	 * @return booléen
	 */
	function sourisSurvoleNiemeTriangle(e, n) {
		var tabSommets = [[109, 89], [145, 68], [178, 49], [214, 33], [245, 16], [273, 3]];
		return appartientTriangle(x(e), y(e), tabSommets[n][0], tabSommets[n][1], 215);
	}

	var triangleAuPremierPlan = 0, nomTriangles = ["rouge", "orange", "jaune", "vert", "bleu", "violet"], zIndex = 1;
	$('#triangle').mousemove(function(e) {
		if(sourisSurvoleNiemeTriangle(e, triangleAuPremierPlan) === false) {
			for (i = 0; i < nomTriangles.length; i += 1) {
				if (sourisSurvoleNiemeTriangle(e, i)) {
					triangleAuPremierPlan = i;
					$('#triangle>img:eq(' + (nomTriangles.length - i - 1) + ')').css('z-index', zIndex++);
					break;
				}
			}
		}
	});
	
	
});


et 6 images dans un sous-répertoire images (clic droit sur les images enregistrer sous. Il faudra enlever les préfixes «21414-» qui ont été rajoutés quand j’ai téléchargé les images vers le serveur d’alsacréation)
upload/21414-rouge.png upload/21414-orange.png upload/21414-jaune.png upload/21414-vert.png upload/21414-bleu.png upload/21414-violet.png

Testé sous ff4 et ie7.
Modifié par adrien881 (11 Aug 2011 - 19:01)
Alors là Smiley eek

ça fonctionne super bien !
Le soucis c'est que je ne comprends pas trop les fonctions dans le fichier JS. J'ai pas trop la logique mathématique donc pour moi c'est un peu du chinois.

Je vais étudier ce code pour en comprendre le fonctionnement. Je n'ai pas envie d'utiliser sur mon site quelque chose que je ne maîtrise pas.

Merci à tous pour vos réponses.