Catch browser's “zoom” event in JavaScript

前端 未结 16 1877
眼角桃花
眼角桃花 2020-11-22 05:45

Is it possible to detect, using JavaScript, when the user changes the zoom in a page? I simply want to catch a \"zoom\" event and respond to it (similar to window.onresize e

16条回答
  •  清歌不尽
    2020-11-22 06:07

    Although this is a 9 yr old question, the problem persists!

    I have been detecting resize while excluding zoom in a project, so I edited my code to make it work to detect both resize and zoom exclusive from one another. It works most of the time, so if most is good enough for your project, then this should be helpful! It detects zooming 100% of the time in what I've tested so far. The only issue is that if the user gets crazy (ie. spastically resizing the window) or the window lags it may fire as a zoom instead of a window resize.

    It works by detecting a change in window.outerWidth or window.outerHeight as window resizing while detecting a change in window.innerWidth or window.innerHeight independent from window resizing as a zoom.

    //init object to store window properties
    var windowSize = {
      w: window.outerWidth,
      h: window.outerHeight,
      iw: window.innerWidth,
      ih: window.innerHeight
    };
    
    window.addEventListener("resize", function() {
      //if window resizes
      if (window.outerWidth !== windowSize.w || window.outerHeight !== windowSize.h) {
        windowSize.w = window.outerWidth; // update object with current window properties
        windowSize.h = window.outerHeight;
        windowSize.iw = window.innerWidth;
        windowSize.ih = window.innerHeight;
        console.log("you're resizing"); //output
      }
      //if the window doesn't resize but the content inside does by + or - 5%
      else if (window.innerWidth + window.innerWidth * .05 < windowSize.iw ||
        window.innerWidth - window.innerWidth * .05 > windowSize.iw) {
        console.log("you're zooming")
        windowSize.iw = window.innerWidth;
      }
    }, false);

    Note: My solution is like KajMagnus's, but this has worked better for me.

提交回复
热议问题