ブラウザのサイズを変更するときにjQuery UIダイアログを自動的に中央揃えする方法は?


100

jquery UIダイアログを使用すると、1つを除いてすべてがうまく機能します。ブラウザのサイズが変更されても、ダイアログは最初の位置にとどまるので、非常に煩わしい場合があります。

あなたはそれをテストすることができます:http : //jqueryui.com/demos/dialog/

「モーダルダイアログ」の例をクリックして、ブラウザのサイズを変更します。

ブラウザのサイズが変更されたときにダイアログを自動的に中央に配置できるようにしたいと思います。これは、アプリ内のすべてのダイアログに対して効率的な方法で実行できますか?

どうもありがとう!

回答:


160

positionオプションを設定するとこれが強制されるため、ここで使用するすべてのダイアログをカバーする同じセレクターを使用するだけ#dialogです(それが見つからない場合は、すべてのjQueryのようにアクションは実行されません)。

1.10より前のjQuery UI

$(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()ので、適切なタイミングで再中央揃えがトリガーされます。


ありがとうございます。たぶん、次のように、ダイアログのIDがいつなのか常にわからないことを伝えるべきでした(どうすればそのダイアログをターゲットにできるのでしょうか)。 = "Cancel">キャンセル</a> </a> </ div> ').html(assetBrowser).dialog({autoOpen:false、title:' Assets Manager '、modal:true、closeOnEscape:true、buttons:ボタン、幅:840、高さ:500}); $ dialog.dialog( 'open');
ジョール

11
@Jorre-ダイアログを作成すると、すべて同じクラスを取得します。これを汎用的にするには、次のようにします。$(".ui-dialog-content").dialog("option", "position", "center");、これにより、すべてのダイアログがチェックされます:)
Nick Craver

3
残念ながら、提案された回答はダイアログのサイズ変更に悪影響を及ぼす。SEハンドルでサイズを変更しようとすると、ダイアログは4辺すべてでサイズ変更されます。

2
サイズ変更イベントを抑制またはデバウンスすることをお勧めします。サイズ変更ハンドラーの実行回数が多すぎるため、IE7とIE8がダイアログをビューポートの「外側」に移動するのを見てきました。
BStruthers 2013

2
jQuery UIの新しいバージョンでは、 "center"ではなく{my: "center"、at: "center"、of:window}を使用する必要がありました。私は1.11.0を使用しています。
Mike Dotterer 2014

20

Ellesedilの答えの代わりに、

その解決策はすぐにはうまくいかなかったので、動的でも短縮版である次のことを行いました:

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

Ellesedilの+1

編集:

単一のダイアログに最適な非常に短いバージョン:

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

触れたくない独自のダイアログがある場合は、.each()を使用する必要はありません。


クラス.ui-dialog-contentを使用すると、すべてのダイアログが受け入れられ、特定のダイアログが受け入れられます
Pierre

ああ、そうです。ごめんなさい。一見したところ、その違いに気づかなかった。
Ellesedil、2013

私はこのアプローチを半ば成功して使用しています。宣伝どおりですが、キーボードが上にある場合、iOS 7モバイルサファリは本当に窒息します。私は入力をblur()しようとしましたが、Gingerbreadはキーボードをサイズ変更イベントとして認識し、入力を許可しないループでスタックします。これに直面している他の誰か?
Joseph Juhnke 2014年

たぶん外にカウンタを追加する.resize()カウンターに達した場合や内部10または20それからbreak;、私はこの問題を持っていなかった、私はそれらのデバイス/ブラウザの要求を満たすません。あなたはそれが行き詰まっている場合、あなたがそれから抜け出すことができる解決策を試す必要があります
ピエール

最初の提案はうまくいきましたが、@ Ellesedilの答えはうまくいきませんでした。
akousmata 14

13

Nickの回答をより柔軟な方法で使用する、より包括的な回答は、こちらにあります

そのスレッドからの関連性のあるコードの改作を以下に示します。この拡張機能は本質的に、trueまたはfalseを受け入れるautoRepositionと呼ばれる新しいダイアログ設定を作成します。記述されたコードでは、デフォルトでオプションがtrueに設定されています。これをプロジェクトの.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'));
            }
        });
    });

これにより、ページにダイアログを作成するときに、この新しい設定に「true」または「false」を指定できます。

$(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(または設定と呼ぶもの)は、デフォルトの位置を持たないダイアログを処理し、ウィンドウのサイズが変更されたときに自動的に再配置できます。ダイアログを作成するときにこれを設定しているため、再配置機能がダイアログ自体に組み込まれるようになるため、ダイアログを識別する必要はありません。そして最良の部分は、これがダイアログごとに設定されるため、いくつかのダイアログを自分自身で再配置させ、他のダイアログをそのままの位置に残すことができるということです。

完全なソリューションについては、jQueryフォーラムのユーザーscott.gonzalezに感謝します。


このアドオン/編集は2014年7月の時点では機能していないようです。@ Pierreからの回答はまだ機能しています。
縮退

@degenerate:jQueryを更新すると、構文の変更が少し必要になる可能性があります。私はもう働いていないか、これを実装したプロジェクトにアクセスしている(実際には、現在APIを書いている)ため、最近のjQueryバージョンに変更が必要かどうかを簡単に判断する方法がありません。
Ellesedil、2014

この回答は最近のバージョンでは機能しません。しかし、アイデアは素晴らしいです。これは私のウィンドウサイズ変更ハンドラの内容です。$(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });これはうまく機能します:)
nacho4d

@ nacho4d:答えを自由に編集して、作業しているjqueryバージョンの新しいコードを下部に追加してください。
Ellesedil 2015

1
@Ellesedil最初のコードチャンクの数行を変更しました。実際には、scott.gonzalezがスレッドで最初に書いたものです。なぜ彼が後で変わっ$( "#dialog" ).dialog( "option", "position" ) たのかはわかりません$(this).data("dialog").options.position。とにかく、今この答えはうまくいきます!
nacho4d 2015

2

機能する別のCSS専用オプションはこれです。負のマージンは、高さの半分と幅の半分に等しくなければなりません。したがって、この場合、ダイアログの幅は720px、高さは400pxです。これにより、垂直方向と水平方向の中央に配置されます。

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

2

あるいは、jQueryのUI 位置を使用できます。

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

0

みなさん、こんにちは!

バニラ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
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.