วิธีจัดการกล่องโต้ตอบ jQuery UI อัตโนมัติเมื่อปรับขนาดเบราว์เซอร์


101

เมื่อคุณใช้กล่องโต้ตอบ jquery UI ทุกอย่างทำงานได้ดียกเว้นสิ่งเดียว เมื่อปรับขนาดเบราว์เซอร์กล่องโต้ตอบจะอยู่ในตำแหน่งเริ่มต้นซึ่งอาจสร้างความรำคาญได้มาก

คุณสามารถทดสอบได้ที่: http://jqueryui.com/demos/dialog/

คลิกที่ตัวอย่าง "กล่องโต้ตอบโมดอล" และปรับขนาดเบราว์เซอร์ของคุณ

ฉันชอบที่จะให้กล่องโต้ตอบเป็นศูนย์กลางอัตโนมัติเมื่อเบราว์เซอร์ปรับขนาด สามารถทำได้อย่างมีประสิทธิภาพสำหรับกล่องโต้ตอบทั้งหมดในแอปของฉันหรือไม่

ขอบคุณมาก!

คำตอบ:


161

การตั้งค่า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()ดังนั้นมันจึงทริกเกอร์ re-center ในเวลาที่เหมาะสม


ขอบคุณที่ดูดีมาก บางทีฉันควรจะบอกว่าฉันไม่รู้ว่า ID ของไดอะล็อกของฉันคืออะไรเสมอไป (ฉันจะกำหนดเป้าหมายไดอะล็อกนั้นได้อย่างไร): var $ dialog = $ ('<div> <a href = "#" title = "Cancel"> ยกเลิก </a> </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Assets Manager ', modal: true, closeOnEscape: true, buttons: ปุ่มกว้าง: 840 สูง: 500}); $ dialog.dialog ('เปิด');
Jorre

11
@Jorre - พวกเขาทั้งหมดได้รับคลาสเดียวกันเมื่อคุณสร้างไดอะล็อกเพื่อให้เป็นแบบทั่วไปคุณสามารถทำได้: $(".ui-dialog-content").dialog("option", "position", "center");สิ่งนี้จะตรวจสอบไดอะล็อกใด ๆ :)
Nick Craver

3
น่าเสียดายที่คำตอบที่เสนอมีผลต่อการปรับขนาดกล่องโต้ตอบที่ไม่ดี เมื่อคุณพยายามปรับขนาดด้วย SE handle กล่องโต้ตอบจะถูกปรับขนาดทั้ง 4 ด้าน

2
ฉันแนะนำให้ควบคุมปริมาณหรือ debouncing เหตุการณ์ปรับขนาด ฉันเคยเห็น IE7 & IE8 ย้ายกล่องโต้ตอบ "นอก" วิวพอร์ตเนื่องจากตัวจัดการการปรับขนาดทำงานหลายครั้งเกินไป
BStruthers

2
สำหรับ jQuery UI เวอร์ชันใหม่กว่าฉันจำเป็นต้องใช้ {my: "center", at: "center", of: window} แทน "center" ฉันใช้ 1.11.0
Mike Dotterer

20

อีกทางเลือกหนึ่งสำหรับคำตอบของ Ellesedil

วิธีแก้ปัญหานั้นไม่ได้ผลสำหรับฉันในทันทีดังนั้นฉันจึงทำสิ่งต่อไปนี้ซึ่งเป็นเวอร์ชันไดนามิก แต่สั้นลง:

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

+1 สำหรับ Ellesedil แม้ว่า

แก้ไข:

เวอร์ชันที่สั้นกว่ามากซึ่งใช้งานได้ดีสำหรับกล่องโต้ตอบเดียว:

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

ไม่จำเป็นสำหรับ. each () ที่จะใช้ในกรณีที่คุณมีกล่องโต้ตอบที่ไม่เหมือนใครซึ่งคุณไม่ต้องการสัมผัส


โดยใช้คลาส .ui-dialog-content สำหรับกล่องโต้ตอบทั้งหมดคำตอบที่ยอมรับคือสำหรับไดอะล็อกเฉพาะ
ปิแอร์

อาใช่ ขออภัย. ไม่ได้สังเกตเห็นความแตกต่างในตอนแรกในการแก้ไข
Ellesedil

