Tarayıcıyı yeniden boyutlandırırken jQuery UI iletişim kutusu nasıl otomatik ortalanır?


101

Jquery UI iletişim kutusunu kullandığınızda, bir şey dışında her şey iyi çalışır. Tarayıcı yeniden boyutlandırıldığında, iletişim kutusu başlangıç ​​konumunda kalır ve bu gerçekten can sıkıcı olabilir.

Şurada test edebilirsiniz: http://jqueryui.com/demos/dialog/

"Kalıcı iletişim kutusu" örneğini tıklayın ve tarayıcınızı yeniden boyutlandırın.

Tarayıcı yeniden boyutlandırıldığında diyalogların otomatik olarak ortalanmasına izin vermeyi çok isterim. Bu, uygulamamdaki tüm diyaloglarım için verimli bir şekilde yapılabilir mi?

Çok teşekkürler!

Yanıtlar:


161

positionSeçeneği ayarlamak bunu zorlayacaktır, bu yüzden burada kullandığım tüm diyaloglarınızı kapsayan aynı seçiciyi kullanın #dialog(eğer bulamazsa, tüm jQuery gibi hiçbir işlem yapılmaz):

1.10'dan önceki jQuery kullanıcı arayüzü

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

jQuery UI 1.10 veya üstü

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

İşte sadece yukarıdaki kodu ekleyen aynı jQuery UI demo sayfası , pencerenin resizeetkinliğine sadece bir işleyici ekliyoruz .resize(), böylece uygun zamanda yeniden ortalamayı tetikliyor.


teşekkürler, bu harika görünüyor. Belki de diyaloğumun kimliğinin ne olduğunu her zaman bilmediğimi söylemeliydim (bu iletişim kutusunu nasıl hedefleyebilirim?): Var $ dialog = $ ('<div> <a href = "#" title = "İptal"> İptal </a> </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Assets Manager ', modal: true, closeOnEscape: true, düğmeler: düğmeler, genişlik: 840, yükseklik: 500}); $ dialog.dialog ('aç');
Jorre

11
@Jorre - Bir diyalog oluşturduğunuzda hepsi aynı sınıfı alır, bunu genel hale getirmek için bunu yapabilirsiniz: $(".ui-dialog-content").dialog("option", "position", "center");bu, herhangi bir diyalog olup olmadığını kontrol eder :)
Nick Craver

3
Maalesef önerilen yanıt, iletişim kutusunun kötü bir şekilde yeniden boyutlandırılmasını etkiliyor. SE tutamacıyla yeniden boyutlandırmaya çalıştığınızda, iletişim kutusu 4 tarafta da yeniden boyutlandırılır.

2
Yeniden boyutlandırma olayını azaltmanızı veya iptal etmenizi öneririm. IE7 ve IE8'in, yeniden boyutlandırma işleyicisinin çok fazla kez çalışması nedeniyle iletişim kutusunu görünüm alanının "dışına" taşıdığını gördüm.
BStruthers

2
JQuery kullanıcı arayüzünün daha yeni sürümlerinde, "center" yerine {my: "center", at: "center", of: window} kullanmam gerekiyordu. 1.11.0 kullanıyorum.
Mike Dotterer

20

Ellesedil'in cevabına alternatif olarak,

Bu çözüm benim için hemen işe yaramadı, bu yüzden aşağıdakini yaptım ki bu da dinamik ama kısaltılmış bir versiyon:

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

Yine de Ellesedil için +1

DÜZENLE:

Tekli diyaloglar için harika çalışan çok daha kısa versiyon:

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

Dokunmak istemediğiniz bazı benzersiz diyaloglara sahipseniz .each () 'in kullanılması gerekli değildir.


.ui-dialog-content sınıfının kullanılması tüm diyaloglar içindir, kabul edilen cevap belirli bir diyalog içindir
Pierre

Ah doğru. Afedersiniz. Düzenlemede ilk bakışta farkı fark etmedim.
Ellesedil

