ふろしき Blog

コンテンツサービスを科学する株式会社ブートストラップ代表のブログ

IE11のユーザエージェント問題 - 開発者側でできる対策 (判定方法の変更/互換性モードの利用)

既存のWebサイト・システムがIE11で動作しない場合、ユーザエージェントの観点では以下の何れかで対策が可能です。

  1. navigator.userAgent文字列からの判定
  2. HTMLドキュメント内から、互換性モードの操作

上記の対策はどちらも、"課題"があります。

近年のWeb開発/制作の指針は、ユーザエージェントによる動作の切り替えではなく、Webブラウザの持つ機能による切り分けが推奨されています。あくまでここに書かれている対策は、既存資産を最小のコストで動作可能にするためのものです。

新規の開発/制作では、この記事を参考に対策して下さい。

1. navigator.userAgent文字列からの判定

IE11のユーザエージェントを、JavaScriptの「navigator.userAgent」から取得した場合、HTTPリクエストヘッダから取得するよりも多くの情報が得られます。しかし判定で利用する情報は、HTTPリクエストヘッダの時と変わりません。

▼IE10

Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)

▼IE11

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; NP06; rv:11.0) like Gecko

IE10まではMSIEの文字列とその直後の数字で、Webブラウザ・バージョンの判定ができていました。多くのサービスが、判定にはこの文字列を利用しているはずです。しかし、IE11からは「MSIE」の文字列が無くなり、バージョンを表す数字も削除されてしまいました。

ただし、Tridentというブラウザエンジンを判断する情報は残されています。また、新しく「rv:11.0」というバージョンを表す別の情報が追加されています。

注意が必要なのは、IE10までの「MSIE 10.0」の「10.0」の箇所は、互換性モードを利用した際にどのモードかに応じて変化しました。例えば、IE7互換モードであれば、「MSIE 7.0」といった具合にです。

しかし、IE11から追加された「rv:11.0」という情報は、互換モード動作時も同じ「rv:11.0」のままです。IE11をIE10の互換モードで動かしても「rev:11.0」という文字列は変わりません。

つまりIE11では、使っているレンダリングエンジン(Trident)であることの判定、どのバージョンのIEを使っているかという情報までは確認できても、互換性モードが有効な時にどのバージョンの状態で動作しているかまでは確認できません。

これらを踏まえたIEの判定、バージョンの判定は以下の通りです。

// IEであるか否かの判定
var isIE = false; // IEか否か
var version = null; // IEのバージョン
var ua = navigator.userAgent;
if( ua.match(/MSIE/) || ua.match(/Trident/) ) {
    isIE = true;
    version = ua.match(/(MSIE\s|rv:)([\d\.]+)/)[2];
}

上記のスクリプトを、Webブラウザの設定やHTTP Responseヘッダ、ActiveDirectoryなど他の設定手段を無視して確実に動作させるには、HTMLドキュメント内で以下の設定が必要です。

<meta http-equiv="X-UA-Compatible" content="IE=edge"> 

そもそもですが、本仕様はIE12まで継続されるかも不明です。Microsoftがこの手の実装を排除する指針である以上、ユーザエージェント周りにどのような変更が行われても不思議ではありません。

なお、上記と類似した実装をjQueryでも提供されています。状況によっては、利用してみるのも手でしょう。

▼plugin for the dependency problem
http://plugins.jquery.com/depend/1.1.5/

HTMLドキュメント内から、互換性モードの操作

IEがユーザエージェント文字列に「MSIE」を含んでいた時代の動作をエミュレートさせるよう、互換性モードを変更する制御情報を与えるという手段です。IEが最新でない状態で動作するためあまり良い方法ではありませんが、既存資産を維持する目的であればわりと一般的です。

以下の文字列を、HTMLドキュメントのhead要素内のできる限り序盤に配置することで実現できます。

<meta http-equiv="X-UA-Compatible" content="IE=10"> 

このmeta要素は、IEがバージョン10以上の場合に、IE10のレンダリングエンジンで動作するように指示するものです。IE10時代はユーザエージェントに「MSIE」の文字列が含まれていたため、これに依存したJavaScriptコードは正常に動作できるようになります。

HTMLドキュメント内でも、Webブラウザの制御を行うもの、例えば上記以外にも<meta charset="utf-8" />のようなタイプのものは、head要素の序盤に配置しないと有効になりません。今回紹介したUA-Compatibleも、割りと敏感な部類に入りますので配置場所には注意して下さい。

たまに新しく開発する業務システムでも、非常に古い互換性モード(Quirksモード)で動作させるような対処をしているという話を聞きます。しかしそれは、良くない対処方法です。今のところMicrosoftはIE5時代からの動作がエミュレートできるような機能を提供し続けていますが、今後それが維持されることまでを保証していません。そもそもですが、新規で開発するものをわざわざ下位互換のために提供した機能で動作させる事自体、ナンセンスであることは言うまでもないでしょう。

新規では最低でも、開発対象バージョンをUA-Compatibleの下限にする程度の対処に抑えましょう。使うこと自体は全く間違いではないのですが、使い所を間違いやすい危険な機能です。入門レベルのプログラマが、ネット上のブログからコピペしてしまうなんていう地雷を含む恐ろしい機能です。ご注意下さい。

IE11のユーザエージェント問題 - ユーザ側でできる解決策 (互換表示機能の利用)

