Come centrare automaticamente la finestra di dialogo dell'interfaccia utente di jQuery durante il ridimensionamento del browser?


101

Quando usi la finestra di dialogo dell'interfaccia utente di jquery, tutto funziona bene, tranne una cosa. Quando il browser viene ridimensionato, la finestra di dialogo rimane nella sua posizione iniziale, il che può essere davvero fastidioso.

Puoi provarlo su: http://jqueryui.com/demos/dialog/

Fare clic sull'esempio "finestra di dialogo modale" e ridimensionare il browser.

Mi piacerebbe poter consentire ai dialoghi di centrarsi automaticamente quando il browser viene ridimensionato. È possibile farlo in modo efficiente per tutte le mie finestre di dialogo nella mia app?

Molte grazie!

Risposte:


161

L'impostazione positiondell'opzione lo forzerà, quindi usa lo stesso selettore che copre tutte le tue finestre di dialogo dove uso #dialogqui (se non le trova non viene eseguita alcuna azione, come tutto jQuery):

jQuery UI prima della 1.10

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

jQuery UI 1.10 o versione successiva

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

Ecco la stessa pagina demo dell'interfaccia utente jQuery che aggiunge solo il codice sopra , stiamo solo aggiungendo un gestore resizeall'evento della finestra con .resize(), quindi attiva il ricentramento al momento opportuno.


grazie, sembra fantastico. Forse avrei dovuto dire che non sempre so qual è l'ID della mia finestra di dialogo, in questo modo (come posso indirizzare quella finestra di dialogo?): Var $ dialog = $ ('<div> <a href = "#" title = "Annulla"> Annulla </a> </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Assets Manager ', modal: true, closeOnEscape: true, pulsanti: pulsanti, larghezza: 840, altezza: 500}); $ dialog.dialog ('open');
Jorre

11
@Jorre - Hanno tutti la stessa classe quando crei un dialogo, per renderlo generico puoi farlo:, $(".ui-dialog-content").dialog("option", "position", "center");questo controllerà qualsiasi dialogo :)
Nick Craver

3
Purtroppo la risposta proposta influisce negativamente sul ridimensionamento della finestra di dialogo. Quando provi a ridimensionarlo con l'handle SE, la finestra di dialogo viene ridimensionata su tutti e 4 i lati.

2
Consiglio di limitare o rimuovere il rimbalzo dall'evento di ridimensionamento. Ho visto IE7 e IE8 spostare la finestra di dialogo "fuori" dalla finestra a causa del gestore di ridimensionamento eseguito troppe volte.
BStruthers

2
Nelle versioni più recenti dell'interfaccia utente jQuery, avevo bisogno di usare {my: "center", at: "center", of: window} invece di "center". Sto usando 1.11.0.
Mike Dotterer

20

In alternativa alla risposta di Ellesedil,

Quella soluzione non ha funzionato subito per me, quindi ho fatto quanto segue che è anche una versione dinamica ma abbreviata:

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

+1 per Ellesedil però

MODIFICARE:

Versione molto più breve che funziona alla grande per i dialoghi singoli:

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

Non è necessario utilizzare .each () forse se si dispone di alcune finestre di dialogo uniche che non si desidera toccare.


utilizzando la classe .ui-dialog-content è per tutte le finestre di dialogo, la risposta accettata è per una specifica finestra di dialogo
Pierre

Ah giusto. Scusate. Non ho notato la distinzione a prima vista nella modifica.
Ellesedil

Sto usando questo approccio con semi-successo. Funziona come pubblicizzato, ma iOS 7 mobile safari si strozza davvero se la tastiera è alzata. Ho tentato di sfocare () l'input ma Gingerbread vede la tastiera su come un evento di ridimensionamento e si blocca in un ciclo che non consente mai l'ingresso di input. Qualcun altro sta affrontando questo?
Joseph Juhnke

Forse aggiungi un contatore all'esterno .resize()e all'interno se il contatore raggiunge 10o 20poi break;, non ho avuto questo problema, non mi occupo di quei dispositivi / browser. Devi provare una soluzione che se è bloccata, puoi uscirne
Pierre

Il tuo primo suggerimento ha funzionato e la risposta di @Ellesedil no.
akousmata

13

Una risposta più completa, che utilizza la risposta di Nick in modo più flessibile, può essere trovata qui .

Di seguito è riportato un adattamento del codice di rilevanza da quel thread. Questa estensione crea essenzialmente una nuova impostazione della finestra di dialogo chiamata autoReposition che accetta un vero o falso. Il codice come scritto imposta l'opzione su true. Mettilo in un file .js nel tuo progetto in modo che le tue pagine possano sfruttarlo.

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

Questo ti permette di fornire un "vero" o "falso" per questa nuova impostazione quando crei la tua finestra di dialogo sulla tua pagina.

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

Ora questa finestra di dialogo si riposizionerà sempre da sola. AutoReposition (o qualunque cosa tu chiami l'impostazione) può gestire tutte le finestre di dialogo che non hanno una posizione predefinita e riposizionarle automaticamente quando la finestra viene ridimensionata. Dal momento che lo stai impostando quando crei la finestra di dialogo, non è necessario identificare una finestra di dialogo in qualche modo perché la funzionalità di riposizionamento viene incorporata nella finestra di dialogo stessa. E la parte migliore è che poiché questo è impostato per finestra di dialogo, è possibile riposizionare alcune finestre di dialogo e altre rimangono dove sono.

Ringraziamo l'utente scott.gonzalez sui forum jQuery per la soluzione completa.


Questo componente aggiuntivo / modifica sembra non funzionare più a partire da luglio 2014. La risposta di @Pierre funziona ancora.
degenerato il

@degenerate: è possibile che gli aggiornamenti a jQuery richiedano un po 'di modifiche alla sintassi. Non sto più lavorando o ho persino accesso al progetto in cui l'ho implementato (in realtà, sto attualmente scrivendo API), quindi non ho un modo semplice per determinare se sono necessarie modifiche per le recenti versioni di jQuery.
Ellesedil

Questa risposta non funziona per le versioni recenti. Ma l'idea è fantastica. Questo è il contenuto del mio gestore di ridimensionamento della finestra: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });Funziona benissimo :)
nacho4d

@ nacho4d: Sentiti libero di modificare la risposta e aggiungere il codice più recente per qualsiasi versione di jquery in cui stai lavorando in fondo.
Ellesedil

1
@Ellesedil Ho appena cambiato un paio di righe nel tuo primo pezzo di codice. In realtà è quello che ha scritto per primo scott.gonzalez nel thread. Non so perché sia ​​passato $( "#dialog" ).dialog( "option", "position" ) a $(this).data("dialog").options.positiondopo. Comunque, ora questa risposta funziona!
nacho4d

2

Un'altra opzione solo CSS che funziona è questa. I margini negativi dovrebbero essere pari a metà della tua altezza e metà della tua larghezza. Quindi, in questo caso, il mio dialogo è largo 720px per 400px alto. Questo lo centra verticalmente e orizzontalmente.

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

2

In alternativa è possibile utilizzare la posizione dell'interfaccia utente jQuery ,

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

0

Ciao a tutti!

Soluzione 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.