Làm cách nào để tự động căn giữa hộp thoại jQuery UI khi thay đổi kích thước trình duyệt?


100

Khi bạn sử dụng hộp thoại jquery UI, tất cả đều hoạt động tốt, ngoại trừ một thứ. Khi trình duyệt được thay đổi kích thước, hộp thoại vẫn ở vị trí ban đầu, điều này có thể thực sự gây khó chịu.

Bạn có thể kiểm tra nó trên: http://jqueryui.com/demos/dialog/

Nhấp vào ví dụ "hộp thoại phương thức" và thay đổi kích thước trình duyệt của bạn.

Tôi muốn có thể để hộp thoại tự động căn giữa khi trình duyệt thay đổi kích thước. Điều này có thể được thực hiện một cách hiệu quả cho tất cả các hộp thoại trong ứng dụng của tôi không?

Cảm ơn rất nhiều!

Câu trả lời:


160

Đặt positiontùy chọn sẽ buộc điều này, vì vậy chỉ cần sử dụng cùng một bộ chọn bao gồm tất cả các hộp thoại của bạn mà tôi sử dụng #dialogở đây (nếu không tìm thấy chúng thì không có hành động nào được thực hiện, như tất cả jQuery):

jQuery UI trước 1.10

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

jQuery UI 1.10 trở lên

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

Đây là trang demo giao diện người dùng jQuery tương tự chỉ thêm đoạn mã ở trên , chúng tôi chỉ thêm một trình xử lý vào resizesự kiện của cửa sổ với .resize(), vì vậy nó sẽ kích hoạt căn giữa lại vào thời điểm thích hợp. Các bác sĩ cho biết:


cảm ơn, trông rất tuyệt. Có lẽ tôi nên nói rằng tôi không phải lúc nào cũng biết ID của hộp thoại của mình là gì, như thế này (làm cách nào để nhắm mục tiêu hộp thoại đó?): Var $ hộp thoại = $ ('<div> <a href = "#" title = "Cancel"> Huỷ </a> </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Assets Manager ', modal: true, closeOnEscape: true, các nút: nút, chiều rộng: 840, chiều cao: 500}); $ voice.dialog ('mở');
Jorre

11
@Jorre - Tất cả họ đều có được cùng lớp khi bạn tạo một hộp thoại, để làm cho nó chung chung, bạn có thể làm điều này: $(".ui-dialog-content").dialog("option", "position", "center");, điều này sẽ kiểm tra xem có bất kỳ hộp thoại :)
Nick Craver

3
Rất tiếc, câu trả lời được đề xuất ảnh hưởng xấu đến việc thay đổi kích thước hộp thoại Khi bạn cố gắng thay đổi kích thước nó bằng tay cầm SE, hộp thoại sẽ được thay đổi kích thước ở cả 4 mặt.

2
Tôi khuyên bạn nên điều chỉnh hoặc gỡ lỗi sự kiện thay đổi kích thước. Tôi đã thấy IE7 & IE8 di chuyển hộp thoại "bên ngoài" khung nhìn do trình xử lý thay đổi kích thước thực thi quá nhiều lần.
BStruthers

2
Trên các phiên bản mới hơn của giao diện người dùng jQuery, tôi cần sử dụng {my: "center", at: "center", of: window} thay vì "center". Tôi đang sử dụng 1.11.0.
Mike Dotterer

20

Ngoài câu trả lời của Ellesedil,

Giải pháp đó không hiệu quả với tôi ngay lập tức, Vì vậy, tôi đã làm như sau, cũng là phiên bản động nhưng rút gọn:

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

+1 cho Ellesedil mặc dù

BIÊN TẬP:

Phiên bản ngắn hơn nhiều hoạt động tốt cho các hộp thoại đơn lẻ:

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

Không nhất thiết phải sử dụng .each () nếu bạn có một số hộp thoại duy nhất mà bạn không muốn chạm vào.


bằng cách sử dụng lớp .ui-thoại-nội dung là cho tất cả các hộp thoại, câu trả lời được chấp nhận là một hộp thoại cụ thể
Pierre

À, đúng rồi. Lấy làm tiếc. Thoạt nhìn không nhận thấy sự khác biệt trong bản chỉnh sửa.
Ellesedil

