Popup-Fenster auf dem Bildschirm zentrieren?

280

Wie können wir ein Popup-Fenster, das über die Javascript- window.openFunktion geöffnet wurde, in der Mitte der Bildschirmvariablen auf die aktuell ausgewählte Bildschirmauflösung zentrieren?

Zo hat
quelle

Antworten:

457

SINGLE / DUAL MONITOR FUNCTION ( Dank an http://www.xtf.dk - danke!)

UPDATE: Es funktioniert jetzt auch bei Fenstern, die dank @Frost nicht auf die Breite und Höhe des Bildschirms maximiert sind!

Wenn Sie sich auf einem Doppelmonitor befinden, wird das Fenster horizontal, aber nicht vertikal zentriert. Verwenden Sie diese Funktion, um dies zu berücksichtigen.

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

Anwendungsbeispiel:

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

CREDIT GEHT ZU: http://www.xtf.dk/2011/08/center-new-popup-window-even-on.html (Ich wollte nur auf diese Seite verlinken, aber nur für den Fall, dass diese Website ausfällt Code ist hier auf SO, Prost!)

Tony M.
quelle
7
Nach einigem Herumspielen funktioniert das nicht so gut, wie ich dachte. Die einfachere, ausgenommene Antwort funktioniert viel besser. Dies funktioniert nur, wenn die Startseite maximiert ist.
Bart
8
Vielen Dank für die Gutschrift, ich habe mein Beispiel jetzt an minimierten Fenstern arbeiten lassen: xtf.dk/2011/08/center-new-popup-window-even-on.html
Frost
10
Verwendet globale Variablen (Breite / Höhe), autsch!
Ruben Stolk
13
Ursprüngliche Frage aus dem Jahr 2010, ursprüngliche Lösung aus dem Jahr 2010. Mein Kommentar zur ursprünglichen Lösung über das Nicht-Arbeiten mit Dual-Monitor aus dem Jahr 2013, meine Antwort aus dem Jahr 2013 aus dem Dual-Monitor. Ihr Kommentar zu Triple-Monitor aus dem Jahr 2015. Sie müssen jetzt antworten eine Dreifachmonitorlösung im Jahr 2015. Bei dieser Rate werden wir eine Antwort für 5 Monitore im Jahr 2020, 6 Monitore im Jahr 2025, 7 Monitore im Jahr 2030 haben ... lassen Sie uns diesen Zyklus fortsetzen!
Tony M
2
@ TonyM Ich habe die Antwort aktualisiert. Ja, der Zyklus muss weitergehen!
Zo hat den
329

versuchen Sie es so:

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
quelle
17
Diese Funktion funktioniert bei einem Dual-Monitor-Setup nicht. Ich habe unten eine Einzel- und Doppelmonitorlösung veröffentlicht.
Tony M
1
Ich möchte dies bestätigen: var left = (screen.width / 2) - (w / 2); var top = (Bildschirmhöhe / 2) - (h / 2); Wird es nicht left = 0 und top = 0 zurückgeben ??? Angenommen, w ist gleich screen.width und h ist gleich screen.height ... Bin ich hier richtig oder falsch?
mutanic
1
@mutanic w / h bezieht sich dort auf die Größe des Popups, nicht auf den Bildschirm.
Mahn
2
Zentriert nicht auf meinem zweiten Monitor (der vom Hauptmonitor UP ist). Die Antwort für den doppelten Bildschirm schlägt ebenfalls fehl.
vsync
2
Dies funktioniert nicht, wenn Sie das Fenster in der Mitte des Browsers und nicht in der Mitte des Bildschirms zentrieren möchten (wenn der Browser des Benutzers beispielsweise auf die halbe Größe angepasst wurde). Um im Browser zu zentrieren, ersetzen Sie screen.width & screen.height durch window.innerWidth & window.innerHeight
Jonathon Blok
71

Aufgrund der Komplexität bei der Bestimmung der Mitte des aktuellen Bildschirms in einem Setup mit mehreren Monitoren ist es einfacher, das Popup über dem übergeordneten Fenster zu zentrieren. Übergeben Sie einfach das übergeordnete Fenster als weiteren Parameter:

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

Implementierung:

popupWindow('google.com', 'test', window, 200, 100);
CrazyTim
quelle
Dies scheint die Technik zu sein, die Facebook für das Popup auf einem Share-Button verwendet.
Tim Tisdall
3
Dies funktionierte perfekt für mich auf zwei Bildschirmen. Selbst wenn Sie das Fenster verschieben oder seine Größe ändern, wird es als zentral für das Fenster angezeigt, von dem aus es geöffnet wird. Dies sollte die akzeptierte Antwort sein. Vielen Dank.
Oli B
2
Ich stimme @OliB zu - dies funktioniert perfekt und hat ein aktuelles Entwicklungsproblem gelöst, das wir hatten! Sollte die akzeptierte Antwort für 2019 sein.
MrLewk
Wir machten eine Modifikation die Möglichkeiten dieser Funktion erweitern hier . Es enthält die Option, Breite und Höhe auf Prozentsatz oder Verhältnis einzustellen. Sie können die Optionen auch mit einem Objekt ändern (einfacher zu verwalten als eine Zeichenfolge)
SwiftNinjaPro
21

Quelle: 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;
} 
Allmächtige Entität
quelle
15

