【问题标题】:How to auto-center jQuery UI dialog when resizing browser?调整浏览器大小时如何自动居中 jQuery UI 对话框?
【发布时间】:2010-06-17 08:44:30
【问题描述】:

当您使用 jquery UI 对话框时,一切正常,除了一件事。 当浏览器调整大小时,对话框只是停留在它的初始位置,这真的很烦人。

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

单击“模态对话框”示例并调整浏览器大小。

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

【问题讨论】:

    标签: jquery jquery-ui modal-dialog


    【解决方案1】:

    设置position option 将强制执行此操作,因此只需使用相同的选择器覆盖我在此处使用#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});
    });
    

    Here's that same jQuery UI demo page adding only the code above,我们只是用.resize() 为窗口的resize 事件添加一个处理程序,因此它会在适当的时间触发重新居中。 ​

    【讨论】:

    • 谢谢,看起来很棒。也许我应该告诉我,我并不总是知道我的对话框的 ID 是什么,就像这样(我如何定位那个对话框?): var $dialog = $('') .html(assetBrowser) .dialog({ autoOpen: false, title: 'Assets Manager', modal: true, closeOnEscape: true, 按钮:按钮,宽度:840,高度:500 }); $dialog.dialog('open');
    • @Jorre - 当你创建一个对话框时,它们都得到相同的类,为了使其通用,你可以这样做:$(".ui-dialog-content").dialog("option", "position", "center");,这将检查任何对话框:)
    • 不幸的是,提出的答案会严重影响对话框的大小。当您尝试使用 SE 句柄调整它的大小时,对话框的所有 4 面都会调整大小。
    • 我建议限制或消除调整大小事件。我已经看到 IE7 和 IE8 将对话框“移出”视口,因为调整大小处理程序执行了太多次。
    • 在较新版本的 jQuery UI 上,我需要使用 { my: "center", at: "center", of: window } 而不是 "c​​enter"。我正在使用 1.11.0。
    【解决方案2】:

    除了 Ellesedil 的回答之外,

    该解决方案并没有立即为我工作,所以我做了以下也是动态但缩短的版本:

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

    虽然 Ellesedil 是 +1

    编辑:

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

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

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

    【讨论】:

    • 使用 .ui-dialog-content 类适用于所有对话,接受的答案适用于特定对话
    • 啊,对。对不起。在编辑中乍一看没有注意到区别。
    • 我使用这种方法是半成功的。它确实像宣传的那样,但如果键盘启动,iOS 7 移动 safari 真的会窒息。我试图 blur() 输入,但 Gingerbread 将键盘向上视为调整大小事件并卡在一个不允许输入条目的循环中。还有其他人面临这个问题吗?
    • 也许在.resize()之外添加一个计数器,如果计数器达到1020然后break;,我没有这个问题,我不满足那些设备/浏览器。你必须尝试一个解决方案,如果它被卡住了,你可以摆脱它
    • 您的第一个建议有效,而@Ellesedil 的回答无效。
    【解决方案3】:

    可以找到更全面的答案,它以更灵活的方式使用尼克的答案here

    来自该线程的相关代码的改编如下。这个扩展本质上创建了一个名为 autoReposition 的新对话框设置,它接受真或假。编写的代码默认选项为 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'));
                }
            });
        });
    

    这允许您在页面上创建对话框时为此新设置提供“真”或“假”。

    $(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 版本是否需要任何更改。
    • 此答案不适用于最新版本。但这个想法很棒。这是我的窗口调整大小处理程序的内容:$(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } }); 效果很好:)
    • @nacho4d:随意编辑答案,并将您正在使用的任何 jquery 版本的新代码添加到底部。
    • @Ellesedil 我刚刚在您的第一段代码中更改了几行。实际上这是 scott.gonzalez 在线程中首先写的。不知道为什么后来他把$( "#dialog" ).dialog( "option", "position" ) 改成了$(this).data("dialog").options.position。无论如何,现在这个答案有效!
    【解决方案4】:

    也可以使用jQuery ui position

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

    【讨论】:

      【解决方案5】:

      另一个有效的纯 CSS 选项是这个。负边距应该等于一半的高度和一半的宽度。所以在这种情况下,我的对话框是 720px 宽 x 400px 高。这会将其垂直和水平居中。

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

      【讨论】:

        【解决方案6】:

        大家好!

        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
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多