type:any

data属性からjsの振る舞いをレスポンシブでコントロールするならmatchMediaが最適解

{ category: "Front-end" }

SPAなら関数の発火・その内容のコントロールはいろんなアプローチがあると思いますが、ベーシックなweb制作ではdata属性を用いることが多いと思います。

今やっている案件で、画面数(ブレークポイントで分かれているデザイン)が4種類あり、その時々でjsの振る舞いが違うという状況にあたっており、data属性からどうコントロールするかということになったのですが引数を文字列で渡せるwindow.matchMediaが最適解だということに行き着きました。
MDNの参考ページ https://developer.mozilla.org/ja/docs/Web/API/Window/matchMedia

コード例

// helper
export default class Helper {
    static isMediaMatch(media) {
        return window.matchMedia(media).matches;
    }
}

■ 一つのブレークポイント内のみで発火するコントロール

// html
<div data-media="(min-width: 768px)">...</div>

// js
class Hoge {
  constructor(trigger) {
    this.trigger = trigger;
    this.media = this.trigger.dataset.media;
  }
}

fuga() {
  // this.mediaの存在確認をしたあとに下記
  if (Helper.isMediaMatch(this.media)) {
    returnするなど
  }
}

■ 複数のブレークポイント内で設定の出し分けする場合

// html
<div data-media-config='{ "mediaAll": [{ "media": "(max-width: 991px)", "config": { "hoge": ... } }]}'>...</div>

// js
class Hoge {
  constructor(trigger) {
    this.trigger = trigger;
    this.mediaData = this.trigger.dataset.mediaConfig;
    this.config = null;
    if (this.mediaData) {
      for (let i = 0; i < this.mediaData.mediaAll.length; i++) {
         if (Helper.isMediaMatch(this.mediaData.mediaAll[i].media)) {
           this.configでなにかやる
       }
    }

  }
}

結構使えるテクニックだと思うので、公開してみました!