Wenn Sie es auf dem Rahmen zentrieren möchten, in dem Sie sich gerade befinden, würde ich diese Funktion empfehlen:

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

Ähnlich wie die Antwort von Crazy Tim, verwendet jedoch nicht window.top. Auf diese Weise funktioniert es auch dann, wenn das Fenster in einen Iframe einer anderen Domäne eingebettet ist.

Taugenichts
quelle
13

Es funktioniert sehr gut in Firefox.
Ändern Sie einfach die oberste Variable in einen anderen Namen und versuchen Sie es erneut

        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);
user1862764
quelle
6
Das ist völlig unnötig Number(...).
Gustavohenke
6

Meine Empfehlung ist, 33% oder 25% des verbleibenden Speicherplatzes zu verwenden
und nicht 50% als andere hier veröffentlichte Beispiele,
hauptsächlich wegen der Fensterkopfzeile ,
die für den Benutzer besser und komfortabler aussieht.

vollständiger Code:

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



Schauen Sie sich diese Zeile an:
var top = (screen.height - h) / 4; // für 25% - durch 4 | teilen für 33% - um 3 teilen

mr.baby123
quelle
6

Facebook verwendet den folgenden Algorithmus, um das Anmelde-Popup-Fenster zu positionieren:

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

Sie können dazu CSS verwenden. Geben Sie dem Element, das in der Mitte des Popups platziert werden soll, einfach die folgenden Eigenschaften

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

Hier ist eine alternative Version der oben genannten Lösung ...

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.
quelle
3

Meine Version mit ES6 JavaScript.
Funktioniert gut auf Chrome und Chromium mit Dual-Screen-Setup.

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

Beispiel

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

(Dies wurde im Jahr 2020 veröffentlicht)

Eine Erweiterung der Antwort von CrazyTim

Sie können die Breite für eine dynamische Größe auch auf einen Prozentsatz (oder ein Verhältnis) festlegen. Die absolute Größe wird weiterhin akzeptiert.

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

Verwendung:

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

Hinweis: Sie müssen verwenden Math.round, um die genaue Ganzzahl von Breite und Höhe zu erhalten.

Praveen Kumar
quelle
0

Basierend auf Facebook, verwendet jedoch eine Medienabfrage anstelle des regulären Ausdrucks des Benutzeragenten, um zu berechnen, ob genügend Platz (mit etwas Platz) für das Popup vorhanden ist. Andernfalls wird der Vollbildmodus angezeigt. Tbh-Popups auf Mobilgeräten werden ohnehin als neue Registerkarten geöffnet.

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

Diese Hybridlösung funktionierte für mich sowohl bei der Einrichtung mit einem als auch mit zwei Bildschirmen

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

Ich hatte ein Problem mit der Zentrierung eines Popup-Fensters im externen Monitor, und window.screenX und window.screenY waren negative Werte (-1920, -1200). Ich habe alle oben genannten Lösungsvorschläge ausprobiert und sie haben auf primären Monitoren gut funktioniert. Ich wollte gehen

  • 200 px Rand für links und rechts
  • 150 px Rand für oben und unten

Folgendes hat bei mir funktioniert:

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