IE11でのみWebサイト・システムへアクセスできない場合、以下の問題が考えられます。

  1. サーバ側でIE11からのアクセスを拒否している。
  2. IE11のレンダリングエンジンに問題があり利用できない。

以下の対策で、改善される可能性があります。

1. サーバ側でIE11からのアクセスを拒否している場合

この問題は、IE11のHTTPリクエストヘッダに含まれるユーザエージェント情報を元に、出力するHTMLドキュメントを変えているケースに生じます。IE11のユーザエージェントから、MSIEの文字列が削除されたため、サーバがWebブラウザの特定を行えず予期せぬ動作を起こしている状態です。

サーバ側で拒否されているかを確認するには、IE11に付属している「F12開発者ツール」の利用が有益です。対象のWebサイト・システムへアクセスしている状態で、F12を押下して下さい。

Webブラウザの下方に、F12開発者ツールの画面が表示されます。
f:id:furoshiki0223:20131111185123p:plain

ツールの左下「の逆三角のボタン」を何度かクリックして下さい。
f:id:furoshiki0223:20131111185948p:plain
一番下に見つかる「デスクトップPC風アイコン」をクリックして下さい。
f:id:furoshiki0223:20131111190048p:plain
「ユーザーエージェント文字列」という項目を、「Internet Explorer10」に変更して下さい。
f:id:furoshiki0223:20131111190445p:plain
f:id:furoshiki0223:20131111190209p:plain

この対策で表示されることが確認できた場合、原因はサーバ側の問題にあることが確定されます。不便ですが、アクセスする都度、本手順を行わなくてはいけません。Webサイト・システム管理者の改善を待たなくてはいけないでしょう。

ただし、次章の手順を実行すると状況が改善される可能性があります。

2. IE11のレンダリングエンジンに問題があり利用できない場合

IEには、Webサイトの利用者側で、特定のドメインに対する「互換性モード」の切り替えを行う機能を持っています。

Microsoftでは、IEをエンタープライズ用途(企業内向け)で利用されることを想定しており、ライフサイクルの長いシステムのプラットフォームとして利用されることを前提とした、様々な機能が提供されています。

互換性モードは、IEのバージョンアップを行っても、古いWebサイト・アプリを継続して利用できるよう、古いレンダリングエンジンの動作をエミュレートすることができる機能です。

以下の手順に従い、設定を試してみて下さい。

IEのウィンドウ右上にある「歯車アイコン」をクリックし、「互換表示設定(B)」をクリック。
f:id:furoshiki0223:20131111201907p:plain

ドメイン名を入力し、「追加」をクリック。
f:id:furoshiki0223:20131111202037p:plain

閉じるをクリックすると、IEは再びロードを開始し、古いレンダリングエンジンによる動作を開始します。IE11では、「互換表示設定」にて指定されたドメイン名(URL)のWebサイトは、「IE7」の動作を再現させます。

社内システム用途のWebアプリケーションでは、古いものはIE6用として開発されたものが多いという状況でしょう。IE8以上への移行では大抵の場合、IE5〜6の動作を再現させる「Quirksモード」でなく、「IE7互換モード」で動かすのが定番となっているようです。

IEの「Quirksモード」はバージョン10以降、IE5~6の世代には付随していない最新のWeb標準の機能が追加されています。したがって、IE6のかなりコアな機能を利用したWebサイトは、正しく動作しない可能性があります。

比較的機能の近い「IE7互換モード」を利用するのは現実的な手段であり、IE11のこの動作は理に適っていると言えるでしょう。

パッチによる改善

IEはセキュリティパッチを定期的にリリースし、不具合については基本的にそのままにしておくことで、安定したプラットフォーム提供を実現しています。

しかしIE11はリリース直後に信頼性に関わる問題が発覚し、急遽パッチが配布されることになりました。これを適用することで、かなり改善されたという声も聞きます。特に、Windows8.1を利用している方は、IEの最新化を行わないと最高のパフォーマンスは発揮できないものと考えてください。

▼Download Center(パッチの配布先)
http://www.microsoft.com/ja-jp/download/default.aspx

新しいIEは、ActiveXのようなIE独自のテクノロジーが減ったため、アップデートで動作不良を起こすリスクも減っています。企業をターゲットとしたゼロデイ攻撃は今もなお増えていますので、安全な運用を行うため、IEのバージョン最新化も計画的に進めていくよう心がけて下さい。

1300の優良サイトが選んだ「ページレイアウト(Page Layout)」ライブラリ集 - タイルレイアウト・可変グリッドレイアウト・レスポンシブWebデザインなど

1300の優良サイトを調査してみたシリーズ、第13回は「ページレイアウト(Page Layout)」です。

タイルレイアウト・可変グリッドレイアウト・レスポンシブWebデザインと、様々なページレイアウトの思想が時代の流れとともに生み出されてきました。

ふろしき.jsの調査では1300中110サイト(8.46%)にて、ライブラリ・フレームワークによる対策が確認されました。以下が、その一覧です。

heightline.js (56件 - 8.46%)

f:id:furoshiki0223:20131023003500p:plain
ブロック要素の高さを制御するライブラリです。文字列が含まれているブロック要素は、環境によって高さが変動します。本ライブラリは、複数のブロック要素の高さを一番大きいものに統一させることで、タイルレイアウトの実装を助けます。

jQuery Masonry (13件 - 1.00%)

