みかづきブログ・カスタム

基本的にはちょちょいのほいです。

MediaQueryList (window.matchMedia)を使ってJavaScriptでメディアクエリにマッチした際の処理を記述する 📝

https://cdn-ak.f.st-hatena.com/images/fotolife/k/kimizuka/20211020/20211020154011.png

MediaQueryListchangeイベントを使って、CSSのメディアクエリを使って書いていた処理をJavaScriptに移植してみます。

developer.mozilla.org
developer.mozilla.org

CSSバージョン(MediaQuery)

ウィンドウ幅が375pxまでは「window.innerWidth <= 375px」、376pxを超えると「376px <= window.innerWidth 」と表示するCSSを書いてみました。


HTML

<p>window.innerWidth</p>

CSS

@media (max-width: 375px) {
  p:after {
    content: ' <= 375px';
  }
}

@media (min-width: 376px) {
  p:before {
    content: '376px <= ';
  }
}

これを、MediaQueryList (window.matchMedia)を使ってJavaScriptで書くと、

JavaScriptバージョン(MediaQueryList)

HTML

<p>h</p>

JavaScript


const mediaQueryList = window.matchMedia('(min-width: 376px)');

mediaQueryList.addEventListener('change', handleChangeMediaQuery);

function handleChangeMediaQuery(evt) {
  if (evt.matches) {
    document.querySelector('p').innerText = '376px <= window.innerWidth';
  } else {
    document.querySelector('p').innerText = 'window.innerWidth <= 375px';
  }
}

handleChangeMediaQuery(mediaQueryList);

こうなります。
厳密にいうと、CSSバージョンでは擬似要素を使っているので、微妙な違いはあるのですが、リサイズイベントを使わずにメディアクエリで表示を切り替えることに成功しています。

普段はCSSで書いた方が楽だと思うのですが、のっぴきならない理由でJavaScriptでメディアクエリに基づいた処理したい際に活用できます。
また、Reactと組み合わせて使う場合は、カスタムフックを使うと便利に扱えます。

usehooks.com