The window.matchMedia API
To execute a piece of code when the viewport is a certain size, the first thing that comes to mind is adding a resize
event listener to the window
object. This is one way, but not always the best. Sometimes the lesser known window.matchMedia
API is a better fit.
This is the well-known way to trigger something in JavaScript when the viewport size changes.
window.addEventListener('resize', (event) => { if (window.innerWidth >= 960) { // … } else { // … }});
The resize
event is triggered whenever the viewport size changes. If the browser window is 1200px wide, and the user resizes, the callback will be called n
times until they stop.
Performance issues can be solved with a debounce function to reduce the number of calls. Or, we can use the declarative matchMedia
listener that will only execute when the match result changes.
window.matchMedia('(min-width: 960px)') .addEventListener('change', (query) => { if(query.matches) { // … } else { // … } });
The callback will be invoked whenever query.matches
changes true
or false
.
matchMedia
is a fun little API. You can also access the current result with matches
.
window.matchMedia('(min-width: 960px)').matches;
Since it's built on media queries, you can use matchMedia
for other things too—like dark mode!
window.matchMedia('(prefers-color-scheme: dark)').matches;