f:id:furoshiki0223:20131023002726p:plain
各ブロック要素をウィンドウ内で、大きさに合わせてレンガのように隙間なく埋める見た目となる可変グリッドレイアウト向けのフレームワークです。

jQuery Tile (10件 - 0.76%)

f:id:furoshiki0223:20131023002823p:plain
heightline.jsと類似した機能を持つ、タイルレイアウトの実装を助けるライブラリです。

jQuery vgrid (10件 - 0.76%)

f:id:furoshiki0223:20131023002913p:plain
可変グリッドレイアウト向けの和製フレームワークです。

jQuery AutoHeight (7件 - 0.53%)

f:id:furoshiki0223:20131023003119p:plain
heightline.js/jQuery Tileと類似した機能を持つ、jQueryライブラリです。

jQuery isotope (6件 - 0.46%)

f:id:furoshiki0223:20131023003156p:plain
可変グリッドレイアウト向けのフレームワークです。

fixheight.js (5件 - 0.38%)

f:id:furoshiki0223:20131023003255p:plain
heightline.jsと類似した機能を持つ、タイルレイアウトの実装を助けるライブラリです。

Twitter Bootstrap (3件 - 0.23%)

f:id:furoshiki0223:20131023003010p:plain
ウィンドウの横幅が広い時はブロック要素を12分割で幅指定、狭い時はタブレット・スマホ向けの分割無しの状態で表示する、レスポンシブWebデザイン向けフレームワークです。

所感

世の中で騒がれているよりも、Twitter Bootstrapは利用されていないということが発覚しました。そして時代としては、可変グリッドレイアウトに少し傾きかけているという印象です。

どちらにせよ、マルチデバイス対応が必須の要件になっているのが興味深いですね。っというか、最近はネイティブアプリでさえ、こういうデザインに変わっていってますよね。

1300の優良サイトが選んだ「ページスクローラー(Page Scroller)」ライブラリ集

1300の優良サイトを調査してみたシリーズ、第12回は「ページスクローラー」です。

ボタンクリックなどのイベントに反応して、ページの先頭や任意の要素にスクロールさせる機能を、「ページスクローラー」といいます。

ふろしき.jsの調査では、1300中68サイト(5.23%)にてライブラリによる対応が確認されました。シンプルな機能であるはずが、かなりバリエーション豊かなライブラリにより実現されていました。1300サイトに含まれていたものを網羅的に列挙しているため、この中からきっと、希望する動作のものを発見することができるでしょう。

jQuery Page Scroller (31件 - 2.38%)

f:id:furoshiki0223:20131022232928p:plain

Smooth Scroll (29件 - 2.23%)

f:id:furoshiki0223:20131022232956p:plain

jQuery Scroll to Top Control (12件 - 0.92%)

f:id:furoshiki0223:20131022233034p:plain

scrollsmoothly.js (8件 - 0.61%)

f:id:furoshiki0223:20131022233116p:plain

Page Scroll (4件 - 0.30%)

f:id:furoshiki0223:20131022233142p:plain

jQuery Smooth Scroll (3件 - 0.23%)

f:id:furoshiki0223:20131022233222p:plain

1300の優良サイトが選んだ「コンテンツスクロールバー(Content Scroll-bar)」ライブラリ集

1300の優良サイトを調査してみたシリーズ、第11回は「コンテンツスクロールバー」です。

利用規約などを表示する画面では、CSSの「overflow:scroll」プロパティを利用して、ブロック要素に対してスクロールバーを与えることがあります。これを「スクロールバー」や「コンテンツスクロールバー」と呼び、専用のライブラリを用いて装飾を行うことが多いようです。

今回も、1300サイトに含まれている全てのライブラリ一覧化しています。きっと気に入ったデザインものが見つかるはずです。なお、ふろしき.jsの調査では、1300中47サイト(3.61%)にてライブラリが確認されました。

jQuery jScrollPane(34件 - 2.61%)

f:id:furoshiki0223:20131022224727p:plain

jQuery ScrollTo (13件 - 1.00%)

f:id:furoshiki0223:20131022224906p:plain

flexcroll.js (8件 - 0.61%)

f:id:furoshiki0223:20131022225001p:plain

Nicescroll (4件 - 0.30%)

f:id:furoshiki0223:20131022225311p:plain

malihu Custom Scrollbar (4件 - 0.30%)

f:id:furoshiki0223:20131022225350p:plain

最後に

CSSで設定すれば良いぐらいに思っていたスクロールバーに、ここまで色んなバリエーションがあったというのは驚きですね。特に、商用製品が高いシェアを得ていることに、驚きを感じています。

1300の優良サイトが選んだ「フルスクリーンバックグラウンドイメージ(Full Screen Background Image)」対策ライブラリ集

1300の優良サイトを調査してみたシリーズ、第10回は「フルスクリーンバックグラウンドイメージ(Full Screen Background Image)」です。

背景にフルスクリーンの状態で画像を表示させるには、独特なノウハウを必要とします。この対策への呼び名は日本にはまだ輸入されていませんが、海外だと「Full Screen Background Image」と呼ばれています。

CSS2のみでも対策は可能です。以下が、その記述方法です。

▼ CSS

html, body {
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0;
}
#full-screen-background-image {
  z-index: -999;
  min-height: 100%;
  min-width: 1024px;
  width: 100%;
  height: auto;
  position: fixed;
  top: 0;
  left: 0;
}
#wrapper {
  position: relative;
  width: 800px;
  min-height: 400px;
  margin: 100px auto;
  color: #333;
}

