2010-07-30 8 views
31

Wie man die jQuery UI veränderbar macht auchResize reverse direction.jQuery UI veränderbarizeResize reverse

in den HTML-Code annehmen, gibt es zwei div-Tag ist, wenn ich nach oben skalieren bedeutet, die andere Sache

<script> 
     $(function() { 
     $("#resizable").resizable({alsoResize: ".myiframe"}); 

    }); 
</script> 
<div id = "resizable"> 
     This is the resizable content... 
</div> 

<div class="myframe"> 
    This must resize in reverse direction... 
</div> 

nach unten, um die Größe hat ich es versucht, aber keinen Nutzen Sie führen diese

zu lösen

Antwort

55

Durch die Änderung des Codes, den jQuery zur Implementierung der Option alsoResize verwendet, können wir unsere eigene alsoResizeReverse Option erstellen. Dann können wir einfach diese wie folgt verwenden:

$("#resizable").resizable({ 
    alsoResizeReverse: ".myframe" 
}); 

Die Struktur der ursprünglichen alsoResize Option hat mich über die verschiedenen Versionen von jQuery UI und meinem ursprünglichen Code funktioniert nicht in den neueren Versionen geändert. Ich gebe den Code für das Hinzufügen dieser Funktionalität in Version 1.8.1 und 1.11.4.

Nur ein paar Dinge musste geändert werden, wie die offensichtliche Umbenennung alsoResize-alsoResizeReverse und Subtrahieren der delta anstatt es hinzuzufügen (was die Größe ändern macht umgekehrt). Der ursprüngliche Code alsoResize beginnt in Zeile 2200 von version 1.8.1 von jQuery UI und Zeile 7922 von version 1.11.4. Sie können die wenigen Änderungen sehen, die benötigt werden here.

Um die alsoResizeReverse Funktionalität, fügen Sie diese zu Ihrer javascript (Diese außerhalb von document.ready() gesetzt werden sollte):

Für neuere Versionen von jQuery UI (Beispiel basiert auf v1.11.4):

$.ui.plugin.add("resizable", "alsoResizeReverse", { 

    start: function() { 
     var that = $(this).resizable("instance"), 
      o = that.options; 

     $(o.alsoResizeReverse).each(function() { 
      var el = $(this); 
      el.data("ui-resizable-alsoresizeReverse", { 
       width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), 
       left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10) 
      }); 
     }); 
    }, 

    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.alsoResizeReverse).each(function() { 
      var el = $(this), start = $(this).data("ui-resizable-alsoresize-reverse"), 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); 
     }); 
    }, 

    stop: function() { 
     $(this).removeData("resizable-alsoresize-reverse"); 
    } 
}); 

Für ältere Version (basierend auf v1.8.1 - meine ursprüngliche Antwort):

$.ui.plugin.add("resizable", "alsoResizeReverse", { 

    start: function(event, ui) { 

     var self = $(this).data("resizable"), o = self.options; 

     var _store = function(exp) { 
      $(exp).each(function() { 
       $(this).data("resizable-alsoresize-reverse", { 
        width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), 
        left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) 
       }); 
      }); 
     }; 

     if (typeof(o.alsoResizeReverse) == 'object' && !o.alsoResizeReverse.parentNode) { 
      if (o.alsoResizeReverse.length) { o.alsoResize = o.alsoResizeReverse[0]; _store(o.alsoResizeReverse); } 
      else { $.each(o.alsoResizeReverse, function(exp, c) { _store(exp); }); } 
     }else{ 
      _store(o.alsoResizeReverse); 
     } 
    }, 

    resize: function(event, ui){ 
     var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; 

     var delta = { 
      height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, 
      top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 
     }, 

     _alsoResizeReverse = function(exp, c) { 
      $(exp).each(function() { 
       var el = $(this), start = $(this).data("resizable-alsoresize-reverse"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; 

       $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { 
        var sum = (start[prop]||0) - (delta[prop]||0); // subtracting instead of adding 
        if (sum && sum >= 0) 
         style[prop] = sum || null; 
       }); 

       //Opera fixing relative position 
       if (/relative/.test(el.css('position')) && $.browser.opera) { 
        self._revertToRelativePosition = true; 
        el.css({ position: 'absolute', top: 'auto', left: 'auto' }); 
       } 

       el.css(style); 
      }); 
     }; 

     if (typeof(o.alsoResizeReverse) == 'object' && !o.alsoResizeReverse.nodeType) { 
      $.each(o.alsoResizeReverse, function(exp, c) { _alsoResizeReverse(exp, c); }); 
     }else{ 
      _alsoResizeReverse(o.alsoResizeReverse); 
     } 
    }, 

    stop: function(event, ui){ 
     var self = $(this).data("resizable"); 

     //Opera fixing relative position 
     if (self._revertToRelativePosition && $.browser.opera) { 
      self._revertToRelativePosition = false; 
      el.css({ position: 'relative' }); 
     } 

     $(this).removeData("resizable-alsoresize-reverse"); 
    } 
}); 

