iOS5のMobile Safariから使えるようになったHTML5・CSSを試してみました【前編】


iPhoneがでた当初はWebApp押しだったAppleも3Gを出してからすぐにネイティブアプリに手のひらを返してしまって、WebAppはすっかり影がさしてしまいました。
それでも、jQTouchやSencha Touch、jQuery mobileなどWebAppの開発支援となるJavascriptライブラリが登場して一部では盛り上がったりもしています。PhoneGapみたいにWebAppをネイティブにパブリッシュするツールや、Titanium MobileのようにWeb言語ベースで開発してネイティブにするものもありますし、いろいろですね。
iOS4までのMobile SafariではCSSの一部のプロパティが使えなかったりで、よりリッチなWebAppをつくろうと思えばJavascript必要でした。
先日公開されたiOS5では今まで「なんで使えないの?」といったところが少し修正されて、結構やりたいことが出来るようになってきたと思います。
iOS5から利用出来るようになったものはCSSからHTML5エレメント・APIなど様々ですが、今回は新しく追加されたCSSプロパティ辺りを試しに使ってみたテクニックを紹介しようと思います。なのでJavascriptはほぼ使ってないです(ページのタイトルを変更するというどうでもいいところで使ってます)。

参考:Safari on iOS 5, HTML5 evolution for iPhone and iPad - Mobile Web Programming

iOS5 WebApp Demo(CSSのみで作るUI)

早速ですが、今回つくったWebApp Demoページを見てみてください。Webkit系のブラウザならほぼ再現できると思いますが、せっかくなのでiPhoneでホーム画面に登録して確認していただけると良いと思います。
(Webkit系以外のブラウザには特に何もしてないです。4つ目のタブの[Inline SVG]はページ内のSVGをいれまくったのでタップしてから描画されるまで時間かかります...orz すいません)

→ WebApp Demo : Overview of new things supported in iOS5 Safari

今回試してみたプロパティやテクニック

iOS5と関係ないものもあったりしますが、試してみたいのをいろいろと詰め込んみました。
本当はJavascript系のClassList APIやWeb Workers、ContentEditable、History Management API、LocalStorage、DeviceMotion API、External script filesなどなども試してみたかったのですがまた今度に。
ということで以下のようなことを試しました。順次、解説していきます。少し長くなってしまうので今回は最初の半分を紹介します。

  • position:fixedを使ったタブUI
  • overflow:scrollを1本指ですいすいスクロールさせる
  • Web Symbols typeface
  • CSS Only Transition Effects
  • 新しいInput typeとネイティブっぽいselect UI
  • Inline SVGとSVG icons

position:fixedを使ったタブUI

iOS5からposition:fixedを使えるようになったのは嬉しいですね!というかなんで今まで使えなかったのだろうといった感じでしょうか。
ネイティブアプリのようなUIをつくろうと思ったときに、よくある一般的なアプリなら固定されたヘッダーとフッターをまず考えると思います。
ナビゲーションボタンなどを配置してグローバルに切り替えるにはきっと役に立つと思います。
WebApp DemoでもヘッダーバーとフッタータブUIで使っています。

WebApp DemoではクリックイベントにJavascriptを使わず、Input要素と間接セレクタを利用しています。
Input要素をbody直下において、label要素でinputのchecked属性を操作します。input:checkedの擬似セレクタと間接セレクタ「~」でそれぞれのページdivやLabelをコントロールします。
Input要素と間接セレクタの組み合わせを使ったUIはコレ以外にも多用しています。
また、このUIの注意点としてlabel要素がタップできないという問題があります。この解決方法はlabel要素に空のonclick属性をつけることで解決できます。これは通常のフォームを作る場合にも発生する問題だと思うので覚えておくと良いと思います。
▼ HTML

<input type="radio" name="tab" id="tab1">
<input type="radio" name="tab" id="tab2">
<input type="radio" name="tab" id="tab3">
<div id="tab1-content">1</div>
<div id="tab2-content">2</div>
<div id="tab3-content">3</div>
<menu>
  <li><label for="tab1" onclick="">Tab1</label></li>
  <li><label for="tab2" onclick="">Tab2</label></li>
  <li><label for="tab3" onclick="">Tab3</label></li>
</menu>

▼ CSS

input, div {display:none}
menu {
  position:fixed;
  bottom:0;
  width:100%;
  height:44px;
  padding:2px 0;
  text-align:center;
  color:#aaa;
  background:#000;
}
menu li {
  display:inline-block;
  width:32%;
  height:20px;
  padding:10px 0;
}
input#tab1:checked ~ div#tab1-content,
input#tab2:checked ~ div#tab2-content,
input#tab3:checked ~ div#tab3-content {
  display:block;
}
input#tab1:checked ~ menu label[for='tab1'],
input#tab2:checked ~ menu label[for='tab2'],
input#tab3:checked ~ menu label[for='tab3'] {
  background:#666;
  color:#fff;
}