Tôi đang sử dụng cách tiếp cận này bán thành công. Nó hoạt động như quảng cáo nhưng safari di động iOS 7 thực sự bị nghẹt thở nếu bàn phím bật lên. Tôi đã cố gắng làm mờ () đầu vào nhưng Gingerbread thấy bàn phím lên như một sự kiện thay đổi kích thước và bị mắc kẹt trong một vòng lặp không bao giờ cho phép nhập đầu vào. Có ai khác phải đối mặt với điều này không?
Joseph Juhnke

Có thể thêm bộ đếm bên ngoài .resize()và bên trong nếu bộ đếm đạt đến 10hoặc 20sau đó break;, tôi không gặp sự cố này, tôi không phục vụ cho các Thiết bị / Trình duyệt đó. Bạn phải thử một giải pháp mà nếu nó bị mắc kẹt, bạn có thể thoát ra khỏi nó
Pierre

Đề xuất đầu tiên của bạn có hiệu quả và câu trả lời của @Ellesedil thì không.
akousmata

13

Bạn có thể tìm thấy câu trả lời toàn diện hơn, sử dụng câu trả lời của Nick theo cách linh hoạt hơn tại đây .

Dưới đây là một sự điều chỉnh của mã liên quan từ chuỗi đó. Phần mở rộng này về cơ bản tạo ra một cài đặt hộp thoại mới có tên là autoReposition chấp nhận giá trị true hoặc false. Mã như được viết mặc định tùy chọn là true. Đặt nó vào tệp .js trong dự án của bạn để các trang của bạn có thể tận dụng nó.

    $.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'));
            }
        });
    });

Điều này cho phép bạn cung cấp "true" hoặc "false" cho cài đặt mới này khi bạn tạo hộp thoại trên trang của mình.

$(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");
            }
        }
    });
});

Bây giờ hộp thoại này sẽ luôn tự định vị lại. AutoReposition (hoặc bất kỳ thứ gì bạn gọi là cài đặt) có thể xử lý bất kỳ hộp thoại nào không có vị trí mặc định và tự động định vị lại chúng khi cửa sổ thay đổi kích thước. Vì bạn đang thiết lập điều này khi tạo hộp thoại, bạn không cần phải xác định hộp thoại bằng cách nào đó vì chức năng định vị lại được tích hợp sẵn trong hộp thoại. Và phần tốt nhất là vì điều này được đặt cho mỗi hộp thoại, bạn có thể có một số hộp thoại tự định vị lại và những hộp thoại khác vẫn ở nguyên vị trí của chúng.

Tín dụng cho người dùng scott.gonzalez trên diễn đàn jQuery cho giải pháp hoàn chỉnh.


Addon / chỉnh sửa này dường như không hoạt động nữa kể từ tháng 7 năm 2014. Câu trả lời từ @Pierre vẫn hoạt động.
thoái hóa

@degenerate: Có thể các bản cập nhật cho jQuery có thể yêu cầu thay đổi cú pháp một chút. Tôi không còn làm việc hoặc thậm chí có quyền truy cập vào dự án mà tôi đã triển khai điều này (thực ra, tôi hiện đang viết API), vì vậy tôi không có cách dễ dàng để xác định xem có cần thay đổi nào cho các phiên bản jQuery gần đây hay không.
Ellesedil

Câu trả lời này không hoạt động cho các phiên bản gần đây. Nhưng ý tưởng là tuyệt vời. Đây là nội dung của điều khiển thay đổi kích thước cửa sổ của tôi: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });Nó hoạt động :) lớn
nacho4d

@ nacho4d: Vui lòng chỉnh sửa câu trả lời và thêm mã mới hơn cho bất kỳ phiên bản jquery nào bạn đang làm việc ở dưới cùng.
Ellesedil

1
@Ellesedil Tôi vừa thay đổi một vài dòng trong đoạn mã đầu tiên của bạn. Trên thực tế, đó là những gì scott.gonzalez đã viết đầu tiên trong chủ đề. Tôi không biết tại sao anh ấy lại đổi $( "#dialog" ).dialog( "option", "position" ) thành $(this).data("dialog").options.positionsau này. Dù sao, bây giờ câu trả lời này hoạt động!
nacho4d

2

Một tùy chọn chỉ CSS khác hoạt động là tùy chọn này. Các lề âm phải bằng một nửa chiều cao và một nửa chiều rộng của bạn. Vì vậy, trong trường hợp này, hộp thoại của tôi có chiều rộng 720px x chiều cao 400px. Điều này căn giữa nó theo chiều dọc và chiều ngang.

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

2

Ngoài ra, có thể sử dụng vị trí ui jQuery ,

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

0

Xin chào tất cả mọi người!

Giải pháp 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
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.