使用 jQuery UI Resizable 我试图防止根据各种规则调整大小。内置的包含功能似乎不适用于绝对定位的元素,无论如何我需要比这更灵活的东西。
有这样的东西:
$( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } });
如何告诉“ui”对象以防止调整大小?
谢谢。
使用 jQuery UI Resizable 我试图防止根据各种规则调整大小。内置的包含功能似乎不适用于绝对定位的元素,无论如何我需要比这更灵活的东西。
有这样的东西:
$( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } });
如何告诉“ui”对象以防止调整大小?
谢谢。
这很简单,看看这段代码,用于可调整大小的浮动“左”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());
}
});
在此版本中没有停止调整大小的标准选项。您可以禁用调整大小,但它会继续调整大小,并且会在您下次尝试时停止调整大小的选项。
$(".selector").resizable("disable");
无论如何,我发现您可以直接从 Resize 事件中使用 maxWidth 和 maxHeight 属性来限制调整大小。
$(".selector").resizable({
aspectRatio: true,
handles: 'all',
resize: function( event, ui ){
if(x > y){
(".selector").resizable("option","maxWidth",ui.size.width);
return;
}
}
});
只需在调整大小事件中直接设置 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;
}
当然,你也可以对定位做同样的事情。
看到这个小提琴:http: //jsfiddle.net/dtwist/PrEfd/
您选择正确的答案并不完全正确。这是可以实现的:
使用无用的助手来阻止在 resize 事件上发生调整大小:
$( ".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
}
});
我想你可以做这样的事情:
$(Selector).css("min-hight", Size);
$(Selector).css("max-hight", Size);
已经很久了,但是如果有人读到这个问题,有一个解决方案。
你只需要在里面设置maxWidth
or 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;
}
start
拦截and有一种尴尬的方式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
。
当前版本似乎不可能。
如果您不需要继续 mousedown 状态,则可以触发 mouseup:
var resizableSettings = {
start: function(event, element) {
if (a > b) {
$(this).trigger('mouseup');
}
}
};
但是你可能需要继续mousedown状态,比如用户拖动一个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
});
}
};