▼ HTML

<body>
  <img alt="full screen background image" src="/background.jpg" id="full-screen-background-image" /> 
  <div id="wrapper">
    <p>Content goes here...</p>
  </div>
</body>

ただし、ライブラリを使えばノウハウが無くても対策が可能です。ふろしき.jsの調査では、1300中18サイト(1.38%)にてライブラリによる対策が確認されました。

jQuery MaxImage (12件 - 0.92%)

f:id:furoshiki0223:20131023000012p:plain
背景画像をフルスクリーン化させるだけでなく、スライダーとしても機能します。

jQuery Backstretch (6件 - 0.46%)

f:id:furoshiki0223:20131023000157p:plain
背景画像をフルスクリーン化させます。

最後に

ノウハウが多いとはいえ、やろうと思えばやれてしまう気軽さが悩みどころですね。JSライブラリは、なんだかんだ言っても、ロード時間を遅らせますからね。

1300の優良サイトが選んだ「オーバーレイイメージ(Overlay Images)」ライブラリ集

1300の優良サイトを調査してみたシリーズ、第9回は「オーバーレイイメージ」です。

Webページ上の画像をクリックした際に、同一ウィンドウ内に拡大された画像を表示する処理を、「オーバーレイ」や「オーバーレイイメージ」といいます。

ふろしき.jsの調査では、1300中76サイト(5.84%)にて、ライブラリによる対策が確認されました。デザインに関わる部品ですが、1300サイトで活用されているライブラリを一覧化しているため、きっと欲しいものが見つかるはずです。

jQuery fancybox (29件 - 2.23%)

f:id:furoshiki0223:20131023005645p:plain

  • 公式サイト:http://fancyapps.com/fancybox/
  • ライセンス:Creative Commons(Attribution-NonCommercial 3.0 Unported)
  • 開発:Janis Skarnelis

Lightbox (21件 - 1.61%)

f:id:furoshiki0223:20131023005728p:plain

shadowbox.js (12件 - 0.92%)

f:id:furoshiki0223:20131023005817p:plain

thickbox.js (9件 - 0.69%)

f:id:furoshiki0223:20131023005857p:plain

prettyPhoto (5件 - 0.38%)

f:id:furoshiki0223:20131023005959p:plain
LightboxライクなjQueryプラグインですが、画像以外も扱えるという特徴を持ちます。

最後に

こればっかりは、サイトデザインに関わるところなので、ベストプラクティスも何もないですね。

1300の優良サイトが選んだ「pjax」ライブラリ集と問題点

1300の優良サイトを調査してみたシリーズ、第8回は「pjax」です。

Webアプリケーションには、「http://〜/sample.cgi」のようなクエリストリングでなく、「http://〜/#!/sample」のようにハッシュとして持たせ、Ajaxによってデータを動的に取得する仕組みのものがあります。

その際、「#」や「#!」の後ろに続くパラメータを「ハッシュフラグメント」といいます。「Ajax URL」という呼び方もされます。

インターネット上でこれを実現する場合、Googleが公開しているドキュメントを参考に、URLのデザインを決定することになります。

また、ハッシュフラグメントを利用したハイパーリンクはページ内移動という扱いになるため、「戻る」ボタンが有効に機能しなくなります。これには、pushStateを利用することで改善を図ることができます。

ここで紹介するライブラリは、1300の優良サイトが行っているpjaxの課題対策です。ふろしき.jsの調査では、32件(2.66%)のサイトで対策が確認されました。

navi.js (20件 - 1.53%)

f:id:furoshiki0223:20131022231147p:plain
ハッシュフラグメントを使ったWebページの作成を実現するためのフレームワークです。ハッシュフラグメントの課題を意識することなく、アプリの開発を行えます。

  • 公式サイト:http://navi.grantcr.com/
  • ライセンス:MIT / Creative Commons Attribution-ShareAlike 3.0 Unported License.
  • 開発:Tyler Grant

jQuery Ba Hashchange (12件 - 0.92%)

f:id:furoshiki0223:20131022231220p:plain
「戻る」ボタン、「進む」ボタンがクリックされた際の動作を作りこむライブラリです。

pjaxの弱点

pjaxは一時期盛り上がった手段ではありますが、現在多くのWebサイトが元に戻す傾向にあります。Twitterも一時は採用していましたが、現在は「http://twitter.com/kawada_hiroshi」のようなURL表記にリダイレクトされるようになりました。

pjaxで作ったページは、Googleの検索エンジンのクローラから読み取れるようにするためには、JavaScriptを利用しなくても読み取れるページを「http://〜/?_escaped_fragment_=/sample」のフォーマットに従って作成する必要があります。JavaScriptが無効の環境、つまりクロスブラウザ対応が完全にはならないのです。

ローカルネットワークのアプリケーションでは課題にならないでしょう。業務系アプリの場合だと、どちらが良いか選択の余地は十分にあるかと思います。

現実指向コーディング 〜Web標準やブラウザ仕様に負けない、現実的な方法を模索する〜

★ 最新の機能が使いたいんだけど・・・

