Center a popup window on screen?

前端 未结 18 731
一整个雨季
一整个雨季 2020-11-22 16:51

How can we center a popup window opened via javascript window.open function on the center of screen variable to the currently selected screen resolution ?

相关标签:
18条回答
  • 2020-11-22 17:36

    My recommendation is to use top location 33% or 25% from remaining space,
    and not 50% as other examples posted here,
    mainly because of the window header,
    which look better and more comfort to the user,

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



    check out this line:
    var top = (screen.height - h) / 4; // for 25% - devide by 4 | for 33% - devide by 3

    0 讨论(0)
  • 2020-11-22 17:38

    Based on Facebook's but uses a media query rather than user agent regex to calc if there is enough room (with some space) for the popup, otherwise goes full screen. Tbh popups on mobile open as new tabs anyway.

    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 讨论(0)
  • 2020-11-22 17:40

    I had an issue with centering a popup window in the external monitor and window.screenX and window.screenY were negative values (-1920, -1200) respectively. I have tried all the above of the suggested solutions and they worked well in primary monitors. I wanted to leave

    • 200 px margin for left and right
    • 150 px margin for top and bottom

    Here is what worked for me:

     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();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 17:41

    SINGLE/DUAL MONITOR FUNCTION (credit to http://www.xtf.dk - thank you!)

    UPDATE: It will also work on windows that aren't maxed out to the screen's width and height now thanks to @Frost!

    If you're on dual monitor, the window will center horizontally, but not vertically... use this function to account for that.

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

    Usage Example:

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

    CREDIT GOES TO: http://www.xtf.dk/2011/08/center-new-popup-window-even-on.html (I wanted to just link out to this page but just in case this website goes down the code is here on SO, cheers!)

    0 讨论(0)
  • 2020-11-22 17:41

    This hybrid solution worked for me, both on single and dual screen setup

    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 讨论(0)
  • 2020-11-22 17:43

    Here is an alternate version of the aforementioned solution...

    const openPopupCenter = (url, title, w, h) => {
      const getSpecs = (w, h, top, left) => {
        return `scrollbars=yes, width=${w}, height=${h}, top=${top}, left=${left}`;
      };
    
      const getFirstNumber = (potentialNumbers) => {
        for(let i = 0; i < potentialNumbers.length; i++) {
          const value = potentialNumbers[i];
    
          if (typeof value === 'number') {
            return value;
          }
        }
      };
    
      // Fixes dual-screen position
      // Most browsers use window.screenLeft
      // Firefox uses screen.left
      const dualScreenLeft = getFirstNumber([window.screenLeft, screen.left]);
      const dualScreenTop = getFirstNumber([window.screenTop, screen.top]);
      const width = getFirstNumber([window.innerWidth, document.documentElement.clientWidth, screen.width]);
      const height = getFirstNumber([window.innerHeight, document.documentElement.clientHeight, screen.height]);
      const left = ((width / 2) - (w / 2)) + dualScreenLeft;
      const top = ((height / 2) - (h / 2)) + dualScreenTop;
      const newWindow = window.open(url, title, getSpecs(w, h, top, left));
    
      // Puts focus on the newWindow
      if (window.focus) {
        newWindow.focus();
      }
    
      return newWindow;
    }
    
    0 讨论(0)
提交回复
热议问题