Bir açılır pencereyi ekranda ortalansın mı?


280

window.openEkran değişkeninin ortasındaki javascript işlevi ile açılan bir açılır pencereyi seçili olan ekran çözünürlüğüne nasıl merkezleyebiliriz?

Yanıtlar:


458

TEK / ÇİFT MONİTÖR FONKSİYONU ( http ://www.xtf.dk'ye teşekkür ederiz!)

GÜNCELLEME: @Frost sayesinde artık ekranın genişliğine ve yüksekliğine ulaşılmayan pencerelerde de çalışacak!

Çift monitördeyseniz, pencere yatay olarak ortalanır, ancak dikey olarak değil ... bunu hesaba katmak için bu işlevi kullanın.

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

Kullanım Örneği:

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

KREDİ GİTMEKTEDİR: http://www.xtf.dk/2011/08/center-new-popup-window-even-on.html (Sadece bu web sitesine bağlantı vermek istedim, ancak bu web sitesi kodu burada SO, şerefe!)


7
Biraz oynadıktan sonra, düşündüğüm kadar iyi çalışmıyor. Daha basit ve istisnai cevap çok daha iyi sonuç verir. Bu yalnızca başlangıç ​​sayfası büyütüldüğünde çalışır.
Bart

8
Krediniz için teşekkürler, örneğimi şimdi simge durumuna
Frost

10
Global değişkenleri (genişlik / yükseklik) kullanır, ah!
Ruben Stolk

13
Orijinal soru 2010 yılında yayınlanmıştır, orijinal çözüm 2010 yılında yayınlanmıştır. 2013 yılında yayınlanan çift monitör üzerinde çalışma hakkında orijinal çözüm hakkındaki yorumum, 2013 yılında yayınlanan çift monitör için cevabım. 2015 yılında üçlü monitör hakkındaki yorumunuz. Şimdi cevap vermeniz gerekiyor Bu oranda, 2020'de 5 monitör, 2025'te 6 monitör, 2030'da 7 monitör için bir cevap vereceğiz ... bu döngüyü devam ettirelim!
Tony M

2
@TonyM Cevabı güncelledim. Evet, döngü devam etmeli!
Zo

329

şu şekilde deneyin:

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

17
Bu işlev, çift monitör kurulumunda çalışmaz. Aşağıda tek ve çift monitör çözümü yayınladım.
Tony M

1
Bunu onaylamak istiyorum: var left = (screen.width / 2) - (w / 2); var top = (ekran yüksekliği / 2) - (h / 2); Sola dönmeyecek mi = 0 ve üst = 0 ??? W'nin screen.width ve h'nin screen.height'a eşit olduğunu varsayarsak ... Burada doğru mu yanlış mıyım?
mutanic

1
@ mutanic w / h, ekranın değil pop-up'ın boyutunu belirtir.
Mahn

2
İkinci monitörümde ortalanmıyor (ana monitörden YUKARI). Çift ekran yanıtı da başarısız olur.
vsync

2
Pencereyi ekranın ortasından ziyade tarayıcının ortasında ortalamak istiyorsanız bu işe yaramaz (örneğin, kullanıcının tarayıcısı yarım boyuta ayarlanmışsa). Tarayıcı içinde ortalamak için screen.width & screen.height öğesini window.innerWidth & window.innerHeight ile değiştirin
Jonathon Blok

71

Çoklu monitör kurulumunda geçerli ekranın merkezini belirlemenin karmaşıklığı nedeniyle, açılır pencereyi ana pencerenin üzerinde ortalamak daha kolay bir seçenektir. Üst pencereyi başka bir parametre olarak iletmeniz yeterlidir:

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

Uygulama:

popupWindow('google.com', 'test', window, 200, 100);

Bu, bir paylaşım düğmesindeki açılır pencere için Facebook tarafından kullanılan teknik gibi görünüyor.
Tim Tisdall

3
Bu benim için çift ekranda mükemmel çalıştı. Pencereyi taşırken veya yeniden boyutlandırırken bile, açıldığı pencerenin merkezini söyler. Bu kabul edilen cevap olmalı. Teşekkürler.
Oli B

2
@OliB ile aynı fikirdeyim - bu mükemmel çalışıyor ve sahip olduğumuz son gelişme sorununu çözdü! 2019 için kabul edilen cevap olmalı.
MrLewk

Burada bu işlevin yeteneklerini genişletmek için bir değişiklik yaptı . Genişlik ve yüksekliği yüzde veya oran olarak ayarlama seçeneği içerir. Ayrıca seçenekleri bir nesneyle de değiştirebilirsiniz (bir dizeden daha kolay
yönetilir


15

Şu anda bulunduğunuz çerçevede ortalamak istiyorsanız, bu işlevi tavsiye ederim:

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

Crazy Tim'in cevabına benzer, ancak window.top kullanmaz. Bu şekilde, pencere farklı bir etki alanından bir iframe içine gömülmüş olsa bile çalışır.


13

Firefox'ta çok iyi çalışıyor.
En üstteki değişkeni başka bir adla değiştirip tekrar deneyin

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

6
Bunu yapmak tamamen gereksiz Number(...).
gustavohenke

6

Benim tavsiye kalan uzaydan üst konuma% 33 veya 25% kullanmaktır,
ve diğer örnekler olarak değil% 50, burada yayınlanan
ağırlıklı nedeniyle pencere başlığına ,
kullanıcıya daha iyi ve daha rahat bakmak, hangi

tam kod:

    <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>



bu satıra bakın:
var top = (screen.height - h) / 4; //% 25 için - 4'e kadar | % 33 için - 3'e kadar devide


6

Facebook, giriş açılır pencerelerini konumlandırmak için aşağıdaki algoritmayı kullanır:

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

4

Bunu yapmak için css kullanabilirsiniz, sadece açılır pencerenin ortasına yerleştirilecek öğeye aşağıdaki özellikleri verin

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%);

}

3

Yukarıda belirtilen çözümün alternatif bir versiyonu ...

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

3

ES6 JavaScript sürümüm.
Çift ekran kurulumuyla Chrome ve Chromium'da iyi çalışır.

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

Misal

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

2

(Bu 2020 yılında gönderildi)

CrazyTim'in cevabına bir uzantı

Dinamik bir boyut için genişliği yüzde (veya oran) olarak da ayarlayabilirsiniz. Mutlak boyut hala kabul edilmektedir.

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

kullanımı:

// 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';

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>

Not: Math.roundgenişlik ve yüksekliğin tam tamsayısını elde etmek için kullanmanız gerekir .


0

Facebook tabanlı ancak pop-up için yeterli yer varsa (bir miktar boşluk), hesaplamak için kullanıcı aracısı regex yerine bir medya sorgusu kullanır, aksi takdirde tam ekran gider. Tbh mobil cihazlarda açılır pencereler zaten yeni sekmeler olarak açılıyor.

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

0

Bu hibrit çözüm benim için hem tek hem de çift ekran kurulumunda çalıştı

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

0

Dış monitör ve window.screenX ve window.screenY bir pop-up pencere merkezleme ile ilgili bir sorun vardı sırasıyla negatif değerler (-1920, -1200). Önerilen çözümlerin tümünü denedim ve birincil monitörlerde iyi çalıştılar. ayrılmak istedim

  • Sol ve sağ için 200 piksel kenar boşluğu
  • Üst ve alt için 150 piksel kenar boşluğu

İşte benim için işe yarayan:

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

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

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.