Center a popup window on screen?

前端 未结 18 768
一整个雨季
一整个雨季 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:27

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

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

    try it like this:

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

    (this was posted in 2020)

    An extension to CrazyTim's answer

    You can also set the width to a percentage (or a ratio) for a dynamic size. Absolute size is still accepted.

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

    usage:

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

    This would work out based on your screen size

    <html>
    <body>
    <button onclick="openfunc()">Click here to open window at center</button>
    <script>
    function openfunc() {
    windowWidth = 800;
    windowHeight = 720;
     var left = (screen.width - windowWidth) / 2;
                var top = (screen.height - windowHeight) / 4;
                var myWindow = window.open("https://www.google.com",'_blank','width=' + windowWidth + ', height=' + windowHeight + ', top=' + top + ', left=' + left);
    }
    </script>
    </body>
    </html>
    
    0 讨论(0)
  • 2020-11-22 17:35

    Due to the complexity of determining the center of the current screen in a multi-monitor setup, an easier option is to center the pop-up over the parent window. Simply pass the parent window as another parameter:

    function popupWindow(url, windowName, 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, windowName, `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`);
    }
    

    Implementation:

    popupWindow('google.com', 'test', window, 200, 100);
    
    0 讨论(0)
  • 2020-11-22 17:35

    Source: 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;
    } 
    
    0 讨论(0)
提交回复
热议问题