调整浏览器大小时如何自动居中jQuery UI对话框?


100

当您使用jquery UI对话框时,除一件事情外,其他所有方法都工作正常。调整浏览器的大小后,对话框将停留在其初始位置,这可能确实很烦人。

您可以在以下网址进行测试:http : //jqueryui.com/demos/dialog/

单击“模式对话框”示例,然后调整浏览器的大小。

我希望能够在浏览器调整大小时让对话框自动居中。是否可以对我的应用程序中的所有对话框以有效的方式完成?

非常感谢!

Answers:


160

设置该position选项将强制执行此操作,因此只需使用相同的选择器覆盖您在#dialog此处使用的所有对话框即可(如果找不到它们,则不执行任何操作,就像所有jQuery一样):

1.10之前的jQuery UI

$(window).resize(function() {
    $("#dialog").dialog("option", "position", "center");
});

jQuery UI 1.10或更高版本

$(window).resize(function() {
    $("#dialog").dialog("option", "position", {my: "center", at: "center", of: window});
});

这是相同的jQuery UI演示页面,仅添加了上面的代码,我们只是使用向窗口resize事件添加了处理程序.resize(),因此它会在适当的时间触发重新居中。


谢谢,这看起来很棒。也许我应该告诉我,我并不总是知道对话框的ID是什么,就像这样(我如何定位该对话框?):var $ dialog = $('<div> <a href =“#” title =“ Cancel”>取消</a> </a> </ div>').html(assetBrowser).dialog({autoOpen:false,title:'Assets Manager',modal:true,closeOnEscape:true,按钮:按钮,宽度:840,高度:500});$ dialog.dialog('open');
Jorre 2010年

11
@Jorre-创建对话框时,它们都具有相同的类,要使其具有通用性,您可以执行以下操作:$(".ui-dialog-content").dialog("option", "position", "center");,这将检查是否存在任何对话框:)
Nick Craver

3
不幸的是,提出的答案会严重影响对话框的大小。当您尝试使用SE手柄调整大小时,对话框的所有4个面都会被调整大小。

2
我建议限制或取消调整大小事件。由于调整大小处理程序执行了太多次,我已经看到IE7和IE8将对话框移到视口“外部”。
BStruthers

2
在较新版本的jQuery UI上,我需要使用{my:“ center”,at:“ center”,of:window}代替“ center”。我正在使用1.11.0。
Mike Dotterer 2014年

20

除了Ellesedil的答案,

该解决方案无法立即为我工作,因此我做了以下一些动态的但简短的版本:

$( window ).resize(function() {
    $(".ui-dialog-content:visible").each(function () {
        $( this ).dialog("option","position",$(this).dialog("option","position"));
    });
});

埃勒塞迪尔+1

编辑:

短得多的版本非常适合单个对话框:

$(window).resize(function(){
    $(".ui-dialog-content").dialog("option","position","center");
});

如果您有一些不想触摸的独特对话框,则不必使用.each()。


使用类.ui-dialog-content用于所有对话框,可接受的答案用于特定对话框
Pierre

嗯对 抱歉。乍一看,在编辑中没有发现区别。
Ellesedil

我正在成功使用这种方法。它的功能与广告宣传的一样,但是如果键盘向上,iOS 7移动浏览器确实会窒息。我试图模糊输入,但是Gingerbread将键盘视为调整大小事件,并陷入了一个永远不允许输入的循环中。还有其他人面对吗?
Joseph Juhnke 2014年

也许.resize()在计数器达到1020之后在内部和外部添加一个计数器break;,我没有遇到这个问题,我不照顾那些设备/浏览器。您必须尝试一种解决方案,如果它卡住了,您可以摆脱它
Pierre

您的第一个建议有效,而@Ellesedil的答案无效。
akousmata

13

此处可以找到更全面的答案,该答案以更灵活的方式使用尼克的答案。

来自该线程的相关代码的改编如下。此扩展实质上创建了一个名为autoReposition的新对话框设置,该设置接受true或false。编写的代码默认将选项设置为true。将其放入项目中的.js文件,以便您的页面可以利用它。

    $.ui.dialog.prototype.options.autoReposition = true;
    $(window).resize(function () {
        $(".ui-dialog-content:visible").each(function () {
            if ($(this).dialog('option', 'autoReposition')) {
                $(this).dialog('option', 'position', $(this).dialog('option', 'position'));
            }
        });
    });

这样,当您在页面上创建对话框时,就可以为此新设置提供“ true”或“ false”。

$(function() {
    $('#divModalDialog').dialog({
        autoOpen: false,
        modal: true,
        draggable: false,
        resizable: false,
        width: 435,
        height: 200,
        dialogClass: "loadingDialog",
        autoReposition: true,    //This is the new autoReposition setting
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
            }
        }
    });
});

现在,此对话框将始终重新定位自身。AutoReposition(或任何您称呼的设置)可以处理没有默认位置的所有对话框,并在调整窗口大小时自动将其重新放置。由于在创建对话框时进行了设置,因此无需以某种方式标识对话框,因为重新定位功能已内置在对话框本身中。最好的部分是,由于此对话框是按对话框设置的,因此您可以让某些对话框重新定位自己,而其他对话框则保留在原处。

感谢完整的解决方案在jQuery论坛上的用户scott.gonzalez。


截至2014年7月,此插件/编辑似乎不再起作用。@ Pierre的回答仍然有效。
退化

@degenerate:更新jQuery可能需要对语法进行一些更改。我不再工作,甚至无法访问实现此功能的项目(实际上,我正在编写API),所以我没有一种简单的方法来确定最新jQuery版本是否需要任何更改。
Ellesedil 2014年

此答案不适用于最新版本。但是这个主意很棒。这是我的窗口大小调整处理程序的内容:$(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });很好用:)
nacho4d

@ nacho4d:随意编辑答案,并将您正在使用的任何jquery版本的更新代码添加到底部。
Ellesedil

1
@Ellesedil我刚刚在您的第一段代码中更改了几行。实际上,这是scott.gonzalez在线程中首先编写的内容。我不知道为什么他后来改$( "#dialog" ).dialog( "option", "position" ) $(this).data("dialog").options.position。无论如何,现在这个答案有效!
nacho4d

2

另一个仅CSS选项有效。负边距应等于您的高度的一半和宽度的一半。因此,在这种情况下,我的对话框为720px宽x 400px高。这使它垂直和水平居中。

.ui-dialog {
  top:50% !important;
  margin-top:-200px !important; 
  left:50% !important;
  margin-left:-360px !important
}

2

另外,也可以使用jQuery ui 位置

$(window).resize(function ()
{
    $(".ui-dialog").position({
        my: "center", at: "center", of: window
    });
});

0

大家好!

Vanilla JS解决方案:

(function() {
  window.addEventListener("resize", resizeThrottler, false);

  var resizeTimeout;

  function resizeThrottler() {
    if (!resizeTimeout) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
      }, 66);
    }
  }

  function actualResizeHandler() {
    $(".ui-dialog-content").dialog("option", "position", { my: "center", at: "center", of: window });
  }
}());

$.isVanillaJS == false
安德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.