2013-07-25 23 views
16

Ho un div nested all'interno di un altro div che viene utilizzato per visualizzare una console delle impostazioni. Il div nidificato ha un fisso posizionato all'interno del genitore come segue:Come faccio a trascinare una larghezza div?

Div arrangement

mi piacerebbe aggiungere un manico draggable al bordo sinistro del div bambino in modo che il div bambino può essere ridimensionata alla larghezza. Devo aggiungere un altro div molto stretto in cui il bordo della mano sinistra è posizionato in modo che questo possa essere trascinato e la posizione ricalcolata per ridimensionare dinamicamente la proprietà div divs bambino?

Preferisco attenermi a Vanilla JQuery se possibile, piuttosto che affidarmi all'interfaccia utente di JQuery.

+1

Qual è il problema dell'utilizzo di jquery ui .resizable http://jqueryui.com/resizable/? e pubblica il codice html e css – Sbml

+0

Non è un grosso problema, felice di usare. resizable. Non ero sicuro di come ottenere il pacchetto UI JQuery solo per i metodi di cui ho bisogno piuttosto che importare l'intera libreria dell'interfaccia utente. – QFDev

+1

Puoi scegliere solo i metodi che desideri http://jqueryui.com/download/ – Sbml

risposta

15

Credo che questo è ciò che stai cercando

maniglie: che gestisce può essere utilizzato per il ridimensionamento.

Esempio:$(".selector").resizable({ handles: "n, e, s, w" });

HTML:

<div class="parent"> 
    <div class="child"></div> 
</div> 

CSS:

.parent { 
    position: relative; 
    width: 800px; 
    height: 500px; 
    background: #000; 
} 
.child { 
    position: absolute; 
    right: 0; 
    top: 0; 
    width: 200px; 
    height: 100%;   
    background: #ccc; 
} 

JS:

$('.child').resizable({ 
    handles: 'n,w,s,e', 
    minWidth: 200, 
    maxWidth: 400 
}); 

controllo questo JSFiddle

EDIT: Risolto il problema css, Updated fiddle

+0

Grazie..ho qualcosa di simile qui: http://jsfiddle.net/boggey79/TdtMx/ Il problema è che il contenitore salta a sinistra sul trascinamento (Chrome 28.0.1500.72 m) – QFDev

+1

@QF_Developer Penso che tu abbia sbagliato il violino sbagliato . controlla questo http://jsfiddle.net/YZX6B/11/ – Praveen

+0

Il bambino sta saltando a sinistra sia sul tuo violino che sul mio quando viene tentato un ridimensionamento. Lo vedo in Chrome e IE ... vedi questo comportamento? – QFDev

3

Utilizzare l'interazione ridimensionabile dell'interfaccia utente jQuery, come indicato nel commento. Date un'occhiata a questo esempio: http://jqueryui.com/resizable/#max-min

EDIT: per bloccarlo fino a solo il ridimensionamento della larghezza, impostare il MinHeight pari a maxHeight. Questo dovrebbe probabilmente farlo.

Codice dall'alto esempio:

$(function() { 
    $("#resizable").resizable({ 
    minHeight: 250, 
    maxHeight: 250, 
    minWidth: 200, 
    maxWidth: 350 
    }); 
}); 

EDIT 2: Per aplying gestisce eventuali modi diversi: leggere il doc http://api.jqueryui.com/resizable/#option-handles

+0

Sembra buono, sto solo cercando di capire come posso bloccare solo il ridimensionamento della larghezza. – QFDev

+0

Inoltre ho bisogno della maniglia sul bordo sinistro invece di fluttuare in basso a destra. Qualcuno sa se questo è possibile, sto leggendo la documentazione dell'API ora. – QFDev

+0

Vedi la mia modifica proprio ora. – AntonNiklasson

1

Prova questo codice ..

$('.child').resizable({ 
    handles: 'w' 
}); 

È possibile aggiungere quindi una larghezza massima e minima

9

Ciò può essere ottenuto abbastanza facilmente con jQuery vaniglia per così dire. Suggerisco comunque di utilizzare un layout di markup più efficiente, o ti imbatterai in alcuni problemi relativi alla posizione/dimensione.

Vorrei utilizzare un contenitore e 2 bambini.In uno dei bambini (il secondo, o il lato destro) conterrà una maniglia trasparente ma di larghezza ridotta. Per il jQuery, devi solo collegare un evento del mouse a quella maniglia e regolare le dimensioni degli altri bambini di conseguenza. Ecco approssimativamente come andrà a finire.

HTML

<div id="container"> 
    <!-- Left side --> 
    <div id="left"> This is the left side's content! </div> 
    <!-- Right side --> 
    <div id="right"> 
     <!-- Actual resize handle --> 
     <div id="handle"></div> This is the right side's content! 
    </div> 
</div> 

JavaScript

var isResizing = false, 
    lastDownX = 0; 

$(function() { 
    var container = $('#container'), 
     left = $('#left'), 
     right = $('#right'), 
     handle = $('#handle'); 

    handle.on('mousedown', function (e) { 
     isResizing = true; 
     lastDownX = e.clientX; 
    }); 

    $(document).on('mousemove', function (e) { 
     // we don't want to do anything if we aren't resizing. 
     if (!isResizing) 
      return; 

     var offsetRight = container.width() - (e.clientX - container.offset().left); 

     left.css('right', offsetRight); 
     right.css('width', offsetRight); 
    }).on('mouseup', function (e) { 
     // stop resizing 
     isResizing = false; 
    }); 
}); 

JSFiddle

+0

Funziona perfettamente a parte la compressione del contenuto div sinistro durante il ridimensionamento. Avrei bisogno del div ridimensionabile per sovrapporre la dimensione sinistra. – QFDev

+0

Certo: ecco un [aggiornato JSFiddle] (http://jsfiddle.net/DVGbS/) –

+0

Questa soluzione può essere regolata in modo che ci siano 3 contenitori div in fila? – Anuket

0

È possibile anche allegare un gestore di eventi come mostrato qui sotto, che è utile se si vuole fare qualcosa al via o fine del ridimensionamento.

$("#resizeableElementId").resizable({handles: 'n,w,s,e', minWidth: 200, maxWidth: 600}); 

$("#resizeableElementId").on("resizestop", function(event, ui) { 

    console.log('resize ended'); 
    console.dir(event); 

}); 

Ricordare che è necessario includere anche l'interfaccia utente di jQuery; scaricarlo e aggiungere qualcosa del genere:

<link rel="stylesheet" type="text/css" href="jquery-ui-1.11.1.custom/jquery-ui.min.css" />