HTML5の登場で、既存の機能にも置き換えが進んでいます。とはいえ、古いIEがシェアを得てしまっている現状を鑑みると、いきなり新しいWeb標準を使うわけにもいきません。古いIEのために、Shim/Polyfillと呼ばれるライブラリを使ったり、Modernizrというライブラリを使って、クロスブラウザ対策を行わなくてはいけません。場合によっては、自力でゴリゴリ書いて何とかしなくちゃいけないかもしれない、大変な作業です。

このような状況の中、実用的にコーディングする場合、多くはIEの古い機能について理解しなくてはいけません。古いIE、やつは本当にひねくれ者です。ひねくれ者のことなんて無視したいけど、現実を見なくてはいけません。古いIEの独自機能の特性を踏まえて、どうやって記述すべきか戦略を立てる必要があります。

★ ブラウザだけが読み込んで欲しいんだけど・・・

HTMLドキュメントは昔、シンプルなブラウザから読み込まれるのが前提でした。ところが、ブラウザ自身がやたらと細かい機能を持っていたり、開発の現場だとXMLパーサに食わせなくちゃいけなかったり、Facebook/Twitterなどのソーシャルサイトから読み込まれてタイトルやサムネイルを判別させなくちゃいけなかったりで、結局Web標準の中を覗いただけでは何をすれば良いかわかりません。

色んな所から見られている、なんとも住みにくい世界になってしまいました。

★ 現実世界のためのコーディング

こうした2つの問題に対して、理想を語っても良いんだけど、、現実世界の泥臭い諸々の部分を考えると「ぶっちゃけ、どう作れば良いの?」というところに、答えを見つけてみようかと思います。コンテンツは徐々に増やしていくので、気長にお待ちください。


  1. マウス/タッチ/ペンのイベントの扱い方


OSSな開発・制作ツールを使いこなすための一夜漬けノート

やたらといっぱいあって、覚えるのが面倒なWebの開発/制作ツールたち。やつらを、いかにして最短ルートでマスターするかについて考え、記事にしてみます。

コンテンツはこれから、、増えるはずです。


★ b. OSSによるSingle-page Applicationフレームワーク

  1. 概要


1300の優良サイトが選んだ「コンテンツスライダー(Content Slider)」ライブラリ集

1300の優良サイトを調査してみたシリーズ、第7回は「コンテンツスライダー」です。

画像ファイルや動画ファイルをスライドショーのように表示させるアニメーションを、「コンテンツスライダー」といいます。デザインに関わるためどれがベストとも言えませんが、1300サイトに含まれていたライブラリを一覧化したため、きっと欲しているものに出会うことができるはずです。

なお、ふろしき.jsの調査では、1300中139サイト(10.69%)にてライブラリの使用が確認されました。

The Responsive jQuery Content Slider (29件 - 2.23%)

f:id:furoshiki0223:20131022222142p:plain

jQuery Cycle / Cycle All (26件 - 2.00%)

f:id:furoshiki0223:20131022222232p:plain

jQuery Colorbox (20件 - 1.53%)

f:id:furoshiki0223:20131022222306p:plain

slider.js (15件 - 1.15%)

f:id:furoshiki0223:20131022222340p:plain

jQuery jcarousel (15件 - 1.15%)

f:id:furoshiki0223:20131022222446p:plain

jQuery Nivo Slider (18件 - 1.38%)

f:id:furoshiki0223:20131022222536p:plain

slideshow (12件 - 0.92%)

f:id:furoshiki0223:20131022222618p:plain

MaxImage (12件 - 0.92%)

f:id:furoshiki0223:20131022222655p:plain

jQuery Innerfade (9件 - 0.69%)

f:id:furoshiki0223:20131022222742p:plain

Galleriffic (5件 - 0.38%)

f:id:furoshiki0223:20131022222822p:plain

FlexSlider (5件 - 0.38%)

f:id:furoshiki0223:20131022222902p:plain

Caroufredsel (5件 - 0.38%)

f:id:furoshiki0223:20131022222934p:plain

1300の優良サイトが選んだ「マウスオーバー・ロールオーバー」ライブラリ集

1300の優良サイトを調査してみたシリーズ、第6回は「マウスオーバー・ロールオーバー」です。

画像やブロック要素などのオブジェクトは、マウスポインタが当たった際にビジュアルデザインが変化することを求められることがあります。これを広義では「マウスオーバ」といい、画像の場合は「ロールオーバ」、ハイパーリンクは「ホバー」と呼び分けをします。

ふろしき.jsの調査では、1300中189サイト(14.53%)にて対策が確認されました。

rollover.js (86件 - 6.46%)

f:id:furoshiki0223:20131022220229p:plain
img要素のロールオーバ処理を実装します。

smartrollover.js (37件 - 2.61%)

f:id:furoshiki0223:20131022220311p:plain

jQuery Opacity Rollover (24件 - 1.84%)

f:id:furoshiki0223:20131022220530p:plain
透明度を利用することで、一枚の画像のみでロールオーバ処理を実現します。

jQuery.rollover.js (13件 - 1.00%)

f:id:furoshiki0223:20131022220405p:plain
jQueryを利用して、img要素のロールオーバ処理を実装します。

smoothrollover.js (11件 - 0.84%)

f:id:furoshiki0223:20131022220622p:plain

jQuery Biggerlink (11件 - 0.84%)

f:id:furoshiki0223:20131022220655p:plain
jQueryを利用して、ブロック要素のマウスオーバ処理を実装します。

rollover2.js (7件 - 0.53%)

f:id:furoshiki0223:20131022220810p:plain
クロスフェードなimg要素のロールオーバ処理を実装します。

最後に

今回も、1300サイトに含まれていた全ての対策方法を紹介してみました。やっていることはシンプルですが、使われているライブラリの種類が非常に豊富なのが特徴ではないでしょうか。

流石に1300サイトを対象にしたので、網羅性は非常に高いと思いますので、悩んだ時は上記のライブラリから自分に合った物を探してみると良いでしょう。

1300の優良サイトが選んだ「CSSのポリフィル・シム」ライブラリ集

1300の優良サイトが選んだシリース、第5回は「CSSのポリフィル・シム」です。

レガシーIEは、CSSに不具合や新標準への未対応という問題があります。日々追加されるCSS3プロパティや新しいセレクタへの対応を必要とする場合、「ポリフィル」または「シム」と呼ばれる機構を持つライブラリにて対応します。

今回、1300のサイトを調査し、利用頻度の高いCSSポリフィル・シムライブラリについて調査しました。

この領域でベストプラクティスと呼べるものはありませんが、網羅的な調査の結果得られた本サイトのライブラリ一覧は、制作の中で生じた課題に対する解決策の殆どカバーしているはずです。また、利用実績も可視化しているため、実用性判断の材料として活用してみてはいかがでしょうか。

IE7-js (35件 - シェア:2.69%)

f:id:furoshiki0223:20131020091304p:plain

公式サイトはIE7-jsという名前ですが、現在はIE7、IE8、IE9と3つのラインナップがあるようです。擬似クラス、属性セレクタ、透過PNG、position:fixed、margin:0 auto、max-height/width、min-height/width、その他IE5/6のバグ修正に対応します。

jQuery exFixed (37件 - シェア:2.84%)

f:id:furoshiki0223:20131020091314p:plain

レガシーIEで、CSS2標準のposition:fixedを動作できるようにするjQueryプラグインです。

css3-mediaqueries.js (19件 - シェア:1.46%)

f:id:furoshiki0223:20131020091324p:plain

レガシーIEで、CSS3標準のMediaQueriesを動作できるようにするライブラリです。

fixed.js (16件 - シェア:1.23%)

f:id:furoshiki0223:20131020091334p:plain

レガシーIEで、CSS2標準のposition:fixedを動作できるようにするライブラリです。

selectivizr (13件 - シェア:1.00%)

f:id:furoshiki0223:20131020091344p:plain

レガシーIEで、Web標準のSelectors Level 3を動作できるようにするライブラリです。かつては「ie-css3.js」という名称でした。

  • 公式サイト:http://selectivizr.com/
  • ライセンス:MIT License
  • 開発:KeithClark project.
  • 内訳:selectivizr(8件)、ie-css3.js(5件)

respond.js (13件 - シェア:1.00%)

f:id:furoshiki0223:20131020091359p:plain

レガシーIEで、max-height/width、min-height/width、MediaQueriesといった、レスポンシブWebデザインに必要なCSS機能を動作できるようにするライブラリです。

jQuery corner (9件 - シェア:0.69%)

f:id:furoshiki0223:20131020091409p:plain

レガシーIEで、border-radiusを実現するjQueryプラグインです。

minmax.js (8件 - シェア:0.61%)

f:id:furoshiki0223:20131020091419p:plain

レガシーIEで、max-height/width、min-height/widthが動作できるようにするライブラリです。

最後に

統合的に多くのCSSをポリフィルしてくれるもの、最小のポリフィルをしてくれるもの、jQueryを使ったシム、様々な提供方法がありますが、共通してW3CのCSS3を参考にしています。主として、レスポンシブWebデザインやリキッドレイアウトを実現するためのライブラリに偏っているようです。

同じ目的のものでさえ、これだけ豊富な種類が公開されているのです。CSS3の中でも新しいものは使えない環境がまだまだ多く存在しますが、諦めないでライブラリを調査してみるというのも手ではないでしょうか。

1300の優良サイトが選んだ「ブラウザの種類・機能判定」対策とベストプラクティス

1300の優良サイトが選んだシリース、第4回は「ブラウザの種類・機能判定」です。

以前「マルチブラウザとクロスブラウザの違いは何か?」という記事を書きました。コンテンツの相互運用性の対策を、「Webブラウザの種類」でやるか「Webブラウザの機能」でやるか、理想は後者が良いとは言われても、現実を見て前者も選択しざる得ないのが実状でしょう。

本サイトはあくまで実利主義なので、現場の実状に合わせて実際にどんな具体的な対策が行われているのか確認する方向で攻めてみようかと思います。

今回も、1300のWebサイトを解析し、実運用の中でどんな対策が行われているのか集計してみました。ここで得られた情報を元に、ベストプラクティスについて考えてみましょう。

IE条件付き書式 (1171件)

HTMLドキュメント内で、IEのバージョンごとに有効・無効を切り替えるIEの独自仕様。

<!--[if IE 6.0]>IE6の場合<![endif]-->
<!--[if IE 7.0]>IE7の場合<![endif]-->
<!--[if IE 8.0]>IE8の場合<![endif]-->
<!--[if IE 9.0]>IE9の場合<![endif]-->

jQuery (727件)

