Skip to content

Instantly share code, notes, and snippets.

@souporserious
Created October 15, 2019 22:00
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save souporserious/b44ea5d04c38c2e7ff32cd1912a17cd0 to your computer and use it in GitHub Desktop.
Save souporserious/b44ea5d04c38c2e7ff32cd1912a17cd0 to your computer and use it in GitHub Desktop.
Checks if window has been zoomed.
// modified from https://stackoverflow.com/a/52008131/1461204
const zoomEvent = new Event('zoom')
let currentRatio = window.devicePixelRatio
function checkZooming() {
if (currentRatio !== window.devicePixelRatio) {
window.dispatchEvent(zoomEvent)
}
}
window.addEventListener('resize', checkZooming)
// usage
window.addEventListener('zoom', () => {
console.log('zoomed!')
})
@alexbfree
Copy link

alexbfree commented Nov 14, 2019

This is fantastic, but have you any idea how it could be adapted to also detect a 'zoom reset' event (Ctrl+0) ?
It seems like removing the if check at line 6 works, but I suspect this means we are no longer ignoring window resize events. Maybe there is some way to distinguish a resize and a reset...

@souporserious
Copy link
Author

Oh, interesting! I never tested that 😅. I'll see if I can come up with anything, thanks for mentioning that! Maybe posting in the StackOverflow link might help give it more exposure.

@megasent1
Copy link

This is fantastic, but have you any idea how it could be adapted to also detect a 'zoom reset' event (Ctrl+0) ?
It seems like removing the if check at line 6 works, but I suspect this means we are no longer ignoring window resize events. Maybe there is some way to distinguish a resize and a reset...

You can do so replacing the currentRatio variable value each time event is triggered:
`const zoomEvent = new Event('zoom')
let currentRatio = window.devicePixelRatio

function checkZooming() {
if (currentRatio !== window.devicePixelRatio) {
currentRatio = window.devicePixelRatio
window.dispatchEvent(zoomEvent)
}
}

window.addEventListener('resize', checkZooming)

// usage
window.addEventListener('zoom', () => {
console.log('zoomed!')
})`

@souporserious
Copy link
Author

For anyone that's interested I found out you can use a ResizeObserver and it will update whenever the viewport is zoomed 🎉

@megasent1
Copy link

Be aware that https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver is not compatible with Safari and IE

@souporserious
Copy link
Author

@megasent1 thanks! I should have mentioned that, my bad. Here's a link to a Resize Observer polyfill if anyone needs it. Can confirm it works in Safari.

@olliechick
Copy link

Be aware that https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver is not compatible with Safari and IE

It is now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment