2014-12-01 22 views
8

Sto cercando di utilizzare il jQuery ridimensionabile per ridimensionare il mio div, ho funzionato abbastanza bene tranne che dopo l'evento stop, l'interfaccia utente di jQuery ripristinerebbe il valoreal valore pixel.Come forzare jQuery ridimensionabile per utilizzare la percentuale?

Sono un violino a lavorare qui: http://jsfiddle.net/totszwai/j60h38fy/5/

Quando si trascina il contenitore current per la prima volta, sarebbe calcola tutto il valore in modo corretto, ma dopo l'evento stop, jQuery UI sarebbe aggiornare il% e il cambiamento torna al pixel ... quindi la prossima volta che lo trascini di nuovo, la% viene persa.

Come si forza jQuery a impostare il valore della larghezza su%? Potrei usare tecnicamente qualcosa come setTimeout, ma sarebbe troppo brutto.

E non voglio una soluzione per manipolare i div in pixel, perché potrei tecnicamente aggiungere n-div nella mia configurazione e quel codice con% dovrebbe funzionare con n-divs.

Se si dà un'occhiata ai miei neighbor div, la% è tenuto lì, solo il current preso sovrascritti. Ho anche provato a giocare con ui.element direttamente così come impostare il ui.size.width sul mio%, ma nessuno di quello funziona neanche.

Aggiornamento: Una soluzione è quella di memorizzare i dati ogni volta all'evento stop e mai verificare di nuovo al start, tuttavia, questo ancora non risolve il problema in cui stop restituisce valore di pixel errato. Vedi jsFiddle aggiornato: http://jsfiddle.net/totszwai/j60h38fy/6/

Se solo jQuery ridimensionabile prende il mio valore%, tutto avrebbe funzionato come previsto.

Risolto: Beh, ho accettato la risposta di apaul34208, poiché ho chiesto come utilizzare%. Tuttavia, per risolvere effettivamente ciò che originariamente volevo risolvere, alla fine uso pixel. Vedere la risposta che ho postato below, se quella risposta ti ha aiutato, per favore invitalo invece.

risposta

7

Mi sono imbattuto in questo stesso problema e la soluzione scelta non funziona per me perché ho bisogno di generalizzare su un numero qualsiasi di colonne. Anche la risposta di codenamezero non ha riguardato il fatto che la domanda originale richiede che vengano utilizzate percentuali per le larghezze.

Per il mio caso, utilizzare le percentuali per la larghezza è essenziale perché sto implementando un editor di tabelle e la tabella che viene salvata deve cambiare le dimensioni in modo dinamico a seconda di dove viene eseguito il rendering.

Così mi si avvicinò con questa soluzione che funziona in modo simile alla soluzione di codenamezero ma nelle fermare le larghezze modificate sono impostate per essere percentuali:
http://jsfiddle.net/genpsire/4mywcm1x/14/

$(document).ready(function() { 

    var container = $(".wrapper"); 
    var numberOfCol = 3; 
    $(".test").css('width', 100/numberOfCol +'%'); 

    var sibTotalWidth; 
    $(".test").resizable({ 
     handles: 'e', 
     start: function(event, ui){ 
      sibTotalWidth = ui.originalSize.width + ui.originalElement.next().outerWidth(); 
     }, 
     stop: function(event, ui){  
      var cellPercentWidth=100 * ui.originalElement.outerWidth()/ container.innerWidth(); 
      ui.originalElement.css('width', cellPercentWidth + '%'); 
      var nextCell = ui.originalElement.next(); 
      var nextPercentWidth=100 * nextCell.outerWidth()/container.innerWidth(); 
      nextCell.css('width', nextPercentWidth + '%'); 
     }, 
     resize: function(event, ui){ 
      ui.originalElement.next().width(sibTotalWidth - ui.size.width); 
     } 
    }); 
}); 

Scegliete questa soluzione in modo che altri non spendono la loro mattinata si tira fuori i capelli cercando di generalizzare la soluzione di apaul34208 al caso di n colonne. (come ho fatto io!)

+0

questo è migliore di quello di apaul ma, non dovresti usare

... – codenamezero

+0

Il contenitore non deve essere una tabella, quindi questo funzionerà con le div. Se si utilizza

per visualizzare dati tabulari, si è a posto. Sono d'accordo che
non dovrebbe essere usato per formattare una pagina. Nel mio caso stiamo visualizzando i dati tabulari. – genspire

+0

Grazie, buona soluzione! Fallisce il test di resistenza allo spostamento (per il ridimensionamento del rapporto di aspetto), ma anche tutte le altre risposte che usano '.resizable()' (perché l'altezza cambia durante il ridimensionamento mentre si tiene il turno) Tuttavia, questo è facile da risolvere facendo questo negli eventi 'resizable' e' stop': '$ (this) .css ('height', '')'. Ho biforcato il tuo violino e ho aggiunto diverse correzioni e miglioramenti qui: http: // jsfiddle.net/8auwgazu/ – nothingisnecessary

0

ho dovuto togliere fantasma e animare e tweak il vostro css un po ', display: flex; sembrava essere la causa risultati imprevisti, ma penso che forse ho inciampato su una soluzione semplice:

Working Example

$(document).ready(function() { 

    $(".test").resizable({ 
    handles: 'e', 
    resize: function() { 
     $('.test:first-of-type').css('width', $('.test:first-of-type').outerWidth() * 100/$(window).innerWidth() + '%'); 
     $('.test:nth-of-type(2)').css('width', 100 - ($('.test:first-of-type').outerWidth() * 100/$(window).innerWidth()) + '%'); 

    } 

    }); 
}); 
* { 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
} 
html, 
body { 
    height: 100%; 
    width: 100%; 
    padding: 0; 
    margin: 0; 
} 
.wrapper { 
    height: 100%; 
    width: 100%; 
} 
.test { 
    float: left; 
    border: 3px solid red; 
} 
<div class="wrapper"> 
    <div class="test" style="width: 50%; height: 200px;">current</div> 
    <div class="test" style="width: 50%; height: 200px;">neighbor</div> 
</div> 
1

Dopo martellare per un altro giorno, finalmente ho la soluzione perfetta. In realtà era molto più semplice di quanto pensassi, è solo che ho finito per complicare le cose.

Stavo cercando di ottenere le sue dimensioni dinamiche del ui.helper e ho provato a manipolare l'elemento neighbor allo stop. Ma quello che mi interessa davvero è la larghezza this dell'elemento e la larghezza del suo elemento immediato vicino ... così ho finisce per fare il seguente:

start: function (event, ui) { 
     // just remember the total width of self + neighbor 
     this.widthWithNeighbor = 
      ui.originalSize.width + ui.element.next().outerWidth(); 
    }, 
    resize: function (event, ui) { 
     // then simply subtract it! 
     ui.element.next().width(this.widthWithNeighbor - ui.size.width); 
    }, 
    stop: function(event, ui) { 
     // clean up, is this needed? 
     delete this.widthWithNeighbor; 
    } 

Questa soluzione funziona per n + 1 DIV seduti fianco a fianco. Se si capovolge la larghezza con l'altezza, funzionerà anche con DIV impilati verticalmente.:)

Cheers!

Working jsFiddle

Nota: Il fantasma e animare opzione dal jQuery UI è ancora dando problema strano come prima. Si tratta di jQuery 2.0.2 e jQuery-UI 1.10.3, si spera che vengano presto riparati.

+0

Pensavo che stessi cercando di ottenere gli elementi che lavorano con ridimensionabili%, ho capito male la domanda? La tua risposta sembra restituire larghezze in px sia in Firefox che in Chrome. – apaul

+0

Hum ... sì, hai ragione. Originariamente volevo farlo funzionare con% poiché non riuscivo a trovare un modo per regolare correttamente i DIV. Immagino che potrei semplicemente accettare la tua risposta, se potessi modificarla per lavorare con i DIV n + 1? – codenamezero

+0

Farò un altro crack in seguito oggi – apaul

0

So che la mia risposta non è una "buona pratica" perché richiede di personalizzare una libreria frequentemente aggiornata, ma ha risolto il mio problema: Modificare la funzione "ridimensiona" all'interno del jquery-ui file .js per manipolare la larghezza come desideri. Nel mio caso ho bisogno il ridimensionamento di ignorare completamente larghezza in modo ho commentato il cambiamento "larghezza":

resize: function(event, ui) { 
     var that = $(this).resizable("instance"), 
      o = that.options, 
      os = that.originalSize, 
      op = that.originalPosition, 
      delta = { 
       height: (that.size.height - os.height) || 0, 
    ----------->//width: (that.size.width - os.width) || 0, 
       top: (that.position.top - op.top) || 0, 
       left: (that.position.left - op.left) || 0 
      }; 

      $(o.alsoResize).each(function() { 
       var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, 
        css = el.parents(ui.originalElement[ 0 ]).length ? 
     ----------------->[ /*"width",*/ "height" ] : 
          [ "width", "height", "top", "left" ]; 

       $.each(css, function(i, prop) { 
        var sum = (start[ prop ] || 0) + (delta[ prop ] || 0); 
        if (sum && sum >= 0) { 
         style[ prop ] = sum || null; 
        } 
       }); 

       el.css(style); 
      }); 
    }, 
+0

Sì, funzionerebbe, ma ti dirò dalla mia esperienza che l'hacking di librerie di terze parti è un rompicapo da mantenere e aggiornare per il futuro. Si possono anche introdurre bug oscuri che influiscono su altri codici vagamente correlati, rendendolo un incubo da tracciare e applicare patch/fix/hack. – codenamezero