jQuery UI - 防止在父级外部调整对话框大小 div
jQuery UI - prevent resizing of dialog outside the parent div
问题:
在调整对话框大小时,我想防止它超出父 div dialog-container
。出于某种原因 containment
没有按我预期的那样工作。我还能尝试什么?
HTML:
<div id="top"></div>
<div id="dialog-container">
<div id="dialog">My dialog</div>
</div>
JS:
$(document).ready(function() {
jQuery("#dialog").dialog({
autoOpen:true,
modal: false,
resizable: true,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function(){
jQuery('.ui-widget-overlay').bind('click',function(){
jQuery('#dialog').dialog('close');
})
}
}).parent().draggable({
containment: '#dialog-container'
}).resizable({
containment: '#dialog-container'
});
});
JSFIDDLE: https://jsfiddle.net/4zfmbktr/
首先,我会强烈建议移动到较新的jQueryUI图书馆。我在 Fiddle.
中选择的 jQuery UI 1.8.18 发现了很多奇怪的问题
我发现的一件事是它忽略了应用于可调整大小的 options
。如果您阅读 this article,它会讨论如何设置此选项。跳到 Jason C 的答案顶部。这就是我开始的地方:
JavaScript
$(function() {
$("#dialog").dialog({
autoOpen: true,
modal: false,
resizable: false,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function() {
$('.ui-widget-overlay').bind('click', function() {
$('#dialog').dialog('close');
})
}
});
var ui = $("#dialog").closest(".ui-dialog");
ui.draggable("option", "containment", '#dialog-container');
ui.resizable("option", "containment", '#dialog-container');
});
这没有用。可拖动包含工作,但调整大小包含失败硬。我责怪 1.8.18。我可能会用现代的 1.12.1 再次测试一下。
这并不意味着您不能使用 1.8.18,如果您不能更改您的库,这里有一个解决方法。这里有一些注意事项。
工作示例:https://jsfiddle.net/Twisty/2vaf3dr5/39/
JavaScript
$(function() {
$("#dialog").dialog({
autoOpen: true,
modal: false,
resizable: false,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function() {
$('.ui-widget-overlay').bind('click', function() {
$('#dialog').dialog('close');
})
}
});
var ui = $("#dialog").closest(".ui-dialog");
ui.draggable("option", "containment", '#dialog-container');
ui.resizable({
handles: "n, e, s, w, se",
minHeight: 150,
minWidth: 150,
resize: function(e, ui) {
var contPos = $("#dialog-container").position();
contPos.bottom = contPos.top + $("#dialog-container").height();
contPos.right = contPos.left + $("#dialog-container").width();
contPos.height = $("#dialog-container").height();
contPos.width = $("#dialog-container").width();
if (ui.position.top <= contPos.top) {
ui.position.top = contPos.top + 1;
}
if (ui.position.left <= contPos.left) {
ui.position.left = contPos.left + 1;
}
if (ui.size.height >= contPos.height) {
ui.size.height = contPos.height - 7;
}
if (ui.size.width >= contPos.width) {
ui.size.width = contPos.width - 7;
}
}
});
});
我去掉了对话框中预配置的resizable选项,直接把选项写出来。同样,遏制在这里不起作用,所以我必须制作自己的自定义调整大小逻辑。最后,这符合您的预期。
其中一个奇怪或警告是,它正在读取鼠标移动,并且即使鼠标超出边界也会继续这样做。所以 Top 和 Left 停止了......但是宽度和高度继续增长。我不知道为什么,你知道我会把矛头指向哪里。
我确实尝试过切换您的库,并且调整大小……好一点。高度仍然很奇怪,但宽度却没有。看这里:https://jsfiddle.net/Twisty/2vaf3dr5/44/
这应该可以帮助您,希望对您有所帮助。
问题:
在调整对话框大小时,我想防止它超出父 div dialog-container
。出于某种原因 containment
没有按我预期的那样工作。我还能尝试什么?
HTML:
<div id="top"></div>
<div id="dialog-container">
<div id="dialog">My dialog</div>
</div>
JS:
$(document).ready(function() {
jQuery("#dialog").dialog({
autoOpen:true,
modal: false,
resizable: true,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function(){
jQuery('.ui-widget-overlay').bind('click',function(){
jQuery('#dialog').dialog('close');
})
}
}).parent().draggable({
containment: '#dialog-container'
}).resizable({
containment: '#dialog-container'
});
});
JSFIDDLE: https://jsfiddle.net/4zfmbktr/
首先,我会强烈建议移动到较新的jQueryUI图书馆。我在 Fiddle.
中选择的 jQuery UI 1.8.18 发现了很多奇怪的问题我发现的一件事是它忽略了应用于可调整大小的 options
。如果您阅读 this article,它会讨论如何设置此选项。跳到 Jason C 的答案顶部。这就是我开始的地方:
JavaScript
$(function() {
$("#dialog").dialog({
autoOpen: true,
modal: false,
resizable: false,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function() {
$('.ui-widget-overlay').bind('click', function() {
$('#dialog').dialog('close');
})
}
});
var ui = $("#dialog").closest(".ui-dialog");
ui.draggable("option", "containment", '#dialog-container');
ui.resizable("option", "containment", '#dialog-container');
});
这没有用。可拖动包含工作,但调整大小包含失败硬。我责怪 1.8.18。我可能会用现代的 1.12.1 再次测试一下。
这并不意味着您不能使用 1.8.18,如果您不能更改您的库,这里有一个解决方法。这里有一些注意事项。
工作示例:https://jsfiddle.net/Twisty/2vaf3dr5/39/
JavaScript
$(function() {
$("#dialog").dialog({
autoOpen: true,
modal: false,
resizable: false,
draggable: true,
closeOnEscape: true,
title: "Title",
open: function() {
$('.ui-widget-overlay').bind('click', function() {
$('#dialog').dialog('close');
})
}
});
var ui = $("#dialog").closest(".ui-dialog");
ui.draggable("option", "containment", '#dialog-container');
ui.resizable({
handles: "n, e, s, w, se",
minHeight: 150,
minWidth: 150,
resize: function(e, ui) {
var contPos = $("#dialog-container").position();
contPos.bottom = contPos.top + $("#dialog-container").height();
contPos.right = contPos.left + $("#dialog-container").width();
contPos.height = $("#dialog-container").height();
contPos.width = $("#dialog-container").width();
if (ui.position.top <= contPos.top) {
ui.position.top = contPos.top + 1;
}
if (ui.position.left <= contPos.left) {
ui.position.left = contPos.left + 1;
}
if (ui.size.height >= contPos.height) {
ui.size.height = contPos.height - 7;
}
if (ui.size.width >= contPos.width) {
ui.size.width = contPos.width - 7;
}
}
});
});
我去掉了对话框中预配置的resizable选项,直接把选项写出来。同样,遏制在这里不起作用,所以我必须制作自己的自定义调整大小逻辑。最后,这符合您的预期。
其中一个奇怪或警告是,它正在读取鼠标移动,并且即使鼠标超出边界也会继续这样做。所以 Top 和 Left 停止了......但是宽度和高度继续增长。我不知道为什么,你知道我会把矛头指向哪里。
我确实尝试过切换您的库,并且调整大小……好一点。高度仍然很奇怪,但宽度却没有。看这里:https://jsfiddle.net/Twisty/2vaf3dr5/44/
这应该可以帮助您,希望对您有所帮助。