jQuery UI Resizable alsoResize reverse
How to make the jQuery UI Resizable alsoResize reverse direction.
suppose in the html there is two div tag is there, if i resize in upward means the other thing has to resize downward
<script>
$(function() {
$("#resizable").resizable({alsoResize: ".myiframe"});
});
</script>
<div id = "resizable">
This is the resizable content...
</div>
<div class="myframe"&开发者_StackOverflow社区gt;
This must resize in reverse direction...
</div>
i tried it but of no use please guide to solve this
By modifying the code jQuery uses to implement the alsoResize
option, we can make our own alsoResizeReverse
option. Then we can simply use this as follows:
$("#resizable").resizable({
alsoResizeReverse: ".myframe"
});
The structure of the original alsoResize
option has been changed over the various versions of jQuery UI and my original code does not work in the newer versions. I'll give the code for adding this functionality in version 1.8.1 and 1.11.4.
Only a few things had to be changed, such as the obvious renaming alsoResize
to alsoResizeReverse
and subtracting the delta
instead of adding it (what makes the resize reversed). The original alsoResize
code starts on line 2200 of version 1.8.1 of jQuery UI and line 7922 of version 1.11.4. You can see the few changes needed here.
To add the alsoResizeReverse
functionality, add this to your javascript (This should be put outside of document.ready()):
For newer versions of jQuery UI (example is based on 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");
}
});
For older version (based on v1.8.1 -- my original answer):
$.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");
}
});
Here's a demo: http://jsfiddle.net/WpgzZ/
I had a problem getting the "Simen Echholt"-code to work with jQuery 1.9.1/jquery-ui (1.10.2), but it worked when I exchanged "$(this).data("resizable")" with "$(this).data("ui-resizable")".
Update to jQuery 2.1.1 and 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]
$('#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
});
This should also work to resize another div in the opposite direction.
Even if the code posted by Simen works very well, here is my code to resize two div vertically (and it works fine)
<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>
Adapted the ideas from marg t and Joseph Baker - which I think is a far better approach. This method doesn't require any Jquery library hack or plugin to split a div into two panes. Just add a function to offset width in the resizable 'resize' event:
$("#left_pane").resizable({
handles: 'e', //'East' draggable edge
resize: function() {
$("#right_pane").outerWidth($("#container").innerWidth() - $("#left_pane").outerWidth());
}
});
Here's the complete JS fiddle.
Updated for 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");
}
});
精彩评论