スマートフォン向けWebサイト制作につきまとう問題といえば、軽量化。
現在は、高スペック端末が世の中を席巻しているとはいえ、個人的に最近絶不調のAndroid2.3を使っているということもあり、軽量化は永遠の課題といえます。
ということで、フロントサイドで実施できる、基本的な軽量化テクニックをまとめてみました。
よく聞くのは「セレクタは右から左へ読まれる」ということ。
ということは、あまりに深い構造のセレクタを使用するのは良くない。
わかってはいたのですが、最近Sassを導入し始め、ネスト機能が楽しすぎてこんなカオスなコーディングをしていたことがありました。
#main { .contents { div { #hoge { .hogehoge { color: #000; } } } } }
#main .contents div #hoge .hogehoge { color: #000; }
...はい、ほぼ不要。
1ページ 1idですから、これで済むはずです。
#hoge .hogehoge { color: #F00; }
idがいちばん早く呼び出せるセレクタだと言えますが、ページ内すべてのコンテンツにユニークなidを振ることはさすがに大変で非効率なので、id、class等を絡めて、どう指定したら効率的に呼び出せるか考える必要がありますね。
参考:
- Writing efficient CSS selectors - CSS Wizardry
画像を使うということは、その画像自体の容量はもちろん、表示する際に画像ごとにHTTPリクエストが発生するので、遅延の原因になります。
スマートフォンサイトでは、CSS等での表現テクニックを使って、画像なしでもデザイン面で遜色ないサイトが実現可能です。
また、画像書き出しの手間が省けるのも嬉しいところです。
以下は、CSSだけで実装できる代表的な装飾たちです。
この辺のテクニックについては、弊社スズキリュウスケが小ネタ集をご紹介しておりますので、ご参考にどうぞ!
余談:最近はまったこと
何百件単位のリストをページ分割せずに徐々に1ページ内に表示するという案件を担当した際、手持ちのAndroid2.3端末だと、ある程度の件数を読み込むとブラウザが落ちるという現象が発生していました。
モロモロ検証を行ってみたところ、以下の指定が問題でした。
<section class="aaa"> <div class="bbb"> . . . </div> </section>
.aaa { background: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #CCC), color-stop(0.00, #FFF)); . . . } .bbb { background: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #000), color-stop(0.00, #333)); . . . }
そう。重ねたコンテンツそれぞれの背景にグラデーションを指定していたのです。
いくら画像をリクエストしてないといっても、リストのような繰り返しされるコンテンツに指定した場合、その分だけグラデーションを描画しているわけですから、重くなるのも当然。
描画処理に耐え切れなくなったんだか、面倒くさくなったんだか、端末にずいぶんと無理をさせていたようです。
いままで画像で用意していたアイコンを、フォントとして表示するテクニック。
svgファイルなので、拡大してもきれいなまま、大きさも自由に指定できるので便利です。
配布されているものを使ったり、自作することも可能です。
また、アイコンだけでなく文字のほうでもWebフォントを使えば、画像なしでデバイスフォントの味気なさから脱することが可能です。
見出し等の重要なポイントで使うのが効果的ですね。
欧文が主流ですが、和文も有料であれば結構あるようです。
極力画像を使わない方法を模索しても、デザイン上まったく使わないということはなかなか難しいです。
CSSスプライトを使って、画像はまるっとまとめて呼び出してしまいましょう。
主にアイコンや、PCサイトでもボタン画像によく使われるテクニックですね。
画像をいくつかまとめてスプライト画像として書き出した場合、その画像の容量がひとつひとうの合計より大きい場合があり、これって意味あるのだろうか?などと疑問に思ったりもしましたが、要はHTTPリクエストを減らすということ。
前述の通り、小さな画像でもひとつひとついちいち呼び出しているとページ表示遅延の原因になります。
納品時には、画像の最適化はもちろん、CSSやJSも必要に応じてミニマイズ化したほうが良い場合もあります。
当たり前のことですが、最初にイメージを持ってから取りかからないと、後から破綻すること必至。
「Don't think, feeeeeeeeeel!」
とトラックスーツのあの人は言っていましたが、やはりコーディングに関しては、
「Think!」
ということで、どうぞよろしくお願いします。