Как центрировать диалоговое окно JQuery после изменения размера браузера

Что я пытаюсь сделать. Когда мой браузер развернут и я открываю диалоговое окно JQuery, оно, как и ожидалось, открывает его в центре. Однако, когда я изменяю размер браузера, чтобы он был немного меньше ширины диалогового окна, а затем открываю диалоговое окно, он всегда открывает его с выравниванием по левому краю. С куском пространства справа.

Код

$(document).ready(function() { 
     var dlg = '';

     dlg=$('#ticketDetails').dialog({
        title: 'TICKET DETAILS',
        resizable: true,
        autoOpen:false,
        modal: true,
        show:'fast',
        hide: 'fade',
        buttons:{ "Close": function() { dlg.dialog("close"); } },
        close: function(e, i) { dlg.hide(); },
        width:1250

     });

Что я пробовал:

$(window).resize(function() {
    $('#ticketDetails').dialog({position: ['center', 'center']});
});

Я прочитал некоторые ответы и попробовал несколько вариантов, но, похоже, ничего не работает ...

Дополнительная информация:

http://jsfiddle.net/39GqM/479/

Если вы прокрутите полосу посередине до упора влево, а затем запустите ее, вы заметите, что для просмотра содержимого диалогового окна справа вам нужно перетащить его влево за строку заголовка, и только тогда полоса прокрутки будет появляться.

Следующий экран - когда браузер работает в полноэкранном режиме. Как видите, содержание идеально подходит: введите описание изображения здесь

Теперь размер страницы был изменен, и я открыл диалоговое окно. Как видите, он выровнен по левому краю. Полоса прокрутки отсутствует, и единственный способ получить полосу прокрутки - перетащить диалоговое окно влево (с помощью курсора, который появляется в заголовке), чтобы появилась полоса прокрутки. Это единственный способ увидеть содержимое справа (начало абзаца / заголовка). введите  описание изображения здесь


person greenpool    schedule 19.02.2013    source источник
comment
Какое желаемое поведение? Как вы хотите отобразить диалоговое окно, которое слишком велико для окна? Вы хотите, чтобы он был по центру, с обрезанными обеими сторонами?   -  person tcovo    schedule 18.03.2013


Ответы (5)


Я настоятельно рекомендую использовать медиазапросы css для достижения этой цели и использовать polyfill в качестве запасного варианта, если вы поддерживаете IE8 и ниже.

Вот мое решение на jsfiddle:

http://jsfiddle.net/39GqM/505/

    .ui-dialog {
      min-width: 80%;  
      width: 80% !important;
   } 
   @media only screen and (min-width: 1200px) {
     .ui-dialog {
        width: 1000px !important;
    } 
   }

   @media only screen and (max-width: 1000px) {
    .ui-dialog {
        min-width: 80%;  
        width: 80% !important;
    }
  }

Таким образом, вы будете нацелены на класс .ui-dialog, поскольку jQuery-UI добавляет кучу разметки в DOM, и я помещаю правило! Important, чтобы принудительно переопределить. Не добавляйте ширину диалогового окна при вызове виджета, позвольте CSS обработать это.

$("#dialog").dialog();

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

Для более старых версий браузеров проверьте это репо на github и выполните поиск в окне для медиа-запросов: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills

Реализация полифилла обычно довольно проста, но, на мой взгляд, это должен быть другой вопрос. Надеюсь, поможет.

Ваше здоровье

person Ady Ngom    schedule 18.03.2013
comment
Спасибо. Это действительно может сработать. Я не очень разбираюсь в медиа-запросах. Есть ли способ установить минимальную ширину диалогового окна независимо от того, насколько маленьким становится изменение размера окна? - person greenpool; 19.03.2013
comment
@greenpool на самом деле это то, что делает первое правило, оно по умолчанию устанавливает ширину 80%, код в медиа-запросах запускается только при выполнении условия. Итак, если вы хотите иметь фиксированную ширину, вы должны изменить значение 80%, которое вы видите в CSS, на эту новую ширину или еще лучше добавить min-width: [x] px; в первом блоке, и это позаботится об этом. Дайте мне знать, если вы хотите, чтобы он был добавлен в скрипку. Ваше здоровье - person Ady Ngom; 19.03.2013
comment
Ваше здоровье. Думаю, теперь я приступил к работе так, как хотел. спасибо за развернутый ответ! - person greenpool; 19.03.2013

Я сделал это в операторе создания внутри параметров диалогового окна. Мой диалог находится в центре экрана.

create : function() {
             $(window).resize(function() {
                $("#myDialog").parent().position({ 
                                    my : "center",
                                    at : "center",
                                    of : window
                                    });
             });
             $(window).scroll(function() {
                $("#myDialog").parent().position({
                                   my : "center",
                                   at : "center",
                                   of : window
                                   });
             });
},

Где в конце диалога я привязал функцию позиционирования.

$("#myDialog").dialog({

 // do stuff
 // also add the positioning with "create"

}).parent().position({
     my : "center center",
     at : "center center+20",
     of : window
 });

скрипка: http://jsfiddle.net/djwave28/yf8fR/4/

person Daniel    schedule 18.03.2013
comment
Хорошо работает в jQuery UI - v1.12.1 - person Asela Senanayake; 05.12.2016

Ты пытался :

$(window).resize(function() {
    $("#ticketDetails").dialog("option", "position", "center");
});
person Vincent Decaux    schedule 19.02.2013

Изменить

решение - обновить jQuery до версии 1.8.6 или более поздней версии + jQuery UI до версии 1.9.2. по-видимому, это ошибка, и ее исправили в более новых версиях.

Тот же пример с обновленным jQuery: http://jsfiddle.net/39GqM/490/

ты должен попробовать это

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

-> пример ‹-

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

person Iliya Reyzis    schedule 19.02.2013
comment
Спасибо за это, но попробуйте установить width примерно на 1000, запустить его в полном окне, а затем минимизировать окно настолько, чтобы оно было меньше ширины диалогового окна, и вы поймете, что я имею в виду. - person greenpool; 19.02.2013
comment
Я запускаю его на машине разработчика, поэтому не могу поделиться, но, пожалуйста, см. "Редактировать". - person greenpool; 20.02.2013
comment
Я красил ваше «Дополнительная информация» отредактировал, и я понимаю, что вы говорите, но я не понял, что вы написали вверху - ›С небольшим пространством справа. Я тестировал его разными способами, и когда вы открываете jsfiddle, когда он меньше, чем диалог, диалог начинается с правой стороны и скрывается с левой стороны, вы это имели в виду? Что вы пытаетесь достичь? сделать его масштабируемым? - person Iliya Reyzis; 20.02.2013
comment
пожалуйста, смотрите скриншот добавлен. - person greenpool; 21.02.2013

Проблема вызвана тем, что jQueryUI пытается position yourfixed с диалоговым окном, когда его недостаточно доступное пространство - логика коллизий. collision по умолчанию для .dialog() = подходит.

"fit": сдвинуть элемент от края окна.

Я пробовал использовать другие параметры столкновения: перевернуть, перевернуть, нет, но поскольку width="1000px" jQueryUI не может найти подходящего места для диалога.

Если задать диалоговому окну динамическую ширину и привязать событие window.resize(), диалоговое окно всегда будет занимать 80% ширину документа и всегда перемещать по центру. См. демонстрацию

CSS

.width-80 {
  width:80% !important;
}

JavaScript

var $dialog = $('#dialog');
$dialog.dialog({ dialogClass: 'width-80' });

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

HTML

<div id="dialog" title="Basic dialog">
    <p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
</div>
person andyb    schedule 19.03.2013