f:id:furoshiki0223:20131016153855p:plain
DOMを独自オブジェクトとして抽象的に扱い、マルチブラウザ対策を行うライブラリです。豊富なプラグインを持ち、JavaScriptベースRIAの実現に多大な影響を与えています。

  • 公式サイト:http://jquery.com/
  • ライセンス:MIT License
  • 開発:The jQuery Foundation.

CSS Browser Selector (7件)

CSS上でWebブラウザの種類を判定し、WebブラウザごとのCSSの作り込みが行えるようにするためのCSSライブラリです。

Useragent.js (7件)

JavaScript上でWebブラウザの種類を判定し、WebブラウザごとのJavaScriptの作り込みが行えるようにするためのJavaScriptライブラリです。

jquery.browser (5件)

Webブラウザごとの動作の差異を吸収するため、ユーザエージェントの特定処理を実現するjQueryプラグインです。 かつてはデフォルトで実装されていましたが、jQuery1.3以降サポートされなくなったAPIであるため、本プラグインの追加が必要です。

Modernizr (33件)

f:id:furoshiki0223:20131016153912p:plain
Webブラウザの持つHTML・JavaScript・CSS機能を判定し、機能の有無に応じたJavaScript/CSSの作り込みが行えるようにするためのライブラリです。

  • 公式サイト:http://modernizr.com/
  • ライセンス:MIT License
  • 開発 : Faruk Ateş、Paul Irish、Alex Sexton、Ryan Seddon、Alexander Farkas

ベストプラクティスは?

マルチブラウザとクロスブラウザ。どちらか一方だけに寄せるという考え方はあまりなく、セットで考えるのが一般的でしょう。HTML5 Boilerplateに入っているということもあり、条件付き書式+jQuery+Modernizrはデフォルトになりつつあるようです。

上記以外にも、CSSアスタリスクハックを使ったIE限定のCSSプロパティ指定など、キリが無いほど方法がありますが、ここでは上げません。ユーザスクリプトではあまり推奨される手段とは思えないためです。

Webブラウザのシェアの変化で、マルチブラウザからクロスブラウザに移行が進むかと思いますが、今はとりあえずこの組み合わせで踏ん張っていくのが良いでしょう。

1300の優良サイトが選んだ「AMD・遅延ロード」のベストプラクティス

1300の優良サイトが選んだシリース、第3回は「AMDと遅延ロード」です。

JavaScriptファイルのロードのパフォーマンス向上を図るメカニズムを「AMD(Asynchronous module definition)」といいます。Webアプリ開発を行なうデベロッパの方は、今後重要な知識になるでしょう。

一方で画像ファイルのパフォーマンスを向上させようという「遅延ロード(Lazy Load)」というアイデアもあります。こちらはサイトのデザインそのものにも影響を与えることになるため、Webアプリのデベロッパだけでなくデザイナの方も、仕組みを知る必要があるでしょう。

今回も、1300の優良サイトが採用しているAMD・遅延ロード手法を確認し、ベストプラクティスが何かを探ってみようかと思います。

画像ファイルの非可視エリアロード問題対策

画像ファイルのサイズは、比較的大きくなるという特徴を持ちます。そして対策を行わなかった場合、HTMLドキュメントのロードと同時に一斉にロードを始めて、サーバやネットワークのリソースを圧迫します。

しかしこれらの画像ファイルは、ロード直後にすぐ必要になるとは限りません。Webページの下部に配置された画像ファイルは、ユーザの目に触れることすら無い可能性があります。

こうしたWebページの特性に合わせて画像ロードをさせようというアイデアが、「Lazy Load(遅延ロード)」です。Webページ表示後、ユーザビリティを損なわない任意のタイミングで画像ファイルをロードさせることで、サーバやネットワークの負荷を最適化します。

f:id:furoshiki0223:20131014014812p:plain

1300中、5つのサイト(0.38%)にて、JSライブラリによる対策が確認されました。

★ Lazyload (5件)

JavaScriptの直列実行問題対策

画像ファイルは並列にロードすることでWebページ表示速度を改善しようとしますが、JavaScriptの場合はそうもいきません。JavaScriptファイル間に依存性を生じることがあるからです。

対策を行っていない場合、全てのJavaScriptファイルは直列にロードされます。一つずつ読み込みを行い、コンパイルを行ない、実行するという手順を踏みます。大規模な場合、Webページの初期表示のパフォーマンスの低下に繋がることがあります。

JavaScriptにもLazy Load(遅延ロード)という考え方があります。既にW3CのWeb標準にも組み込まれており、JavaScriptファイルの読み込みを行なうためのscript要素から、defer属性を通じて制御することができます。

<script src="xxx.js" defer></script>

また、最近は並列ロード・実行というアイデアにも注目を集めています。JavaScriptの依存関係を予め定義しておき、できる限りの並列実行を行おうというアプローチです。これを「AMD(Asynchronous module definition)」と呼び、CommonJSと呼ばれるデファクト標準でも扱われているテーマです。

1300中、14サイト(1.07%)にてJSライブラリによる対策が確認されました。

★ require.js (11件)

★ load.js (2件)

★ HeadJS (1件)

  • 公式サイト:http://headjs.com/
  • ライセンス:MIT License
  • 開発:Tero Piirainen

Modernizr(33件)のloadメソッドにもyepnope.js(0件)と互換のAPIを持ち、またSenchaフレームワーク(1件)やYeoman系フレームワーク(1件)にも活用されています。このため、上記の一覧が全てであるとは言い切れません。