Hier ist eine Demo: http://jsfiddle.net/WpgzZ/

+0

Wirklich grt Freund !! –

+0

+1, wow Mann hast du Zeit dafür. –

+0

Nur gedacht, ich würde hinzufügen, dass Sie dies zu Ihrem jquery-us.js hinzufügen, so dass sowohl auchResize undResizeReverse funktioniert. (Nur für den Fall, dass jemand verwirrt war) Auch, gute Arbeit! – Richard

4
$('#div1').resizable({ 
     handles: 'n', 
     resize: function(){ 
      $('#div2').css("height","-"+ui.size.height+"px"); 
     } 
    }).bind("resize", function() { 
     $(this).css("top", "auto"); //To handle the issue with top 
    }); 

Dies sollte auch funktionieren, um die Größe eines anderen Div in der entgegengesetzten Richtung zu ändern.

+1

Nun in meinem Fall 'UI ist nicht definiert' – Kiwy

2

Auch wenn der Code von Simen geschrieben sehr gut funktioniert, ist hier mein Code zwei div vertikal, um die Größe (und es funktioniert gut)

<script> 
    var myheight = ($(window).height()-50); 
    var mywidth = $(window).width(); 
    $(window).load(function() { 
     $("#resizable").height(100); 
     $("#content").height(myheight-$("#resizable").height()); 
    }); 
</script> 

<div id="resizable" style="border:1px solid #333; overflow:auto">resizable</div> 
<div id="content" style="border:1px solid red; overflow:auto">content</div> 

<script> 
    $("#resizable").resizable({ 
     handles: 's', 
     maxHeight: myheight, 
     resize: function() { 
     $("#content").height(myheight-$("#resizable").height()); 
     } 
    }); 
</script> 
+1

Hey Kumpel, sollten Sie Ihre Frage in einer anderen Frage stellen – Littm

+0

Code funktioniert gut, aber die unteren div haben ein Problem bei der Größenanpassung. Benötigt einen kleinen Tweak, ich denke, ich konnte es nicht herausfinden. Ich habe versucht, Überlauf-verschiedene Stile ..! – raja777m

8

ich ein Problem hatte den „Simen Echholt“ -Code bekommen mit jQuery 1.9.1/jquery-ui (1.10.2) zu arbeiten, aber es funktionierte, als ich austauschte "$ (this) .data (" resizable ")" mit "$ (this) .data ("ui-resizable") ".

+0

Ich dachte, ich könnte erwähnen, dass ich auch '$ .browser.opera' in' $ .support.opera' ändern musste, wenn ich jQuery 2.0.3/jQuery UI 1.10.3 verwendete. –

1

Aktualisiert für jquery-ui 1.10.4

$.ui.plugin.add('resizable', 'alsoResizeReverse', { 

    start: function() { 
    var that = $(this).data('ui-resizable'), 
    o = that.options, 
    _store = function (exp) { 
     $(exp).each(function() { 
     var el = $(this); 
     el.data('ui-resizable-alsoresize-reverse', { 
      width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), 
      left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10) 
     }); 
     }); 
    }; 

    if (typeof(o.alsoResizeReverse) === 'object' && !o.alsoResizeReverse.parentNode) { 
     if (o.alsoResizeReverse.length) { o.alsoResize = o.alsoResizeReverse[0]; _store(o.alsoResizeReverse); } 
     else { $.each(o.alsoResizeReverse, function(exp) { _store(exp); }); } 
    }else{ 
     _store(o.alsoResizeReverse); 
    } 
    }, 

    resize: function (event, ui) { 
    var that = $(this).data('ui-resizable'), 
    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 
    }, 

    _alsoResizeReverse = function(exp, c) { 
     $(exp).each(function() { 
     var el = $(this), start = $(this).data('ui-resizable-alsoresize-reverse'), style = {}, 
     css = c && c.length ? c : 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); // subtracting instead of adding 
      if (sum && sum >= 0) { 
      style[prop] = sum || null; 
      } 
     }); 

     el.css(style); 
     }); 
    }; 

    if (typeof(o.alsoResizeReverse) === 'object' && !o.alsoResizeReverse.nodeType) { 
     $.each(o.alsoResizeReverse, function(exp, c) { _alsoResizeReverse(exp, c); }); 
    }else{ 
     _alsoResizeReverse(o.alsoResizeReverse); 
    } 
    }, 

    stop: function(event, ui){ 
    $(this).removeData("resizable-alsoresize-reverse"); 
    } 
}); 
5

