Pusatkan jendela sembulan di layar?

281

Bagaimana kita bisa memusatkan jendela sembul yang dibuka melalui window.openfungsi javascript di tengah variabel layar ke resolusi layar yang dipilih saat ini?

Zo Has
sumber

Jawaban:

459

FUNGSI MONITOR TUNGGAL / DUAL (kredit ke http://www.xtf.dk - terima kasih!)

UPDATE: Ini juga akan berfungsi pada windows yang tidak diimbangi dengan lebar dan tinggi layar sekarang berkat @Frost!

Jika Anda menggunakan monitor ganda, jendela akan terpusat secara horizontal, tetapi tidak secara vertikal ... gunakan fungsi ini untuk menjelaskan hal itu.

const popupCenter = ({url, title, w, h}) => {
    // Fixes dual-screen position                             Most browsers      Firefox
    const dualScreenLeft = window.screenLeft !==  undefined ? window.screenLeft : window.screenX;
    const dualScreenTop = window.screenTop !==  undefined   ? window.screenTop  : window.screenY;

    const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
    const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;

    const systemZoom = width / window.screen.availWidth;
    const left = (width - w) / 2 / systemZoom + dualScreenLeft
    const top = (height - h) / 2 / systemZoom + dualScreenTop
    const newWindow = window.open(url, title, 
      `
      scrollbars=yes,
      width=${w / systemZoom}, 
      height=${h / systemZoom}, 
      top=${top}, 
      left=${left}
      `
    )

    if (window.focus) newWindow.focus();
}

Contoh Penggunaan:

popupCenter({url: 'http://www.xtf.dk', title: 'xtf', w: 900, h: 500});  

KREDIT PERLU KE: http://www.xtf.dk/2011/08/center-new-popup-window-even-on.html (saya hanya ingin menautkan ke halaman ini tapi kalau-kalau situs web ini menurun kode di sini di SO, tepuk tangan!)

Tony M
sumber
7
Setelah beberapa bermain-main, ini tidak berhasil sebaik yang saya kira. Jawaban yang lebih sederhana dan dikecualikan bekerja jauh lebih baik. Ini hanya berfungsi jika halaman peluncuran dimaksimalkan.
Bart
8
Terima kasih atas kreditnya, saya telah membuat contoh saya berfungsi pada jendela yang diperkecil sekarang: xtf.dk/2011/08/center-new-popup-window-even-on.html
Frost
10
Menggunakan variabel global (lebar / tinggi), aduh!
Ruben Stolk
13
Pertanyaan asli diposting pada 2010, solusi asli diposting pada 2010. Komentar saya tentang solusi asli tentang tidak bekerja pada dual monitor yang diposting pada 2013, jawaban saya untuk dual monitor yang diposting pada 2013. Komentar Anda tentang triple monitor pada tahun 2015. Sekarang Anda perlu menjawab untuk solusi tiga monitor pada tahun 2015. Pada tingkat ini, kami akan memiliki jawaban untuk 5 monitor pada tahun 2020, 6 monitor pada tahun 2025, 7 monitor pada tahun 2030 ... mari kita teruskan siklus ini!
Tony M
2
@TonyM Saya telah memperbarui jawabannya. Ya, siklus ini harus terus berjalan!
Zo Memiliki
329

coba seperti ini:

function popupwindow(url, title, w, h) {
  var left = (screen.width/2)-(w/2);
  var top = (screen.height/2)-(h/2);
  return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
} 
oezi
sumber
17
Fungsi ini tidak berfungsi pada pengaturan dua monitor. Saya telah memposting solusi monitor tunggal dan ganda di bawah ini.
Tony M
1
Saya ingin mengkonfirmasi ini: var left = (screen.width / 2) - (w / 2); var top = (screen.height / 2) - (h / 2); Bukankah itu akan kembali ke kiri = 0 dan atas = 0 ??? Dengan asumsi w sama dengan screen.width dan h sama dengan screen.height ... Apakah saya benar atau salah di sini?
mutanic
1
@mutanic w / h merujuk ke ukuran popup, bukan layar.
Mahn
2
Tidak memusatkan pada monitor kedua saya (yang UP dari yang utama). Jawaban untuk layar ganda juga gagal.
vsync
2
Ini tidak akan berfungsi jika Anda ingin memusatkan jendela di tengah browser, bukan di tengah layar (jika misalnya, ukuran browser pengguna diubah menjadi setengah ukuran). Untuk memusatkan di dalam browser ganti screen.width & screen.height dengan window.innerWidth & window.innerHeight
Jonathon Blok
71

Karena kerumitan menentukan pusat layar saat ini dalam pengaturan multi-monitor, opsi yang lebih mudah adalah dengan memusatkan jendela sembul di atas jendela induk. Cukup lewati jendela induk sebagai parameter lain:

function popupWindow(url, title, win, w, h) {
    const y = win.top.outerHeight / 2 + win.top.screenY - ( h / 2);
    const x = win.top.outerWidth / 2 + win.top.screenX - ( w / 2);
    return win.open(url, title, `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`);
}

Penerapan:

popupWindow('google.com', 'test', window, 200, 100);
CrazyTim
sumber
Ini tampaknya menjadi teknik yang digunakan oleh Facebook untuk popup pada tombol share.
Tim Tisdall
3
Ini berfungsi dengan baik untuk saya di layar ganda. Bahkan ketika memindahkan atau mengubah ukuran jendela, itu mengatakan pusat ke jendela itu dibuka Ini harus menjadi jawaban yang diterima. Terima kasih.
Oli B
2
Saya setuju dengan @OliB - ini berfungsi dengan baik dan memecahkan masalah pengembangan terbaru yang kami miliki! Harus menjadi jawaban yang diterima untuk 2019.
MrLewk
Buat modifikasi untuk memperluas kemampuan fungsi ini di sini . Ini termasuk opsi untuk mengatur lebar dan tinggi ke persentase atau rasio. Anda juga dapat mengubah opsi dengan objek (lebih mudah dikelola daripada string)
SwiftNinjaPro
21

Sumber: http://www.nigraphic.com/blog/java-script/how-open-new-window-popup-center-screen

function PopupCenter(pageURL, title,w,h) {
  var left = (screen.width/2)-(w/2);
  var top = (screen.height/2)-(h/2);
  var targetWin = window.open (pageURL, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
  return targetWin;
} 
OmnipotentEntity
sumber
15

Jika Anda ingin memusatkannya pada frame Anda saat ini, saya akan merekomendasikan fungsi ini:

function popupwindow(url, title, w, h) {
    var y = window.outerHeight / 2 + window.screenY - ( h / 2)
    var x = window.outerWidth / 2 + window.screenX - ( w / 2)
    return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=' + w + ', height=' + h + ', top=' + y + ', left=' + x);
} 

Mirip dengan jawaban Crazy Tim, tetapi tidak menggunakan window.top. Dengan cara ini, ini akan berfungsi bahkan jika jendela disematkan dalam iframe dari domain yang berbeda.

Taugenichts
sumber
13

Ini bekerja sangat baik di Firefox.
Ubah saja variabel teratas ke nama lain dan coba lagi

        var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

window.open("templates/sales/index.php?go=new_sale", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);
pengguna1862764
sumber
6
Sama sekali tidak perlu dilakukan Number(...).
gustavohenke
6

Rekomendasi saya adalah menggunakan lokasi teratas 33% atau 25% dari ruang yang tersisa,
dan bukan 50% sebagai contoh lain yang diposting di sini,
terutama karena tajuk jendela ,
yang terlihat lebih baik dan lebih nyaman bagi pengguna,

kode lengkap:

    <script language="javascript" type="text/javascript">
        function OpenPopupCenter(pageURL, title, w, h) {
            var left = (screen.width - w) / 2;
            var top = (screen.height - h) / 4;  // for 25% - devide by 4  |  for 33% - devide by 3
            var targetWin = window.open(pageURL, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
        } 
    </script>
</head>
<body>
    <button onclick="OpenPopupCenter('http://www.google.com', 'TEST!?', 800, 600);">click on me</button>
</body>
</html>



lihat baris ini:
var top = (screen.height - h) / 4; // untuk 25% - bagi dengan 4 | untuk 33% - bagi dengan 3

mr.baby123
sumber
6

Facebook menggunakan algoritma berikut untuk memposisikan jendela popup login mereka:

function PopupCenter(url, title, w, h) {
  var userAgent = navigator.userAgent,
      mobile = function() {
        return /\b(iPhone|iP[ao]d)/.test(userAgent) ||
          /\b(iP[ao]d)/.test(userAgent) ||
          /Android/i.test(userAgent) ||
          /Mobile/i.test(userAgent);
      },
      screenX = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft,
      screenY = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop,
      outerWidth = typeof window.outerWidth != 'undefined' ? window.outerWidth : document.documentElement.clientWidth,
      outerHeight = typeof window.outerHeight != 'undefined' ? window.outerHeight : document.documentElement.clientHeight - 22,
      targetWidth = mobile() ? null : w,
      targetHeight = mobile() ? null : h,
      V = screenX < 0 ? window.screen.width + screenX : screenX,
      left = parseInt(V + (outerWidth - targetWidth) / 2, 10),
      right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10),
      features = [];
  if (targetWidth !== null) {
    features.push('width=' + targetWidth);
  }
  if (targetHeight !== null) {
    features.push('height=' + targetHeight);
  }
  features.push('left=' + left);
  features.push('top=' + right);
  features.push('scrollbars=1');

  var newWindow = window.open(url, title, features.join(','));

  if (window.focus) {
    newWindow.focus();
  }

  return newWindow;
}
Roland Soós
sumber
4

Anda dapat menggunakan css untuk melakukannya, cukup berikan properti berikut ke elemen yang akan ditempatkan di tengah popup

element{

position:fixed;
left: 50%;
top: 50%;
-ms-transform: translate(-50%,-50%);
-moz-transform:translate(-50%,-50%);
-webkit-transform: translate(-50%,-50%);
 transform: translate(-50%,-50%);

}
Nikhil Mathew
sumber
3

Ini adalah versi alternatif dari solusi yang disebutkan di atas ...

function openPopupCenter(url, title, w, h) {
  // Fixes dual-screen position
  // Most browsers use window.screenLeft
  // Firefox uses screen.left
  var dualScreenLeft = getFirstNumber(window.screenLeft, screen.left),
    dualScreenTop = getFirstNumber(window.screenTop, screen.top),
    width = getFirstNumber(window.innerWidth, document.documentElement.clientWidth, screen.width),
    height = getFirstNumber(window.innerHeight, document.documentElement.clientHeight, screen.height),
    left = ((width / 2) - (w / 2)) + dualScreenLeft,
    top = ((height / 2) - (h / 2)) + dualScreenTop,
    newWindow = window.open(url, title, getSpecs());

  // Puts focus on the newWindow
  if (window.focus) {
    newWindow.focus();
  }

  return newWindow;

  function getSpecs() {
    return 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left;
  }

  function getFirstNumber() {
    for(var i = 0, len = arguments.length; i < len; i++) {
      var value = arguments[i];

      if (typeof value === 'number') {
        return value;
      }
    }
  }
}
Mike T
sumber
3

Versi saya dengan JavaScript ES6.
Bekerja dengan baik di Chrome dan Chromium dengan pengaturan layar ganda.

function openCenteredWindow({url, width, height}) {
    const pos = {
        x: (screen.width / 2) - (width / 2),
        y: (screen.height/2) - (height / 2)
    };

    const features = `width=${width} height=${height} left=${pos.x} top=${pos.y}`;

    return window.open(url, '_blank', features);
}

Contoh

openCenteredWindow({
    url: 'https://stackoverflow.com/', 
    width: 500, 
    height: 600
}).focus();
Marc Berger
sumber
2

(ini diposting pada tahun 2020)

Ekstensi untuk jawaban CrazyTim

Anda juga dapat mengatur lebar ke persentase (atau rasio) untuk ukuran dinamis. Ukuran absolut masih diterima.

function popupWindow(url, title, w='75%', h='16:9', opts){
    // sort options
    let options = [];
    if(typeof opts === 'object'){
        Object.keys(opts).forEach(function(value, key){
            if(value === true){value = 'yes';}else if(value === false){value = 'no';}
            options.push(`${key}=${value}`);
        });
        if(options.length){options = ','+options.join(',');}
        else{options = '';}
    }else if(Array.isArray(opts)){
        options = ','+opts.join(',');
    }else if(typeof opts === 'string'){
        options = ','+opts;
    }else{options = '';}

    // add most vars to local object (to shorten names)
    let size = {w: w, h: h};
    let win = {w: {i: window.top.innerWidth, o: window.top.outerWidth}, h: {i: window.top.innerHeight, o: window.top.outerHeight}, x: window.top.screenX || window.top.screenLeft, y: window.top.screenY || window.top.screenTop}

    // set window size if percent
    if(typeof size.w === 'string' && size.w.endsWith('%')){size.w = Number(size.w.replace(/%$/, ''))*win.w.o/100;}
    if(typeof size.h === 'string' && size.h.endsWith('%')){size.h = Number(size.h.replace(/%$/, ''))*win.h.o/100;}

    // set window size if ratio
    if(typeof size.w === 'string' && size.w.includes(':')){
        size.w = size.w.split(':', 2);
        if(win.w.o < win.h.o){
            // if height is bigger than width, reverse ratio
            size.w = Number(size.h)*Number(size.w[1])/Number(size.w[0]);
        }else{size.w = Number(size.h)*Number(size.w[0])/Number(size.w[1]);}
    }
    if(typeof size.h === 'string' && size.h.includes(':')){
        size.h = size.h.split(':', 2);
        if(win.w.o < win.h.o){
            // if height is bigger than width, reverse ratio
            size.h = Number(size.w)*Number(size.h[0])/Number(size.h[1]);
        }else{size.h = Number(size.w)*Number(size.h[1])/Number(size.h[0]);}
    }

    // force window size to type number
    if(typeof size.w === 'string'){size.w = Number(size.w);}
    if(typeof size.h === 'string'){size.h = Number(size.h);}

    // keep popup window within padding of window size
    if(size.w > win.w.i-50){size.w = win.w.i-50;}
    if(size.h > win.h.i-50){size.h = win.h.i-50;}

    // do math
    const x = win.w.o / 2 + win.x - (size.w / 2);
    const y = win.h.o / 2 + win.y - (size.h / 2);
    return window.open(url, title, `width=${size.w},height=${size.h},left=${x},top=${y}${options}`);
}

pemakaian:

// width and height are optional (defaults: width = '75%' height = '16:9')
popupWindow('https://www.google.com', 'Title', '75%', '16:9', {/* options (optional) */});

// options can be an object, array, or string

// example: object (only in object, true/false get replaced with 'yes'/'no')
const options = {scrollbars: false, resizable: true};

// example: array
const options = ['scrollbars=no', 'resizable=yes'];

// example: string (same as window.open() string)
const options = 'scrollbars=no,resizable=yes';
SwiftNinjaPro
sumber
1
function fnPopUpWindow(pageId) {
     popupwindow("hellowWorld.php?id="+pageId, "printViewer", "500", "300");
}

function popupwindow(url, title, w, h) {
    var left = Math.round((screen.width/2)-(w/2));
    var top = Math.round((screen.height/2)-(h/2));
    return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, '
            + 'menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width=' + w 
            + ', height=' + h + ', top=' + top + ', left=' + left);
}
<a href="javascript:void(0);" onclick="fnPopUpWindow('10');">Print Me</a>

Catatan: Anda harus menggunakan Math.rounduntuk mendapatkan bilangan bulat lebar dan tinggi yang tepat.

Praveen Kumar
sumber
0

Berdasarkan Facebook tetapi menggunakan kueri media daripada regex agen pengguna untuk menghitung jika ada cukup ruang (dengan beberapa ruang) untuk popup, jika tidak layar penuh. Tetap muncul popup di ponsel sebagai tab baru.

function popupCenter(url, title, w, h) {
  const hasSpace = window.matchMedia(`(min-width: ${w + 20}px) and (min-height: ${h + 20}px)`).matches;
  const isDef = v => typeof v !== 'undefined';
  const screenX = isDef(window.screenX) ? window.screenX : window.screenLeft;
  const screenY = isDef(window.screenY) ? window.screenY : window.screenTop;
  const outerWidth = isDef(window.outerWidth) ? window.outerWidth : document.documentElement.clientWidth;
  const outerHeight = isDef(window.outerHeight) ? window.outerHeight : document.documentElement.clientHeight - 22;
  const targetWidth = hasSpace ? w : null;
  const targetHeight = hasSpace ? h : null;
  const V = screenX < 0 ? window.screen.width + screenX : screenX;
  const left = parseInt(V + (outerWidth - targetWidth) / 2, 10);
  const right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10);
  const features = [];

  if (targetWidth !== null) {
    features.push(`width=${targetWidth}`);
  }

  if (targetHeight !== null) {
    features.push(`height=${targetHeight}`);
  }

  features.push(`left=${left}`);
  features.push(`top=${right}`);
  features.push('scrollbars=1');

  const newWindow = window.open(url, title, features.join(','));

  if (window.focus) {
    newWindow.focus();
  }

  return newWindow;
}
Dominic
sumber
0

