jQuery UI Resizable在resize事件中停止调整大小

时间:2011-02-23 05:12:28

标签: jquery-ui resize jquery-ui-resizable

使用jQuery UI Resizable我试图阻止基于各种规则的大小调整。对于绝对定位的元素,内置的包含功能似乎不能正常工作,我还需要比这更灵活的东西。

有这样的事情:

$( ".selector" ).resizable({ resize : function(event, ui) { /* ??? */ } });

如何告诉“ui”对象阻止调整大小?

感谢。

9 个答案:

答案 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;
}

当然,你也可以做同样的定位。

看到这个小提琴:http://jsfiddle.net/dtwist/PrEfd/

答案 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内设置minWidthresize(取决于您要执行的操作)即可停止调整大小。

您可以执行以下操作:

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)

拦截startresize有一种尴尬的方式:

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
        });
    }
};