質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

1回答

697閲覧

window.matchMediaで作ったレスポンシブJSが効率悪いので直したい

kumakuma112

総合スコア21

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2017/12/12 04:12

編集2017/12/12 05:50

JS初心者です。
###Bootstrapと同じブレイクポイントで、window.matchMediaを使ったレスポンシブ用のクラス振り分けJS作りました。

xs:0575px
sm:576
767px
md:768991px
lg:992
1199px
xl:1200px~

Bootstrapがメディアクエリでmin-width:◯◯◯px以上という考え方だったので、それに合わせてます。

###いろんな記事見ながら書いてみてとりあえず動いたのですが、ちょっと気になるところがあります。

  • スマホファースト前提で汎用性がない(PCファーストに切り替えるには?)
  • ループを多用して処理速度が不安
  • 単純に書き方は問題ないか
  • Babel使ってビルドしたら大量にwarning出てしまった。(eslintかも)

みなさんならどのように書かれますか?

// breakpoints.js const Breakpoints = (xs,sm,md,lg,xl) => { document.addEventListener('DOMContentLoaded', () => { const mqXs = window.matchMedia('(min-width:' + xs + 'px)'); const mqSm = window.matchMedia('(min-width:' + sm + 'px)'); const mqMd = window.matchMedia('(min-width:' + md + 'px)'); const mqLg = window.matchMedia('(min-width:' + lg + 'px)'); const mqXl = window.matchMedia('(min-width:' + xl + 'px)'); const checkItem = document.getElementsByTagName('html'); const mq = [mqXs,mqSm,mqMd,mqLg,mqXl]; const mqPx = [xs,sm,md,lg,xl]; const mqClass = ['xs','sm','md','lg','xl']; const reloadBreakPoint = () => { for (let i = mq.length - 1; i >= 0; i--) { if (mq[i].matches) { console.log(i); let index = i; for (let j = 0; j <= index; j++) { checkItem[0].classList.add(mqClass[j]); } break; } } }; const checkBreakPoint = (mq) => { const index = mqClass.indexOf(mq); const thisClass = mqPx[index]; const nextClass = mqPx[index + 1]; if (mq == 'xl') { var minWidth = '(min-width:' + thisClass + 'px)'; } else { var minWidth = '(min-width:' + thisClass + 'px)' + ' and (max-width:' + (nextClass - 1) + 'px)'; } window.matchMedia(minWidth).addListener(function(){ if (window.matchMedia('(min-width:' + thisClass + 'px)').matches) { checkItem[0].classList.remove('xl','lg','md','sm','xs'); for (let j = 0; j <= index; j++) { checkItem[0].classList.add(mqClass[j]); } } }); }; // ブレイクポイントの瞬間に発火 checkBreakPoint('xs'); checkBreakPoint('sm'); checkBreakPoint('md'); checkBreakPoint('lg'); checkBreakPoint('xl'); // 初回チェック reloadBreakPoint(); }); return; }; export default Breakpoints;
// common.js import Breakpoints from './_breakpoints.js'; Breakpoints(0,576,768,992,1200);
<!-- 結果 992px ~ 1199pxなら --> <html class="xs sm md lg"> </html>
// エラー eslint 10:36 warning Unexpected string concatenation prefer-template 11:36 warning Unexpected string concatenation prefer-template 12:36 warning Unexpected string concatenation prefer-template 13:36 warning Unexpected string concatenation prefer-template 14:36 warning Unexpected string concatenation prefer-template 25:15 warning 'index' is never reassigned. Use 'const' instead prefer-const 39:9 warning Unexpected var, use let or const instead no-var 39:24 warning Unexpected string concatenation prefer-template 41:9 warning Unexpected var, use let or const instead no-var 41:13 error 'minWidth' is already defined no-redeclare 41:24 warning Unexpected string concatenation prefer-template 43:47 warning Unexpected function expression prefer-arrow-callback 44:31 warning Unexpected string concatenation prefer-template

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karamarimo

2017/12/12 05:00

その warning は babel ではなく eslint のものではないですか?
kumakuma112

2017/12/12 05:49

そうかもしれないです。そこら辺あまり区別できてなくて… ご指摘ありがとうございます。
guest

回答1

0

現在の挙動を見る限り、難しいことをしなくても、各 media query のリスナーごとに独立にクラスを add/remove すればいいのではないでしょうか。

例えば sm なら 576px 以上になったときsmクラスを追加、576px 未満になったときsmクラスを削除、という感じです。

DEMO (jsFiddle)

js

1function setBreakpoints(target, bps) { 2 const bpNames = Object.getOwnPropertyNames(bps) 3 4 for (let bpName of bpNames) { 5 const bp = bps[bpName] 6 const mql = window.matchMedia(`(min-width: ${bp}px)`) 7 mql.addListener(e => { 8 setClass(bpName, e.target) 9 }) 10 setClass(bpName, mql) // initial check 11 } 12 13 function setClass(name, mql) { 14 if (mql.matches) { 15 target.classList.add(name) 16 } else { 17 target.classList.remove(name) 18 } 19 } 20} 21 22// 使用例 23const bla = document.querySelector('#bla') 24setBreakpoints(bla, { 25 xs: 200, 26 sm: 300, 27 md: 400, 28 lg: 500, 29 xl: 600 30});

投稿2017/12/12 05:56

karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakuma112

2017/12/13 03:48

すごいシンプル!ありがとうございます。 勉強不足で理解出来てないところもあるので、検証してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問