Solusi hybrid ini bekerja untuk saya, baik pada pengaturan layar tunggal maupun ganda

function popupCenter (url, title, w, h) {
    // Fixes dual-screen position                              Most browsers      Firefox
    const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX;
    const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY;
    const left = (window.screen.width/2)-(w/2) + dualScreenLeft;
    const top = (window.screen.height/2)-(h/2) + dualScreenTop;
    return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
}
Giuseppe Siragusa
sumber
0

Saya punya masalah dengan memusatkan jendela popup di monitor eksternal dan window.screenX dan window.screenY masing-masing adalah nilai negatif (-1920, -1200). Saya telah mencoba semua solusi yang disarankan di atas dan mereka bekerja dengan baik di monitor utama. Saya ingin pergi

  • 200 px margin untuk kiri dan kanan
  • 150 px margin untuk atas dan bawah

Inilah yang bekerja untuk saya:

 function createPopupWindow(url) {
    var height = screen.height;
    var width = screen.width;
    var left, top, win;

    if (width > 1050) {
        width = width - 200;
    } else {
        width = 850;
    }

    if (height > 850) {
        height = height - 150;
    } else {
        height = 700;
    }

    if (window.screenX < 0) {
        left = (window.screenX - width) / 2;
    } else {
        left = (screen.width - width) / 2;
    }

    if (window.screenY < 0) {
        top = (window.screenY + height) / 4;
    } else {
        top = (screen.height - height) / 4;
    }

    win=window.open( url,"myTarget", "width="+width+", height="+height+",left="+left+",top="+top+"menubar=no, status=no, location=no, resizable=yes, scrollbars=yes");
    if (win.focus) {
        win.focus();
    }
}
Doston
sumber
-4

.center{
    left: 50%;
    max-width: 350px;
    padding: 15px;
    text-align:center;
    position: relative;
    transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -webkit-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -o-transform: translateX(-50%);   
}

Alok Mishra
sumber