2015-05-27 14 views
8

Voglio un selettore che si muova su una barra a 30 gradi, ho fatto qualche ricerca sul web ma non sono riuscito a trovare alcuna soluzione !.jquery movimenti trascinabili su 30 gradi solo

So che:

$(".selector").draggable({ axis: 'x' }); 

lo sposta sull'asse xe:

$(".selector").draggable({ axis: 'y' }); 

lo sposta sull'asse y ma la domanda è come muoversi su angolo di 30 gradi solo?

enter image description here

voglio fare questo lavoro menu.

enter image description here

+0

Sono curioso di vedere se questo è fattibile o se avete bisogno di qualche soluzione personalizzata –

+0

Come si vede in https://jqueryui.com/droppable/ non esiste una soluzione per questo, quindi penso che ho bisogno soluzione personalizzata, non sono sicuro di averlo provato? –

+0

Hai provato a creare un elemento diagonale e ad impostarlo come elemento di contenimento? – Kathy

risposta

5

In realtà, è abbastanza facile!
Tutto quello che dovete fare è controllare la posizione del vostro elemento in caso drag, e un po 'di trigonometria farà il duro lavoro per voi ...


Modificato:
Ecco il original answer
Ecco la new one


var rad = Math.PI/180; 
 

 
$("#Handle").draggable(
 
{ 
 
    drag: function(event, ui) 
 
    { 
 
     var offset = 
 
     { 
 
      x: ui.offset.left - ui.originalPosition.left, 
 
      y: ui.offset.top - ui.originalPosition.top 
 
     }; 
 
     
 
     var distance = Math.sqrt(offset.x * offset.x + offset.y * offset.y); 
 
     distance = Math.min(distance, 150); 
 
     
 
     var angle; 
 
     
 
      if (offset.y > 0) { angle = 90 * rad; } // Moving downwards 
 
     else if (offset.x < 0) { angle = 210 * rad; } // Moving leftwards 
 
     else     { angle = 330 * rad; } // Moving rightwards 
 
     
 
     ui.position.top = Math.sin(angle) * distance + ui.originalPosition.top; 
 
     ui.position.left = Math.cos(angle) * distance + ui.originalPosition.left; 
 
    } 
 
});
body { margin: 0; } 
 
#Handle 
 
{ 
 
    top: 150px; 
 
    left: 200px; 
 
    width: 25px; 
 
    height: 25px; 
 
    background-color: red; 
 
} 
 

 
#Background 
 
{ 
 
    position: absolute; 
 
    top: 150px; 
 
    left: 200px; 
 
} 
 

 
#Background .bottom, 
 
#Background .left, 
 
#Background .right 
 
{ 
 
    transform-origin: top left; 
 
    width: 150px; 
 
    height: 1px; 
 
    background-color: blue; 
 
} 
 

 
#Background .bottom { transform: rotate(90deg); } 
 
#Background .left { transform: rotate(210deg); } 
 
#Background .right { transform: rotate(330deg); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 

 
<div id="Background"> 
 
    <div class="right"></div> 
 
    <div class="bottom"></div> 
 
    <div class="left"></div> 
 
</div> 
 

 
<div id="Handle"></div>

+0

grazie questo è quello che ho chiesto, posso fare questa mossa su 3 direzioni 30 gradi, 150 gradi e 90 gradi, ho aggiornato una foto per quello che voglio ottenere, grazie per il vostro aiuto. –

+0

Menu interessante del tuo ... = D Puoi controllare se l'offset.x' e 'offset.y' è positivo o negativo per cambiare il blocco dell'angolo ... Proverò ad aggiornare il mio violino – NemoStein

+0

grazie:) .. in attesa dell'aggiornamento :) –

Problemi correlati