Update auf jQuery 2.1.1 und jQuery UI 1.11.2.

$.ui.plugin.add("resizable", "alsoResizeReverse", { 
 

 
    start: function() { 
 
    var that = $(this).resizable("instance"), 
 
     o = that.options, 
 
     _store = function(exp) { 
 
     $(exp).each(function() { 
 
      var el = $(this); 
 
      el.data("ui-resizable-alsoResizeReverse", { 
 
      width: parseInt(el.width(), 10), 
 
      height: parseInt(el.height(), 10), 
 
      left: parseInt(el.css("left"), 10), 
 
      top: parseInt(el.css("top"), 10) 
 
      }); 
 
     }); 
 
     }; 
 

 
    if (typeof(o.alsoResizeReverse) === "object" && !o.alsoResizeReverse.parentNode) { 
 
     if (o.alsoResizeReverse.length) { 
 
     o.alsoResizeReverse = o.alsoResizeReverse[0]; 
 
     _store(o.alsoResizeReverse); 
 
     } else { 
 
     $.each(o.alsoResizeReverse, function(exp) { 
 
      _store(exp); 
 
     }); 
 
     } 
 
    } else { 
 
     _store(o.alsoResizeReverse); 
 
    } 
 
    }, 
 

 
    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 
 
     }, 
 

 
     _alsoResizeReverse = function(exp, c) { 
 
     $(exp).each(function() { 
 
      var el = $(this), 
 
      start = $(this).data("ui-resizable-alsoResizeReverse"), 
 
      style = {}, 
 
      css = c && c.length ? 
 
      c : 
 
      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); 
 
     }); 
 
     }; 
 

 
    if (typeof(o.alsoResizeReverse) === "object" && !o.alsoResizeReverse.nodeType) { 
 
     $.each(o.alsoResizeReverse, function(exp, c) { 
 
     _alsoResizeReverse(exp, c); 
 
     }); 
 
    } else { 
 
     _alsoResizeReverse(o.alsoResizeReverse); 
 
    } 
 
    }, 
 

 
    stop: function() { 
 
    $(this).removeData("resizable-alsoResizeReverse"); 
 
    } 
 
}); 
 
$(function() { 
 

 
    $("#resizable").resizable({ 
 
    alsoResizeReverse: ".myframe" 
 
    }); 
 

 
});
#resizable, 
 
.myframe { 
 
    border: 1px solid black; 
 
    padding: 10px; 
 
    margin-bottom: 20px; 
 
    width: 50%; 
 
    height: 150px 
 
}
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/themes/base/jquery-ui.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="http://code.jquery.com/ui/1.11.2/jquery-ui.min.js"></script> 
 
<div id="resizable"> 
 
    This is the resizable content... 
 
</div> 
 

 
<div class="myframe"> 
 
    This must resize in reverse direction... 
 
</div>

[http://jsfiddle.net/WpgzZ/1136/][1]

1

die Ideen von marg t und Joseph Baker Angepasst - was meiner Meinung nach ein viel besserer Ansatz ist. Für diese Methode ist kein Jquery-Bibliothekshack oder -Plugin erforderlich, um ein div in zwei Bereiche aufzuteilen. Fügen Sie einfach eine Funktion in der Größe veränderbar ‚Größe ändern‘ Ereignis Breite versetzt:

$("#left_pane").resizable({ 
    handles: 'e', //'East' draggable edge 
    resize: function() { 
    $("#right_pane").outerWidth($("#container").innerWidth() - $("#left_pane").outerWidth()); 
    } 
}); 

ist die komplette JS fiddle.