Est-il possible de régler le flottement sur http://jsfiddle.net/2AXhR/ afin que le triangle correct soit activé sur le vol stationnaire au lieu de celui-ci parfois adjacent? Parfois, le mauvais triangle est activé parce que la zone de délimitation de chaque élément triangulaire n'est pas en fait un triangle, mais un rectangle, alors même si le curseur peut sembler être au-dessus d'un triangle, il est en fait un autre qui chevauche et a un Indice z plus élevé.
<style type="text/css"> .t { position:relative; top:55px; left:5px; } .t div { position:absolute; width: 0px; height: 0px; border-style: solid; border-width: 0 100px 173.2px 100px; border-color: transparent transparent #0079c5 transparent; transition:all 1s; -webkit-transition:all 1s; -moz-transition:all 1s; cursor:pointer; transform-origin:200px 173px; -webkit-transform-origin:200px 173px; -moz-transform-origin:200px 173px; z-index:10; } .t div:hover { z-index:20; border-color: transparent transparent #009cff transparent; } .t div:nth-child(1) { transform:rotate(30deg); -webkit-transform:rotate(30deg); -moz-transform:rotate(30deg); } .t div:nth-child(1):hover { transform:rotate(30deg) translate(-15%, -10%); -webkit-transform:rotate(30deg) translate(-15%, -10%); -moz-transform:rotate(30deg) translate(-15%, -10%); } .t div:nth-child(2) { transform:rotate(90deg); -webkit-transform:rotate(90deg); -moz-transform:rotate(90deg); } .t div:nth-child(2):hover { transform:rotate(90deg) translate(-15%, -10%); -webkit-transform:rotate(90deg) translate(-15%, -10%); -moz-transform:rotate(90deg) translate(-15%, -10%); } .t div:nth-child(3) { transform:rotate(150deg); -webkit-transform:rotate(150deg); -moz-transform:rotate(150deg); } .t div:nth-child(3):hover { transform:rotate(150deg) translate(-15%, -10%); -webkit-transform:rotate(150deg) translate(-15%, -10%); -moz-transform:rotate(150deg) translate(-15%, -10%); } .t div:nth-child(4) { transform:rotate(210deg); -webkit-transform:rotate(210deg); -moz-transform:rotate(210deg); } .t div:nth-child(4):hover { transform:rotate(210deg) translate(-15%, -10%); -webkit-transform:rotate(210deg) translate(-15%, -10%); -moz-transform:rotate(210deg) translate(-15%, -10%); } .t div:nth-child(5) { transform:rotate(270deg); -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); } .t div:nth-child(5):hover { transform:rotate(270deg) translate(-15%, -10%); -webkit-transform:rotate(270deg) translate(-15%, -10%); -moz-transform:rotate(270deg) translate(-15%, -10%); } .t div:nth-child(6) { transform:rotate(330deg); -webkit-transform:rotate(330deg); -moz-transform:rotate(330deg); } </style> <div class="t"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div>
Problèmes corrigés:
overflow:hidden;
La propriété et les événements flottants ont été déclenchés en dehors des triangles visibles. La description :
Cette approche utilise skewX()
pour créer les triangles. Vous n'avez pas besoin de «truc de bordure» pour les créer et vous n'avez pas besoin de la propriété de overflow
non plus. Avec cette technique, il n'y a pas d'éléments chevauchants pour que les événements de survol ne puissent pas déclencher deux éléments en même temps.
Un second div divise la moitié de l'élément biaisé pour créer le triangle et est traduit avec celui-ci en survolant le sélecteur +
CSS.
—– DEMO V2 —–
Marquage:
<div class="t"> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> <div class="wrap"> <div class="triangle"></div> <div class="mask"></div> </div> </div>
CSS:
.t div{ position:absolute; top:0; left:0; transform-origin:0 0; -ms-transform-origin:0 0; -webkit-transform-origin:0 0; transition:all 1s; -webkit-transition:all 1s; -moz-transition:all 1s; } .t .wrap{ top:50%; left:50%; -ms-transform: skewX(30deg); -webkit-transform: skewX(30deg); transform: skewX(30deg); } .t .wrap .triangle { position:relative; width: 200px; height: 173px; background-color: #0079c5; cursor:pointer; z-index:1; } .t .wrap .mask{ width:100%; height:115.5%; background-color: #fff; left:100%; z-index:2; -ms-transform: skewX(-30deg) rotate(30deg); -webkit-transform: skewX(-30deg) rotate(30deg); transform: skewX(-30deg) rotate(30deg); } .t .wrap .triangle:hover{ background-color: #009cff; transform: translate(10%, 10%); -webkit-transform: translate(10%, 10%); -moz-transform: translate(10%, 10%); } .t .triangle:hover + .mask{ -ms-transform: skewX(-30deg) rotate(30deg) translate(17.5%, 0); -webkit-transform: skewX(-30deg) rotate(30deg) translate(17.5%, 0); transform: skewX(-30deg) rotate(30deg) translate(17.5%, 0); } .t > div:nth-child(2){ -ms-transform: rotate(60deg) skewX(30deg); -webkit-transform: rotate(60deg) skewX(30deg); transform: rotate(60deg) skewX(30deg); } .t > div:nth-child(3){ -ms-transform: rotate(120deg) skewX(30deg); -webkit-transform: rotate(120deg) skewX(30deg); transform: rotate(120deg) skewX(30deg); } .t > div:nth-child(4){ -ms-transform: rotate(-60deg) skewX(30deg); -webkit-transform: rotate(-60deg) skewX(30deg); transform: rotate(-60deg) skewX(30deg); } .t > div:nth-child(5){ -ms-transform: rotate(-120deg) skewX(30deg); -webkit-transform: rotate(-120deg) skewX(30deg); transform: rotate(-120deg) skewX(30deg); } .t > div:nth-child(6){ -ms-transform: rotate(-180deg) skewX(30deg); -webkit-transform: rotate(-180deg) skewX(30deg); transform: rotate(-180deg) skewX(30deg); }
Vesrion 1 (original): violon pour démo V1
Voici une approche complètement différente. Cela évite complètement les problèmes de limites.
Il convient de noter que cette approche est relativement limitée quand il s'agit de réaliser l'effet de survol que vous avez mis en place. Je suis actuellement à la recherche d'alternatives.
EXEMPLE ICI – Fonctionne dans FF / Chrome, il échoue dans IE11.
HTML
<div class="t"> <div class="clip"> <div class="triangle"></div> </div> <div class="clip"> <div class="triangle"></div> </div> <div class="clip"> <div class="triangle"></div> </div> <div class="clip"> <div class="triangle"></div> </div> <div class="clip"> <div class="triangle"></div> </div> <div class="clip"> <div class="triangle"></div> </div> </div>
CSS
.t { width:500px; height:500px; position:relative; } .t > .clip { overflow: hidden; position: absolute; width: 50%; height: 50%; -webkit-transform-origin: 100% 100%; } .t > .clip:first-child { -webkit-transform: rotate(60deg) skewY(30deg); } .t > .clip:nth-child(2) { -webkit-transform: rotate(120deg) skewY(30deg); } .t > .clip:nth-child(3) { -webkit-transform: rotate(180deg) skewY(30deg); } .t > .clip:nth-child(4) { -webkit-transform: rotate(240deg) skewY(30deg); } .t > .clip:nth-child(5) { -webkit-transform: rotate(300deg) skewY(30deg); } .t > .clip:nth-child(6) { -webkit-transform: rotate(360deg) skewY(30deg); } .triangle { width: 200%; height: 200%; -webkit-transform: skewY(-42deg) skewX(-20deg) rotate(-15.5deg); background:#0079c5; } .triangle:hover { background:#009cff; }
J'ai réellement résolu le problème seul. À l'aide de JavaScript, j'ai configuré un événement de survoltage pour chaque triangle: Sur le vol stationnaire, j'ai configuré son propre index z à 20, l'index z du triangle suivant à 21 et tout le reste de l'index z de triangles à 19.
Le code ressemble à ceci:
self.e.find(".t div").hover( function() { $(this).css({ 'z-index': 20, 'border-color': "transparent transparent "+self.params['colorSelected']+" transparent" }); if($(this).next().length) { $(this).next().css("z-index", 21); } else { self.e.find(".t div").first().css("z-index", 21); } }, function() { self.e.find(".t div").css({ 'z-index': 19, 'border-color': "transparent transparent "+self.params['color']+" transparent" }); });
La raison pour laquelle cela fonctionne, c'est parce que tous les triangles sont en ordre à partir de la partie supérieure gauche dans le sens des aiguilles d'une montre. Chaque triangle chevauche de manière incorrecte sa prochaine fratrie, alors qu'en amener la prochaine fratrie vers l'avant dans le plan z, elle permet de définir correctement les triangles.
Comparez ces deux JSFiddles, et vous verrez la différence dans le comportement de survoltage:
Non résolu: http://jsfiddle.net/2AXhR/
Résolu: http://jsfiddle.net/2AXhR/1/