投稿日: | 最終更新日:
IE8以下でメディアクエリを対応させるには?
Internet Explorer 8以下では、メディアクエリが使用できません。
レスポンシブといってもIE8以下は「HTML5」「CSS3」が対応していないためです。
対応方法
javascriptによる対応
対応策として、以下の2つのJavaScriptのどちらかを実装します。
- ・css3-mediaqueries-js
- ・Respond.js
css3-mediaqueries-js
Google Codeで公開されているJavaScriptの「css3-mediaqueries-js」を使います。
IE5~8でもMedia Queriesを使用できるようになります。
このスクリプトは特に設置しておく必要はありません。
HTML中に、以下のように記述すれば読み込まれます。
<!--[if lt IE 9]> <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script> <![endif]-->
Respond.js
①以下のサイトより、「Respond.js」をダウンロードします。
②Webサイトのjsディレクトリに設置し、HTML中に以下のコードを記述します。
<!--[if lt IE 9]> <script src="js/Respond.js"></script> <![endif]-->
どちらを使うか?
この2つのjsファイルですが、仕様が微妙に違います。
違いとは、
- css3-mediaqueries-js:ie9に対応。
- Respond.js:ie9以下に対応。
のようです。
「Respond.js」を選びましょう。
しかし、近年「Respond.js」では対応しきれないことが判明し、現在はあまり使用されていません。
Respond.jsは使えない
「Respond.js」 は、IE8以下のメディアクエリ未対応なブラウザにも代替機能を提供するスクリプトでした。
レスポンシブWebデザインを支えるスクリプトとして、H5BPに長らく(8ヶ月) 採用されてきました。
しかし、2012年2月、Modernizr 2.5 のカスタム・ビルダーから「Respond.js」が外されました。
理由は、HTML5 Boilerplate (以下 H5BP) コミュニティでの決定です。
Respond.jsの問題
Respond.jsが使えない理由として、以下のような問題があります。
- ・@importが未対応
- ・<head>内のJavaScriptによりブロッキングが発生する
- ・追加のHTTPリクエストが必要となる
- ・Ajax完了前にレンダリングされると、FOUCが発生する
- ・クロス・ドメインとなるCSSには対応できない
Respond.jsは、ポリーフィル(古いブラウザがサポートできない機能を何らかの手段で補うもの)として一旦はH5BPに採用されました。
しかし、プログレッシブエンハンスメントの考え方から言っても、「古いブラウザにそこまでのハンディキャップを負わせる価値はない」がコミュニティーの決定となりました。
解決案の議論
解決案に的を絞ってまとめると以下のようになります。
- ①メディアクエリに対応できないブラウザはどれか?
- ②スタイル定義の順番とファイル構成をどうするか?
- ③メディアクエリのブレークポイント指定はどうするか?
①メディアクエリに対応できないブラウザ
現在、iPhoneとAndroidを合わせた普及率は50%を超えます。
しかし、2010年頃の携帯電話事情は以下のようになります。
- ・iPhone 普及率はアメリカで6%
- ・ヨーロッパではわずか2%
- ・BlackBerry、NOKIA、SAMSUNG などが開発したフィーチャーフォンが主流
ブラウザ(Opera Mini、SymbianOSなど)は HTML5未対応です。
デスクトップ用サイトをズーム機能などで見やくする工夫はしています。
しかし、メディアクエリやviewportはサポートされていません。
進展国では現在も安いフィーチャーフォンが主流なため、ブラウザにRespond.jsのハンディキャップを負わせることは芳しくありません。
②スタイル定義の順番とファイル構成
H5BPでは、以下ような順番でスタイルを定義することが提案されました。
- 1.メディアクエリなしで狭いビューポート用スタイルを定義
- 2.メディアクエリで他のデバイス用スタイルを定義
- 3.最後に IE6-8 用スタイルをコンディショナル・コメントで定義
従来は、スタイルシートをall-in-one(全てが一体)で設計していました。
それを、今度は適切なファイルに分割する事でRespond.jsを外すというアイディアです。
具体的には、以下のような方法です。
フィーチャーフォンに最も優しいタイプ
base.css:
最も狭いビューポート用スタイルと、全ブラウザ共通の基本スタイルを設定。
style.css:
最初にデスクトップ用をメディアクエリなしを設定。
残りをメディアクエリ付きで定義してIE6-8と共用可能にする。
※style.css をモバイルファーストで定義する場合、IE6-8 は専用にします。
<!-- 最も狭いビューポート用・全ブラウザ用基本スタイル --> <link rel="stylesheet" href="base.css" media="all"> <!-- デスクトップ・ファーストで定義した広いビューポート用スタイル --> <link rel="stylesheet" href="style.css" media="all and (min-width: 30em)"> <!-- IE6-8 向けのデスクトップ用スタイル(同一ファイル) --> <!--[if (lt IE 9) & (!IEMobile 7)]> <link rel="stylesheet" href="style.css" media="all"> <![endif]-->
IE6-8に最も優しいタイプ
style.css:
最初に最も狭いビューポート用をメディアクエリなしで記述。
残りをメディアクエリ付きでモバイル・ファーストに定義する。
desktop.css:
IE6-8 専用のdesktop用スタイルを集約して定義する。
<!-- モバイル・ファーストで定義した IE6-8 以外のブラウザ用 --> <!--[if (gt IE 8) | (IEMobile 7)]><!--> <link rel="stylesheet" href="style.css"> <!--<![endif]--> <!-- IE6-8 向けのデスクトップ用 --> <!--[if (lt IE 9) & (!IEMobile 7)]> <link rel="stylesheet" href="desktop.css"> <![endif]-->
上記の方法は、Sassで紹介されています。
→ sass
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1