9

使用 jQuery UI Resizable 我试图防止根据各种规则调整大小。内置的包含功能似乎不适用于绝对定位的元素,无论如何我需要比这更灵活的东西。

有这样的东西:

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

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

谢谢。

4

9 回答 9

20

这很简单,看看这段代码,用于可调整大小的浮动“左”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());
            }
        });
于 2012-06-01T06:39:59.600 回答
12

在此版本中没有停止调整大小的标准选项。您可以禁用调整大小,但它会继续调整大小,并且会在您下次尝试时停止调整大小的选项。

$(".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;
        }
    }
});
于 2013-04-03T08:51:09.920 回答
7

只需在调整大小事件中直接设置 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/

于 2012-06-01T23:11:20.157 回答
1

您选择正确的答案并不完全正确。这是可以实现的:

使用无用的助手来阻止在 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
  }
});
于 2013-09-18T13:05:17.223 回答
1

我想你可以做这样的事情:

$(Selector).css("min-hight", Size);
$(Selector).css("max-hight", Size);
于 2011-02-26T04:00:54.637 回答
1

已经很久了,但是如果有人读到这个问题,有一个解决方案。

你只需要在里面设置maxWidthor 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;
}
于 2014-12-02T17:44:38.147 回答
0

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

于 2015-03-07T10:28:22.713 回答
0

当前版本似乎不可能。

于 2011-02-26T03:30:30.870 回答
0

如果您不需要继续 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
        });
    }
};
于 2019-07-15T17:04:23.470 回答