ฉันใช้วิธีนี้แบบกึ่งสำเร็จ มันเป็นไปตามที่โฆษณาไว้ แต่ซาฟารีมือถือ iOS 7 จะทำให้หายใจไม่ออกจริงๆถ้าแป้นพิมพ์ขึ้น ฉันพยายามเบลอ () อินพุต แต่ Gingerbread เห็นแป้นพิมพ์ขึ้นเป็นเหตุการณ์ปรับขนาดและติดอยู่ในวงที่ไม่อนุญาตให้ป้อนข้อมูล มีใครเผชิญปัญหานี้อีกไหม
Joseph Juhnke

อาจเพิ่มตัวนับด้านนอก.resize()และด้านในถ้าตัวนับถึง10หรือ20จากนั้นbreak;ฉันไม่มีปัญหานี้ฉันไม่รองรับอุปกรณ์ / เบราว์เซอร์เหล่านั้น คุณต้องลองวิธีแก้ปัญหาว่าถ้ามันติดขัดคุณสามารถออกไปได้
ปิแอร์

คำแนะนำแรกของคุณใช้ได้ผลและคำตอบของ @Ellesedil ไม่ได้
akousmata

13

คำตอบที่ครอบคลุมมากขึ้นซึ่งใช้คำตอบของนิคในทางที่มีความยืดหยุ่นมากขึ้นสามารถพบได้ที่นี่

การปรับรหัสความเกี่ยวข้องจากเธรดนั้นอยู่ด้านล่าง ส่วนขยายนี้จะสร้างการตั้งค่าไดอะล็อกใหม่ที่เรียกว่า autoReposition ซึ่งยอมรับว่าเป็นจริงหรือเท็จ โค้ดตามที่เขียนจะกำหนดค่าเริ่มต้นให้ตัวเลือกเป็นจริง ใส่ลงในไฟล์. 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'));
            }
        });
    });

วิธีนี้ช่วยให้คุณสามารถระบุ "จริง" หรือ "เท็จ" สำหรับการตั้งค่าใหม่นี้เมื่อคุณสร้างกล่องโต้ตอบบนเพจของคุณ

$(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 สำหรับโซลูชันที่สมบูรณ์


ดูเหมือนว่าส่วนเสริม / แก้ไขนี้จะใช้งานไม่ได้อีกต่อไป ณ เดือนกรกฎาคม 2014 คำตอบจาก @Pierre ยังคงใช้งานได้
เสื่อมสภาพ

@degenerate: เป็นไปได้ว่าการอัปเดต jQuery อาจจำเป็นต้องมีการเปลี่ยนแปลงไวยากรณ์เล็กน้อย ฉันไม่ได้ทำงานหรือเข้าถึงโปรเจ็กต์ที่ฉันใช้งานได้อีกต่อไป (จริงๆแล้วฉันกำลังเขียน API อยู่) ดังนั้นฉันจึงไม่มีวิธีง่ายๆในการพิจารณาว่าจำเป็นต้องมีการเปลี่ยนแปลงใด ๆ สำหรับเวอร์ชัน jQuery ล่าสุดหรือไม่
Ellesedil

คำตอบนี้ใช้ไม่ได้กับเวอร์ชันล่าสุด แต่ไอเดียดีมาก นี่คือเนื้อหาของตัวจัดการการปรับขนาดหน้าต่างของฉัน: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });มันใช้งานได้ดี :)
nacho4d

@ nacho4d: อย่าลังเลที่จะแก้ไขคำตอบและเพิ่มรหัสที่ใหม่กว่าสำหรับรุ่น jquery ที่คุณกำลังทำงานอยู่ที่ด้านล่าง
Ellesedil

1
@Ellesedil ฉันเพิ่งเปลี่ยนสองสามบรรทัดในโค้ดกลุ่มแรกของคุณ จริงๆแล้วมันคือสิ่งที่ scott.gonzalez เขียนไว้ก่อนในกระทู้ ฉันไม่รู้ว่าทำไมเขา$( "#dialog" ).dialog( "option", "position" ) ถึงเปลี่ยนเป็น$(this).data("dialog").options.positionทีหลัง อย่างไรก็ตามตอนนี้คำตอบนี้ใช้งานได้!
nacho4d

2

ตัวเลือก CSS เท่านั้นที่ใช้ได้ผลคือ ระยะขอบลบควรเท่ากับครึ่งหนึ่งของความสูงและครึ่งหนึ่งของความกว้าง ดังนั้นในกรณีนี้กล่องโต้ตอบของฉันกว้าง 720px คูณ 400px สิ่งนี้จัดกึ่งกลางในแนวตั้งและแนวนอน

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


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

$.isVanillaJS == false
Andrew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.