使用jQuery UI Resizable我试图阻止基于各种规则的大小调整。对于绝对定位的元素,内置的包含功能似乎不能正常工作,我还需要比这更灵活的东西。
有这样的事情:
$( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } });
如何告诉“ui”对象阻止调整大小?
感谢。
答案 0 :(得分:19)
这很简单,请查看此代码,了解可调整大小的浮动“左”div列,其宽度适合且相互限制。
var maxWidthOffset, total2Width;
$('#'+this.id).find('ul:not(:last)').resizable({
handles: 'e',
ghost: true,
delay: 200,
helper: "overmoused",
minWidth: 20,
start: function(e, ui) {
maxWidthOffset = ui.element.next().width()-20;
total2Width = ui.element.width()+maxWidthOffset+20;
},
resize: function(e, ui) {
if (ui.size.width > (ui.originalSize.width + maxWidthOffset)) {
$(this).resizable('widget').trigger('mouseup');
}
},
stop: function(e, ui) {
var w;
if (ui.originalSize.width > ui.size.width) {
w = ui.element.next().width()+ui.originalSize.width - ui.size.width;
ui.element.next().width(w>20 ? w : 20);
} else {
w = ui.element.next().width()-(ui.size.width - ui.originalSize.width);
ui.element.next().width(w>20 ? w : 20);
}
ui.element.width(total2Width-ui.element.next().width());
}
});
答案 1 :(得分:10)
没有标准选项可以在此版本停止调整大小。 您可以禁用resizable,但它会继续调整大小,并且只会在您下次尝试时停止调整大小的选项。
$(".selector").resizable("disable");
无论如何,我发现您可以直接从Resize Event使用maxWidth和maxHeight属性来限制调整大小。
$(".selector").resizable({
aspectRatio: true,
handles: 'all',
resize: function( event, ui ){
if(x > y){
(".selector").resizable("option","maxWidth",ui.size.width);
return;
}
}
});
答案 2 :(得分:7)
只需在resize事件中直接设置UI属性即可。 (如果您愿意,也可以在停止事件中执行此操作):
$(".selector").resizable({
resize: function(event, ui) {
// set directly
ui.size.height = 150;
ui.size.width = 150;
}
});
$(".selector2").resizable({
resize: function(event, ui) {
// return value from another function
restrictSize(ui);
}
});
function restrictSize(ui) {
maxheight = 250;
maxwidth = 300;
ui.size.height = ui.size.height > maxheight ? maxheight : ui.size.height;
ui.size.width = ui.size.width > maxwidth ? maxwidth : ui.size.width;
}
当然,你也可以做同样的定位。
答案 3 :(得分:1)
目前的版本似乎无法实现。
答案 4 :(得分:1)
我猜你可以这样做:
$(Selector).css(“min-hight”,Size);
$(Selector).css(“max-hight”,Size);
答案 5 :(得分:1)
您选择的答案是正确的并不完全正确。这是可以实现的:
使用无用的帮助程序停止调整大小事件的大小调整:
$( ".selector" ).resizable({
resize: function(event, ui) {
// resize $(this) as you wish
},
helper: $("</div>")
});
在调整大小事件中,根据需要更改可调整大小的尺寸和位置。您仍然遇到停止事件的问题。在触发停止事件之前,jquery会调整元素的大小 - 这是您不想要的。您所能做的就是重置对象状态,就像上次触发调整大小事件一样。因此,在停止事件中,您可以重置您在上次触发的“调整大小”事件中设置的可调整大小的维度和位置。为此,您需要在更高的上下文中声明一些变量,或者使用jquery的element.data()方法 - 您的选择(如果您感觉更舒服,甚至可以创建整个对象的隐形克隆)。以下是最终代码结构的概述:
$( ".selector" ).resizable({
resize: function(event, ui) {
// resize $(this) as you wish and then save the dimensions and positions to some variables declared in a higher context
},
helper: $("</div>"),
stop: function(){
// restore $(this) position and location as it was last set in the resize event
}
});
答案 6 :(得分:0)
很长一段时间了,但如果有人读到这个问题,就可以解决这个问题。
您只需在maxWidth
内设置minWidth
或resize
(取决于您要执行的操作)即可停止调整大小。
您可以执行以下操作:
minWidth: 300,
start: function(event, ui) {
// get it once so we don't get it hundreds of time inside resize
this.enforcedMinWidth = $(this).resizable("option", "minWidth");
},
resize: function(event, ui) {
// use whatever conditions you want to stop here
// in my original case, i was checking its width vs neighbor and
// stops the resizing accordingly, so change it to fit your case
if (ui.element.next().width() <= this.enforcedMinWidth) {
$(this).resizable("option", "maxWidth", ui.size.width);
}
},
stop: function(event, ui) {
// reset
$(this).resizable("option", "maxWidth", null);
// cleanup
delete this.enforcedMinWidth;
}
答案 7 :(得分:0)
拦截start
和resize
有一种尴尬的方式:
resize: function(event, ui) {
if (RULE) {
$(this).resizable('widget').trigger('mouseup');
var save = window.savePosition;
save.width += 4;
save.height += 4;
$(ui.helper).css(save);
return;
}
},
start: function(event, ui) {
if (RULE) {
window.savePosition = $.extend({ }, ui.size, ui.position);
}
}
不幸的是,调整大小手柄上有一个4像素的“边框”,因此当您中止调整大小操作时,必须稍微修正以避免可调整大小的区域“跳过”。
此解决方案将保存恢复到初始位置,假设始终应用相同的规则。您当然可以通过不保存初始位置和大小来调整它,但在调整大小期间动态地重新计算它。在这种情况下,您根本不需要拦截start
。
答案 8 :(得分:0)
如果您不需要继续mousedown状态,则可以触发mouseup:
var resizableSettings = {
start: function(event, element) {
if (a > b) {
$(this).trigger('mouseup');
}
}
};
但是您可能需要继续将鼠标移下状态,例如用户拖动div。
下面是使用已经提到的一些想法的示例。
var resizableSettings = {
start: function(event, element) {
if (a > b) {
$(this).resizable('option', {
'maxWidth': element.size.width,
'minWidth': element.size.width,
'maxHeight': element.size.height,
'minHeight': element.size.height
});
return;
}
$(this).resizable('option', {
'maxWidth': false,
'minWidth': false,
'maxHeight': false,
'minHeight': false
});
}
};