実際にシンプルに実装したサンプルはこちらです。

→FooterTab UI Demo

overflow:scrollを1本指ですいすいスクロールさせる

これもposition:fixedにつづき今までなんでできなかったのだろうというプロパティです。


正確にはoverflow:scrollというプロパティは今までのMobile Safariでも利用できていましたが、スクロールする際に2本指でスクロールさせる必要がありました。
分かりづらい操作である上に、動作も滑らかに表示されないのであまり使いものにならない感じでした。Sencha TouchはJavascriptでscrollを独自実装してその辺をクリアしていましたが、それぐらいのこと標準的な技術でクリアしたいものでした。
iOS5では1本指でスクロールできるようになりました。ただし、そのままのスクロール(overflow:autoやscrollのみ)で描画されるものは慣性がついていなくて動かしづらいスクロールになってしまいます。
そこで-webkit-overflow-scrolling:touchを加えると慣性スクロールが利用出来るようになります。-webkit-overflow-scrollingプロパティには「auto」と「touch」が指定できます。

<!--指定なし-->
<div style="overflow:auto;">
  Sample long text...
</div>

<!--指定あり「auto」-->
<div style="-webkit-overflow-scrolling:auto;overflow:auto;">
  Sample long text...
</div>

<!--指定あり「touch」-->
<div style="-webkit-overflow-scrolling:touch;overflow:auto;">
  Sample long text...
</div>

実際にシンプルに実装したサンプルはこちらです。

→Scrolling UI Demo

WebApp Demoではタブなどで切り替える各ページすべてにこのプロパティパティを用いていますが、少し注意する点があります。
通常のスクロールの場合、ある程度スクロールしたときにディスプレイのステータスバーをタップすると一番上まで自動的に戻る機能があります。
しかし、overflow-scrollingなどのscrollはそういったアクションが起こりません。WebApp Demoのようにwindow全体に敷き詰めて通常のスクロールのように見せている場合は、そういった操作ができないことがあります。

Web Symbols Typeface

Web Symbols Typefaceは今回のiOS5と少し関係ないのですが、最近見つけたアイコンの表示方法でちょっと試してみたいなと思ったので使ってみました。


Web Symbols TypefaceはWebFontを使って、タイプフェイスでアイコンを表示しようという試みで、JUST BE NICE STUDIOというサイトで公開されています。

参考:Web Symbols Typeface

最大の利点は、文字なのでどんなに拡大してもSVGのようにキレイに表示できること、カラーやシャドウなどをコントロールしやすい点ではないかと思います。JUST BE NICE STUDIOのサイトでは「よく使うシンボルをアイコンセットとして使い、デザイナーの作業コストを少なくする」と言っています。
WebApp DemoではフッターのタブUIのシンボルやコンテンツ内のちょっとしたアイコンに使用しています。
HTMLソースに意味のない記号が入ってしまうのはセマンティックっな考えからはずれてしまいますが、CSSの:after擬似クラスやcontentプロパティを上手く使って表示する分には良い方法だと思っています。

こちらもiPhoneデバイスで見るサンプルを用意してみました。

→Symbols Typeface Demo

Editorタブでは実際に入力して試せるようにしています(半角英数で入力してください)。テキストなので色やサイズをCSSで簡単に切り替えられるというデモになっています。

実際に使用する場合は、フォントファイルをWeb Symbols Typefaceのページからダウンロードしてきて、CSSには次のような記述を追加します。

@font-face{
  font-family: 'WebSymbolsRegular';
  src: url('/fonts/websymbols-regular-webfont.eot');
  src: url('/fonts/websymbols-regular-webfont.eot?#iefix') format('embedded-opentype'),
       url('/fonts/websymbols-regular-webfont.woff') format('woff'),
       url('/fonts/websymbols-regular-webfont.ttf') format('truetype'),
       url('/fonts/websymbols-regular-webfont.svg#WebSymbolsRegular') format('svg');
}
.symbol-icon {
  font-family: 'WebSymbolsRegular';
}

続きは後編で

今回つくったiOS5 WebApp Demoには他にも紹介したいことがあるのですが、長くなってしまうので残りは後編で書こうと思います。
サンプルはできるだけシンプルに分かりやすくしようと思うのですが、作っているうちにアレもやりたい・コレも試してみたいと欲が出てきてなんだかんだシンプルじゃなくなってしまって良くないですね。
まだまだ、こういうのはどうだろうというアイディアがあったりするので時間があればつくってみようと思います。API系も試してみたいし、時間がもっと欲しい!

追記(2011/10/31)

後編も書きました。前編では全く触れていない「縦書き」についても紹介していますので、よかったら読んでみてください。
iOS5のMobile Safariから使えるようになったHTML5・CSSを試してみました【後編】