Bu yaklaşımı yarı başarılı kullanıyorum. Reklamı yapıldığı gibi yapar, ancak iOS 7 mobil safari, klavye açıksa gerçekten boğulur. Girişi bulanıklaştırmaya () çalıştım, ancak Gingerbread klavyeyi bir yeniden boyutlandırma olayı olarak görüyor ve giriş girişine asla izin vermeyen bir döngüde sıkışıp kalıyor. Bununla yüzleşen başka kimse var mı?
Joseph Juhnke

Belki .resize()sayaç ulaşırsa 10veya 20sonra ulaşırsa dışına ve içine bir sayaç ekleyin break;, bu sorunu yaşamadım, bu Cihazları / Tarayıcıları karşılamıyorum.
Pierre 14

İlk öneriniz formda çalıştı ve @Ellesedil'in cevabı olmadı.
akousmata

13

Nick'in cevabını daha esnek bir şekilde kullanan daha kapsamlı bir cevap burada bulunabilir .

Bu konuya ilişkin alaka kodunun bir uyarlaması aşağıdadır. Bu uzantı, esasen, doğru veya yanlışı kabul eden autoReposition adlı yeni bir iletişim kutusu ayarı oluşturur. Kod yazıldığı şekliyle varsayılan olarak true seçeneğini belirler. Sayfalarınızın bundan yararlanabilmesi için bunu projenizdeki bir .js dosyasına koyun.

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

Bu, sayfanızda iletişim kutunuzu oluştururken bu yeni ayar için "doğru" veya "yanlış" sağlamanıza olanak tanır.

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

Şimdi bu iletişim kutusu her zaman kendisini yeniden konumlandıracaktır. Otomatik Yeniden Konumlandırma (veya ayarı ne derseniz deyin), varsayılan konumu olmayan tüm iletişim kutularını işleyebilir ve pencere yeniden boyutlandırıldığında bunları otomatik olarak yeniden konumlandırabilir. İletişim kutusunu oluşturduğunuzda bunu ayarladığınızdan, bir şekilde bir iletişim kutusu belirlemenize gerek yoktur çünkü yeniden konumlandırma işlevi iletişim kutusunun kendisinde yerleşik hale gelir. Ve en iyi yanı, bu her diyalog için ayarlandığından, bazı diyalogların kendilerini yeniden konumlandırmasına ve diğerlerinin olduğu yerde kalmasına sahip olmanızdır.

Tam çözüm için jQuery forumlarında scott.gonzalez kullanıcısına kredi verin.


Bu eklenti / düzenleme, Temmuz 2014 itibariyle artık çalışmıyor gibi görünüyor. @ Pierre'in cevabı hala çalışıyor.
dejenere

@degenerate: jQuery'ye yapılan güncellemelerin söz diziminde biraz değişiklik gerektirmesi mümkündür. Artık çalışmıyorum veya bunu uyguladığım projeye erişimim bile yok (aslında şu anda API yazıyorum), bu nedenle son jQuery sürümleri için herhangi bir değişiklik gerekip gerekmediğini belirlemenin kolay bir yolu yok.
Ellesedil

Bu cevap, son sürümler için geçerli değildir. Ama fikir harika. Bu, pencere yeniden boyutlandırma işleyicimin içeriği: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });Harika çalışıyor :)
nacho4d

@ nacho4d: Yanıtı düzenlemekten ve çalıştığınız jquery sürümü için yeni kodu en alta eklemekten çekinmeyin.
Ellesedil

1
@Ellesedil İlk kod parçanızdaki birkaç satırı değiştirdim. Aslında scott.gonzalez'in konuya ilk yazdığı şey buydu. O değişti neden bilmiyorum $( "#dialog" ).dialog( "option", "position" ) için $(this).data("dialog").options.positionsonradan. Her neyse, şimdi bu cevap çalışıyor!
nacho4d

2

Çalışan başka bir yalnızca CSS seçeneği budur. Negatif kenar boşlukları boyunuzun yarısına ve genişliğinizin yarısına eşit olmalıdır. Yani bu durumda, diyaloğum 720 piksel genişliğinde ve 400 piksel yüksekliğinde. Bu, onu dikey ve yatay olarak ortalar.

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

2

Alternatif olarak jQuery kullanıcı arabirimi konumu kullanılabilir,

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

0

Herkese merhaba!

Vanilla JS çözümü:

(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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.