Jquery pour un menu circulaire
gintoxic
Messages postés
524
Date d'inscription
Statut
Membre
Dernière intervention
-
prosthetiks Messages postés 1189 Date d'inscription Statut Membre Dernière intervention -
prosthetiks Messages postés 1189 Date d'inscription Statut Membre Dernière intervention -
bonjour,
je cherche a faire un menu circulaire selon ces criteres :
- chaque élément s'agrandirait au passage de la souris (hover)
- l'élément selectionné se placerait au milieu du cercle, agrandit, donc laissant les autres à leur place (peut-etre avec une opacité réduite.
- lorsque l'élément n'est plus survolé il retourne à sa place
autre cas de figure :
- le cercle est immobile
- il fait une rotation au survol de la souris d'un des élément pour que ce dernier se place dans un bloc (div) situé au sommet (dans la meme idée que le barrillet d'un revolver) et s'agrandit a la taille de la div.
bref que d'idée, et je ne pense pas obtenir de script ici mais simplement avancer avec votre aide si possible
je débute en Jquery mais j'adore cette écriture de script plutot simple
voici ce que j'ai réussi à faire pour le moment et j'avoue etre bloqué car je voudrais pour le moment pouvoir désolidariser chaque <li> des autres sur l'axe Z.. mais je ne comprends pas bien déjà pourquoi le menu est divisé en 2 partie (gauche et droite.
http://symposion.fr/test_menu
je vous pose le code qui tient en une page :
Si Dieu a créé l'homme, qui a créé Dieu, l'homme non ?
je cherche a faire un menu circulaire selon ces criteres :
- chaque élément s'agrandirait au passage de la souris (hover)
- l'élément selectionné se placerait au milieu du cercle, agrandit, donc laissant les autres à leur place (peut-etre avec une opacité réduite.
- lorsque l'élément n'est plus survolé il retourne à sa place
autre cas de figure :
- le cercle est immobile
- il fait une rotation au survol de la souris d'un des élément pour que ce dernier se place dans un bloc (div) situé au sommet (dans la meme idée que le barrillet d'un revolver) et s'agrandit a la taille de la div.
bref que d'idée, et je ne pense pas obtenir de script ici mais simplement avancer avec votre aide si possible
je débute en Jquery mais j'adore cette écriture de script plutot simple
voici ce que j'ai réussi à faire pour le moment et j'avoue etre bloqué car je voudrais pour le moment pouvoir désolidariser chaque <li> des autres sur l'axe Z.. mais je ne comprends pas bien déjà pourquoi le menu est divisé en 2 partie (gauche et droite.
http://symposion.fr/test_menu
je vous pose le code qui tient en une page :
<!doctype html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>Document</title> <style> ul{ display:block; position:absolute; left:40%; top:20%; z-index:0; } .item{ display: block; background:green; width: 70px; height:50px; margin-top:50px; z-index:0; } .item2{ margin-left:-110px; z-index: 0 } .item3{ margin-left:-140px; z-index: 0 } .item4{ margin-left:-110px; z-index: 0 } .item5{ margin-left:110px; margin-top:-250px; z-index: 0 } .item6{ margin-left:140px; z-index: 0 } .item7{ margin-left:110px; z-index: 0 } .item8{ z-index: 0 /*margin-left:100px;*/ } </style> <script type="text/javascript" src="scripts_js/jquery.js"></script> </head> <body> <SCRIPT> $(document).ready(function(){ $('.item').hover(function(event){ if(event.target == this){ $(this).css({'width':'210px', 'height': '150px', 'z-index' : '10', }); } }); $('.item').mouseout(function(event){ $(this).css({'width':'70px', 'height':'50px', 'z-index':'0'}) }); }); </SCRIPT> <ul class="menu"> <li class="item item1">bla bla bla</li> <li class="item item2">bla bla bla</li> <li class="item item3">bla bla bla</li> <li class="item item4">bla bla bla</li> <li class="item item5">bla bla bla</li> <li class="item item6">bla bla bla</li> <li class="item item7">bla bla bla</li> <li class="item item8">bla bla bla</li> </ul> </body> </html>
Si Dieu a créé l'homme, qui a créé Dieu, l'homme non ?
A voir également:
- Jquery pour un menu circulaire
- Menu déroulant excel - Guide
- Canon quick menu - Télécharger - Utilitaires
- Windows 11 menu contextuel classique - Guide
- Windows 11 menu démarrer classique - Guide
- Réinitialiser menu démarrer windows 10 - Guide
6 réponses
bon j'ai réussi a régler le probleme en les "divant" et en les mettant en position : absolute.
j'ai appliqué une animation Jquery qui les centre au survaol mais là maintenant je bloc sur le résultat qui ne veut pas faire comme je voudrais :
je désire qu'apres l'anim, ils reviennent chacun à leur place initial, c'est adire inverser l'animation ou l'annuler...
quelqu'un saurait comment je peux annuler cette anim en créant une anim inverse ?
merci par avance
j'ai appliqué une animation Jquery qui les centre au survaol mais là maintenant je bloc sur le résultat qui ne veut pas faire comme je voudrais :
je désire qu'apres l'anim, ils reviennent chacun à leur place initial, c'est adire inverser l'animation ou l'annuler...
quelqu'un saurait comment je peux annuler cette anim en créant une anim inverse ?
merci par avance
Je me mets dessus, le problème m'intéresse, du coup je vais le coder. Je partage mon résultat tout à l'heure
ah oki... tu pourras expliqure pour les apprentis comme moi stp (je n'aime pas qu'avoir un resultat, j'aime surtout comprendre pour savoir créer par la suite)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu peux déjà jeter un oeil là dessus: (J'ai pas encore commenté ;))
<html> <head> <title></title> <style type="text/css"> .point{ position: absolute; background-color: #999; border-radius: 100px; display: block; } nav{ display: block; width: 200px; height: 200px; border: #333 solid 20px; border-radius: 200px; position: absolute; left: 200px; height: 200px; } </style> </head> <body> <div id="menuContainer"> <ul id="main_nav"> <li><a href="#link1"></a></li> <li><a href="#link1"></a></li> <li><a href="#link1"></a></li> <li><a href="#link1"></a></li> <li><a href="#link1"></a></li> <li><a href="#link1"></a></li> </ul> </div> <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script type="text/javascript"> var roundedMenu = { params: { radius: 100, start_angle: 0, pointSize: 30 }, // store the center point default position lastPos: {}, /*Dont edit*/ menuEl: null, angle: null, totalItems: 0, ori_x: null, ori_y: null, RT: null, // RotateTimer _initialize: function(){ var me = this; var $menuElements = $('ul#main_nav a'); var $menuEl = $('<nav></nav>'); $('body').append($menuEl); me.totalItems = $menuElements.length; me.angle = me.nEls(me.totalItems); var i = 0; $.each($menuElements, function(key, value){ me.ori_x = me.params.radius - (me.params.pointSize/2); me.ori_y = me.params.radius - (me.params.pointSize/2); var k = i%me.totalItems; var $menuEntry = $(value); var x = me.ori_x + Math.cos(me.angle * k + me.params.start_angle) * me.params.radius; var y = me.ori_y + Math.sin(me.angle * k + me.params.start_angle) * me.params.radius; $($menuEntry).css('left', x).css('top', y).css('width', me.params.pointSize).css('height', me.params.pointSize).addClass('point'); $menuEl.append($menuEntry); i++; }); $('ul#main_nav').remove(); this.setListeners(); }, setListeners: function(){ var me = this; $('nav a').mouseenter(function(){ // Centrer link if($('nav a.centred')){ $('nav a.centred').animate({ left: me.lastPos.left, top: me.lastPos.top, width: me.params.pointSize, height: me.params.pointSize }); } $('nav a').removeClass('centred'); var center = me.params.radius - (me.params.radius /2); $(this).addClass('centred'); me.lastPos.left = $(this).css('left'); me.lastPos.top = $(this).css('top'); $(this).animate({ left: center, top: center, width: me.params.radius, height: me.params.radius }, 500); }); }, nEls: function(n){ return Math.PI * 2 / n; } } roundedMenu._initialize(); </script> </body> </html>
Petite V2
<html> <head> <title></title> <style type="text/css"> body{ background: rgb(205,235,142); /* Old browsers */ background: -moz-linear-gradient(top, rgba(205,235,142,1) 0%, rgba(165,201,86,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(205,235,142,1)), color-stop(100%,rgba(165,201,86,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(205,235,142,1) 0%,rgba(165,201,86,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(205,235,142,1) 0%,rgba(165,201,86,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, rgba(205,235,142,1) 0%,rgba(165,201,86,1) 100%); /* IE10+ */ background: linear-gradient(to bottom, rgba(205,235,142,1) 0%,rgba(165,201,86,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cdeb8e', endColorstr='#a5c956',GradientType=0 ); /* IE6-9 */ } .point{ transition: all linear .3s; position: absolute; background-color: #888; border-radius: 100px; display: block; transform: scale(1,1); -ms-transform: scale(1,1); /* IE 9 */ -webkit-transform: scale(1,1); font-size: 7pt; text-align: center; line-height: 40px; background: rgb(201,222,150); /* Old browsers */ background: -moz-radial-gradient(center, ellipse cover, rgba(201,222,150,1) 0%, rgba(138,182,107,1) 44%, rgba(57,130,53,1) 100%); /* FF3.6+ */ background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(201,222,150,1)), color-stop(44%,rgba(138,182,107,1)), color-stop(100%,rgba(57,130,53,1))); /* Chrome,Safari4+ */ background: -webkit-radial-gradient(center, ellipse cover, rgba(201,222,150,1) 0%,rgba(138,182,107,1) 44%,rgba(57,130,53,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-radial-gradient(center, ellipse cover, rgba(201,222,150,1) 0%,rgba(138,182,107,1) 44%,rgba(57,130,53,1) 100%); /* Opera 12+ */ background: -ms-radial-gradient(center, ellipse cover, rgba(201,222,150,1) 0%,rgba(138,182,107,1) 44%,rgba(57,130,53,1) 100%); /* IE10+ */ background: radial-gradient(ellipse at center, rgba(201,222,150,1) 0%,rgba(138,182,107,1) 44%,rgba(57,130,53,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c9de96', endColorstr='#398235',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ color: white; text-decoration:none; box-shadow: 0 0px 5px rgba(0,0,0,.8); border:#fff solid 1px; opacity: .7; } nav{ display: block; width: 200px; height: 200px; border: orange solid 10px; border-radius: 200px; position: absolute; left: 200px; height: 200px; box-shadow: inset 0 0 10px black; } .centred{ z-index: 999; transform: scale(4,4); -ms-transform: scale(4,4); /* IE 9 */ -webkit-transform: scale(4,4); /* Safari and Chrome */ box-shadow: 0 0px 20px rgba(0,0,0,.5); opacity:.9; } </style> </head> <body> <div id="menuContainer"> <ul id="main_nav"> <li><a href="#link1">Lorem</a></li> <li><a href="#link1">Ipsum</a></li> <li><a href="#link1">Dolor</a></li> <li><a href="#link1">Sit</a></li> <li><a href="#link1">Amet</a></li> <li><a href="#link1">:)</a></li> </ul> </div> <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script type="text/javascript"> var roundedMenu = { params: { radius: 100, start_angle: 0, pointSize: 40 }, // store the center point default position lastPos: {}, /*Dont edit*/ menuEl: null, angle: null, totalItems: 0, ori_x: null, ori_y: null, RT: null, // RotateTimer // Rotations currentR: 0, _initialize: function(){ var me = this; var $menuElements = $('ul#main_nav a'); var $menuEl = $('<nav></nav>'); $('body').append($menuEl); me.totalItems = $menuElements.length; me.angle = me.nEls(me.totalItems); var i = 0; $.each($menuElements, function(key, value){ me.ori_x = me.params.radius - (me.params.pointSize/2); me.ori_y = me.params.radius - (me.params.pointSize/2); var k = i%me.totalItems; var $menuEntry = $(value); var x = me.ori_x + Math.cos(me.angle * k + me.params.start_angle) * me.params.radius; var y = me.ori_y + Math.sin(me.angle * k + me.params.start_angle) * me.params.radius; $($menuEntry).css('left', x).css('top', y).css('width', me.params.pointSize).css('height', me.params.pointSize).addClass('point'); $menuEl.append($menuEntry); i++; }); //this.RT = setInterval(function(){ me.runRotate() }, 20); $('ul#main_nav').remove(); this.setListeners(); }, runRotate: function(){ console.log('Rotate'); var me = this; me.currentR = me.currentR + 1; $('.point').css('-webkit-transform', 'rotate('+ me.currentR+'deg)'); $('nav').css('-webkit-transform', 'rotate(-'+ me.currentR+'deg)'); }, setListeners: function(){ var me = this; // :not ne fonctionne pas... ... ????????? $('.point:not(.centred)').mouseenter(function(){ if($(this).hasClass('centred')){return} // Centrer link if($('nav a.centred')){ $('nav a.centred').animate({ left: me.lastPos.left, top: me.lastPos.top, width: me.params.pointSize, height: me.params.pointSize }, 500); } $('nav a').removeClass('centred'); var center = me.params.pointSize * 2;// - (me.params.radius *2); $(this).addClass('centred'); me.lastPos.left = $(this).css('left'); me.lastPos.top = $(this).css('top'); $(this).animate({ left: center, top: center //width: me.params.radius, //height: me.params.radius }, 200); }); }, nEls: function(n){ return Math.PI * 2 / n; } } roundedMenu._initialize(); </script> </body> </html>
beh c'super !! je note encore quelques bug sous Chrome cependant...
par contre bien entendu je n'y comprends pas grand chose... si tu peux expliquer stp...
donc un grand merci ;)
je rêve un peu de réussir ce genre de prouesse...
comment apprendre en dehors des écoles ?
par contre bien entendu je n'y comprends pas grand chose... si tu peux expliquer stp...
donc un grand merci ;)
je rêve un peu de réussir ce genre de prouesse...
comment apprendre en dehors des écoles ?
on trouve pas mal de tutos sur le site du zéro et sur developpez.com et d'astuces sur stackoverflow. Après, en fonction de tes recherches sur ton meilleur ami, tu tomberas sur une multitude de blogs et autres articles que je te conseille de dévorer. Je suis pas très fan des bouquins, ils sont très rapidement obsolètes...