ただ、単体での利用では、CommonJS準拠であり多くのフレームワークでも活用されている「require.js」がベストプラクティスであると判断できます。

CSSファイルとFOUC問題対策

CSSファイルは、JavaScriptや画像とはまた違った特性の問題を持ちます。

Webページを読み込み時、WebブラウザはHTMLドキュメントの内容を読み取り、逐次「レンダーツリー」という見た目の情報を整理します。

WebページはHTMLドキュメントを全て読み込んだ後に一括で表示するのではなく、読み込みを行いながら逐次Webブラウザのビューポート(コンテンツの表示エリア)に表示していくことで、体感速度の改善を図っているのです。

レンダーツリーを含む様々なツリー構築プロセスは「フロー処理」と呼びますが、その処理にはCSSプロパティ情報を必要とします。フロー処理完了後に遅延させてCSSファイルを読み込んでしまうと、これまで構築したレンダーツリー内で、影響のある範囲の情報を全て再修正を行なうことになり、フロー処理のパフォーマンスを劣化させることになります。

f:id:furoshiki0223:20131014021125p:plain

また、HTMLドキュメントの読み込み完了後からCSSファイルの読み込み完了までの間、ビューポート上にはCSSプロパティが適用されていない状態で表示されることになります。

非常に小さなファイルであれば気になりませんが、大規模なものになると読み込み直後に不格好な画面を一瞬だけユーザに見せてしまうことになります。これを「FOUC(Flash of Unstyled Content)」と呼び、一般的にはアンチパターンとして扱っています。

f:id:furoshiki0223:20131014021659p:plain

上記の特性から、CSSファイルのロード処理を最高のパフォーマンスで動作させることができるのは、フロー処理が開始される前です。

フロー処理は「フローコンテンツ」の読み込みによって行われ、これらはbody要素内に含めて記述するのがWeb標準のお約束です。つまり、head要素内で行うのが、ベストプラクティスです。

<head>
    ・・・
    <link rel="stylesheet" href="xxx.css" />
</head>
<body>
    ・・・
</body>

ただし、特定の条件を満足させた場合のみ特定のCSSファイルの内容を反映させたいというケースがあります。CSSファイルの読み込みはbody要素内で読み込んでも問題無いため、この場合例外的に遅延ロードは許容するというお作法があります。

多くの場合、JSライブラリを経由するのが一般的で、HTMLドキュメントのエディタは、CSSファイルが遅延ロードされていることを意識するようなことはありません。1300中17つのサイト(1.30%)にて対策が確認されました。

★ styleswitcher.js (17件)

注意点

画像の遅延ロードについては、PNG Fix対策と競合するため注意が必要です。遅延ロード対象は写真・絵でJPGフォーマットのみに限定し、PNG Fix対象はアイコン・ロゴをPNGフォーマットで縛るといった、用途ごとの使い分けが求められます。

Lazyloadは予め画像の縦・横サイズをimg要素に明示しないと、無駄なフロー処理を発生させることになります。このため、ユーザがアップロードした画像に対して利用する場合、サーバ側で画像の解析を行なう必要があります。こうした問題を解決してでも、対策が必要と感じる時に利用すべきです。

JavaScriptのAMDは、元はサーバサイドJavaScriptが発祥で、DHTMLベースRIAの実装技術として輸入されたものです。JavaScriptであまり複雑なことをさせない場合は、オーバヘッドが大きいためお勧めできません。script要素のdefer属性を利用する程度にしておくのが良いでしょう。

多くは、Webの進化で発生した問題への対応策で、正攻法とは言い難いです。Web技術を扱うプレイヤーはとても多様なので、ドメインを履き違えると逆に問題を大きくしてしまいます。何に対する対策なのかを明確にして、実装の可否を判断は慎重に行なうようにして下さい。

このブログの筆者について

川田 寛

コンテンツサービスの開発や運営代行を専門とする集団「株式会社ブートストラップ」の社長です。ネットではふろしきと呼ばれています。

2009年にNTTグループへ新卒入社し、ITエンジニアとしてクラウド技術・Web技術の研究開発と技術コンサルティングに従事。2015年よりピクシブに入社し、エンジニアリングマネージャー・事業責任者・執行役員CCOなど、様々な立場からコンテンツサービスの事業づくりに関わりました。2021年にメディアドゥへVPoEとしてジョインし出版関係の事業に関わったのち、2023年に独立しています。

関わってきたインターネット事業としては、ECサービスのBOOTH、UGCプラットフォームのpixiv(主に海外展開)、制作ツールのpixiv Sketch、VR・VTuber関連ではVRoid、Wikiサービスのピクシブ百科事典など、10を超える多様なCtoCコンテンツサービス。また、NTTドコモのすご得コンテンツ、メディアドゥのWeb3サービスであるFanTopなど、いくつかのBtoCコンテンツサービスにも関わってきました。

幸運なことに、私はコンテンツに関係する幅広いインターネットサービスのテクノロジー&ビジネスの知識を得ることができました。これを日本のコンテンツ発展に役立てたいと思い、株式会社ブートストラップを創業しました。

このブログでは現在、出版社やIPホルダー、ライセンサーといったコンテンツに関わる人々に向けて、インターネット事業に関するTipsや業界内のトレンドなどの情報を発信しています。私と話をしてみたいという方は、以下のフォームより気軽にご連絡ください。

お問い合わせフォーム