Comment Auto-center jQuery UI dialogue lors du redimensionnement du navigateur?

Lorsque vous utilisez jQuery UI dialog, tout fonctionne bien, sauf pour une chose. Lorsque le navigateur est redimensionnée, le dialogue reste dans sa position initiale qui peut être vraiment ennuyeux.

Vous pouvez le tester sur: http://jqueryui.com/demos/dialog/

Cliquez sur l'exemple "Dialogue modal" et redimensionnez votre navigateur.

J'aimerais pouvoir laisser les boîtes de dialogue s'auto-centrer lorsque le navigateur se redimensionne. Cela peut être fait de manière efficace pour toutes mes boîtes de dialogue dans mon app?

Merci beaucoup!

95
demandé sur Nick Craver 2010-06-17 12:44:30

6 réponses

Réglage du position l'option va forcer cela, alors utilisez simplement le même sélecteur couvrant toutes vos boîtes de dialogue où j'utilise #dialog ici (s'il ne les trouve pas, aucune action n'est prise, comme tous les jQuery):

JQuery UI avant 1.10

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

JQuery UI 1.10 ou supérieur

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

Voici la même page de démonstration de L'interface utilisateur jQuery en ajoutant uniquement le code ci-dessus , nous ajoutons simplement un gestionnaire à l'événement resize de la fenêtre avec .resize(), donc, il déclenche le re-centrer au moment approprié. ​

151
répondu Nick Craver 2014-12-15 19:01:49

Alternativement à la réponse D'Ellesedil,

Cette solution n'a pas fonctionné pour moi tout de suite, donc j'ai fait ce qui suit qui est aussi une version dynamique mais raccourcie:

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

+1 pour Ellesedil si

Modifier:

Version beaucoup plus courte qui fonctionne très bien pour les boîtes de dialogue simples:

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

Il n'est pas nécessaire .each () à utiliser peut-être si vous avez des boîtes de dialogue uniques que vous ne voulez pas toucher.

18
répondu Pierre 2013-06-18 16:51:25

Une réponse plus complète, qui utilise la réponse de Nick d'une manière plus flexible peut être trouvée ici.

Une adaptation du code de pertinence de ce thread est ci-dessous. Cette extension crée essentiellement un nouveau paramètre de dialogue appelé autoReposition qui accepte un vrai ou faux. Le code comme écrit par défaut l'option à true. Mettre cela en un .fichier js dans votre projet afin que vos pages puissent l'exploiter.

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

Cela vous permet de fournir un "vrai" ou "faux" pour cela nouveau paramètre lorsque vous créez votre boîte de dialogue sur votre page.

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

Maintenant, cette boîte de dialogue se repositionnera toujours. AutoReposition (ou tout ce que vous appelez le paramètre) peut gérer toutes les boîtes de dialogue qui n'ont pas de position par défaut et les repositionner automatiquement lorsque la fenêtre se redimensionne. Puisque vous définissez cela lorsque vous créez la boîte de dialogue, vous n'avez pas besoin d'identifier une boîte de dialogue car la fonctionnalité de repositionnement est intégrée dans la boîte de dialogue elle-même. Et la meilleure partie est que, depuis ceci est défini par boîte de dialogue, vous pouvez avoir certaines boîtes de dialogue se repositionner et d'autres restent où elles sont.

Crédit à l'utilisateur scott.gonzalez sur les forums jQuery pour la solution complète.

13
répondu Ellesedil 2015-08-21 14:20:46

Une autre option CSS uniquement qui fonctionne est la suivante. Les marges négatives devraient être égales à la moitié de votre hauteur et à la moitié de votre largeur. Donc, dans ce cas, ma boîte de dialogue est de 720px de large par 400px de haut. Ce centre verticalement et horizontalement.

.ui-dialog {
  top:50% !important;
  margin-top:-200px !important; 
  left:50% !important;
  margin-left:-360px !important
}
2
répondu Kirk Ross 2014-10-07 22:51:18

Sinon jQuery ui position peut être utilisé,

$(window).resize(function ()
{
    $(".ui-dialog").position({
        my: "center", at: "center", of: window
    });
});
2
répondu AkilaI 2016-10-18 13:20:09

Bonjour à tous!

Solution js vanille:

(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 });
  }
}());
0
répondu Alexandr Kazakov 2017-06-07 16:54:16