LoginSignup
18
17

More than 5 years have passed since last update.

CSSで書いたmediaqueryをjavascriptに取り込む

Last updated at Posted at 2015-06-14

今週のJavascrip Weekly、in brief で見つけて「はー、なるほど」と思った(し、つい声が出た)。

Importing CSS Breakpoints Into Javascript

最初に断っておきますが、 matchMedia API が使えるブラウザだけが対象ならここまでやる必要ない気もします。ブレイクポイントの指標さえ決まっていて、cssとjsにその指標を書き込まなければいけないという二重な感じが嫌でなければ、それでも良いのではないかと。

ここでのメリットはjsにブレイクポイントの指標(数値的な)を持ち込まなくて良い点1点に限られる。

どうやってやるのか?

CSS でのブレイクポイント指定

/**
* ブレイクポイントの指標、数値は適当です。お好きにどうぞ
*/
body:before {
  content: "smartphone";
  display: none; /* Prevent from displaying. */
}
@media (min-width: 700px) {
  body:before {
    content: "tablet";
  }
}
@media (min-width: 1100px) {
  body:before {
    content: "desktop";
  }
}

body の before 擬似要素にブレイクポイント毎の文字列仕込むという発想。目から鱗。javascript で引っ張ってくるのだろうと、容易に想像できた。

javascript で擬似要素で指定した文字列を取得する

var breakpoint = {};
breakpoint.refreshValue = function () {
  this.value = window.getComputedStyle(document.querySelector('body'), ':before').getPropertyValue('content').replace(/"/g, '');
};

最後の方に文字列をreplaceしてるんだけど、Firefox and IE だとダブルクオートのまま返ってくるかららしい。へー。

resize イベントに仕込む

$(window).resize(function () {
  breakpoint.refreshValue();
  // ブレイクポイントの値を見て実装する処理など
}).resize();

最後にresize()してるのはload時にresize発火させるためかな。


元記事コメント欄に同じようなやり方が2年前くらいからあったことを知る。

Anzeixer

知見がまだまだ浅い。
ほとんどコードの引用ですが、本日は以上です。

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17