Как автоматически центрировать диалог jQuery UI при изменении размера браузера?

92

Когда вы используете диалог jquery UI, все работает хорошо, за исключением одной вещи. Когда размер браузера изменяется, диалог просто остается в исходной позиции, что может быть очень раздражающим.

Вы можете проверить это на: http://jqueryui.com/demos/dialog/

Нажмите "пример модального диалога" и измените размер вашего браузера.

Мне бы очень хотелось, чтобы диалоги автоматически центрировались при изменении размера браузера. Это можно сделать эффективным образом для всех моих диалогов в моем приложении?

Спасибо большое!

Теги:
modal-dialog

6 ответов

153
Лучший ответ

Установка параметра position заставит его использовать, поэтому используйте тот же селектор, который охватывает все ваши диалоги, где я использую #dialog здесь ( если он не находит их, никаких действий не предпринимается, как и все jQuery):

jQuery UI до 1.10

$(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(), поэтому он запускает повторный центр в соответствующее время.   

  • 0
    спасибо, это выглядит великолепно. Может быть, мне следовало сказать, что я не всегда знаю, каков ID моего диалога, например, вот так (как мне настроить таргетинг на этот диалог?): Var $ dialog = $ ('<div> <a href = "#" title = "Отмена"> Отмена </a> </a> </ div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Менеджер активов ', модальный: true, closeOnEscape: true, кнопки: кнопки, ширина: 840, высота: 500}); $ Dialog.dialog ( 'открытый');
  • 11
    @Jorre - все они получают один и тот же класс при создании диалога, чтобы сделать его универсальным, вы можете сделать это: $(".ui-dialog-content").dialog("option", "position", "center"); , это проверит для любого диалога :)
Показать ещё 11 комментариев
17

В качестве альтернативы ответ Ellesedil,

Это решение не сработало для меня сразу, поэтому я сделал следующее, которое также является динамическим, но сокращенным вариантом:

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

+1 для Ellesedil хотя

EDIT:

Много более короткая версия, которая отлично подходит для одиночных диалогов:

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

Не обязательно использовать .each(), возможно, если у вас есть уникальные диалоги, которые вы не хотите касаться.

  • 0
    Это ничем не отличается от принятого ответа.
  • 0
    использование класса .ui-dialog-content для всех диалогов, принятый ответ для конкретного диалога
Показать ещё 7 комментариев
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 (или все, что вы вызываете параметр) может обрабатывать любые диалоги, которые не имеют позиции по умолчанию и автоматически переупорядочивают их при изменении размера окна. Поскольку вы настраиваете это при создании диалогового окна, вам не нужно каким-либо образом идентифицировать диалоговое окно, потому что функция перепозиционирования становится встроенной в сам диалог. И самое главное, так как это задано для каждого диалога, вы можете изменить некоторые диалоги, а другие останутся там, где они есть.

Кредит пользователю scott.gonzalez на форумах jQuery для полного решения.

  • 0
    Похоже, что это дополнение / правка больше не работает с июля 2014 года. Ответ от @Pierre работает до сих пор.
  • 0
    @degenerate: вполне возможно, что для обновления jQuery может потребоваться некоторое изменение синтаксиса. Я больше не работаю или даже не имею доступа к проекту, в котором я это реализовал (на самом деле, я сейчас пишу API), поэтому у меня нет простого способа определить, нужны ли какие-либо изменения для последних версий jQuery.
Показать ещё 3 комментария
2

Другой вариант CSS-only, который работает, - это. Отрицательные поля должны быть равны половине вашей высоты и половине вашей ширины. Таким образом, в этом случае мой диалог имеет ширину 720 пикселей и высоту 400 пикселей. Это центрирует его по вертикали и по горизонтали.

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

В качестве альтернативы можно использовать jQuery ui position,

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню