2012年4月4日水曜日

レスポンシブデザイン

bootstrapが2.0で対応したレスポンシブデザイン。どの様なものか、調べてみた。

最近のウェブサイトのデザインは、PC、タブレットPC、スマートフォン、ガラケー、と数多くのデバイスで表示されることを想定する必要がある。

昔はユーザーエイジェントでサイトデザインを切り分けたり、そもそもURLが別だったりするのが一般的だったけど、今はじょじょに画面解像度を見てレイアウトを変更する手法が主流になりつつあるらしい。ただしメリットもデメリットもある様なので全面的にレスポンシブデザインに移行するとは考えにくい。


仕組みの簡単な説明


一昔前から目にすることのあった、Media typesの拡張。Media typesでは「モニター出力用スタイルシート」「印刷用スタイルシート」といった切り替えが行われていた。
 
<link rel="stylesheet" type="text/css" href="main.css" media="screen" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" />
@media screen {
  * { font-family: sans-serif }
}

@media print {
  * { font-family: serif }
}

CSS3ではタイプでは無く解像度などで細かく指定できるようになっていて、Media Queriesという名称に変わった。

例)400ピクセル以上700ピクセル以下の幅を持つPCモニター出力の場合この設定
@media screen and (min-width: 400px) and (max-width: 700px) {
    background-color: #ff8888;
}

条件は複数マッチさせることも出来るけど、多少の重複は許してきっちり分けちゃった方が管理し易そう。
@media screen and (min-width: 400px) { 
    background-color: #ff8888;
}
@media screen and (min-width: 700px) {
    font-size: 1.2em;
}

InternetExplorer


respond.jsというスクリプトを使うとIE8以下のCSS3に対応していないブラウザでもメディアクエリーが使えるようになります。headタグの一番最後にscriptタグで読み込み指定しましょう。

メリットとデメリット


理想論だけど、仕様をある程度理解した上で感じた印象。
  • メリット
    • 見た目の切り替えを全てCSSの中で行うので、サーバーサイドの処理の切り替えが必要ない。つまりサーバーサイドスクリプトのメンテナンスコストが下がる
    • デバイスの解像度を見て自動的に切り替わるので、未知のデバイスにも対応できる。
  • デメリット
    • PC向けもガラケー向けも同じだけの通信量が発生する。むしろ両方のデータが渡される訳だから増える傾向にある。
    • CSS自体のメンテナンスコストは上がると思う。
今後はスマートフォンでも高解像度化は進むし、通信回線はwi-fiになるから通信料なんて気にしなくていいでしょ!みたいな軽いノリを感じる。

サンプル


一つのhtmlで、PC、タブレットPC、スマートフォンの対応を行うサンプルをgistに上げた。test.htmlをブラウザで開き、ウインドウサイズをじょじょに小さくしていくとレイアウトが変わって行く様子を確認できます。見た目悪いけど、分かり易さ重視で。
  • iPad横向き(768px)以上はPCと同じ扱い。タイトルとメニューは位置固定。
  • iPad横向き(768px)未満まではちょっとだけ画面が狭いのでメニューを画面上部に移動。ただし位置は固定。
  • iPhone横向き(480px)までは縦に羅列。フォントはやや小さく。
最後にソースをベタッと。CSSはlessで書いてます。

2012年4月2日月曜日

bootstrapをmake(lesscとuglifyjsをインストール)

githubのtwitter-bootstrapをビルドしたのでメモ。

Makefileがあるのでmakeコマンドでlessからcss(bootstrap.min.css)と、各モジュール毎にバラバラに用意されているファイルをまとめ、さらに圧縮されたjavascriptファイル(bootstrap.min.js)を作成することが出来る。簡単だけど、環境を用意する必要がある。

  • lessc
    lessコンパイラ。lessファイルからcssファイルを生成する。
  • uglify-js
    javascript圧縮ツール。

lesscもuglify-jsもnode.jsベースのコマンドラインツールなので、node.jsのインストールから行う必要がある。

Windowsではとてもめんどくさかったけど、Macではhomebrew使って簡単だった。Macでよかった。

環境整備

  1. node.jsをインストール。brewコマンド(homebrew)は予め用意しておく必要があります。
    [150]% brew install node
    ==> Downloading http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz
    ######################################################################## 100.0%
    ==> ./configure --prefix=/usr/local/Cellar/node/0.6.14 --without-npm
    ==> make install
    ==> Caveats
    Homebrew has NOT installed npm. We recommend the following method of
    installation:
    curl http://npmjs.org/install.sh | sh
    After installing, add the following path to your NODE_PATH environment
    variable to have npm libraries picked up:
    /usr/local/lib/node_modules
    ==> Summary
    /usr/local/Cellar/node/0.6.14: 80 files, 7.6M, built in 7.0 minutes
    [151]% 
    
    
    
  2. npmをインストール
    [153]% curl http://npmjs.org/install.sh | sh
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 7881 100 7881 0 0 9741 0 --:--:-- --:--:-- --:--:-- 22013
    tar=/usr/bin/tar
    version:
    bsdtar 2.8.3 - libarchive 2.8.3
    install npm@1.1
    fetching: http://registry.npmjs.org/npm/-/npm-1.1.15.tgz
    0.6.14
    1.1.15
    cleanup prefix=/usr/local
    All clean!
    /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
    npm@1.1.15 /usr/local/lib/node_modules/npm
    It worked
    [154]% 
    
    
    
  3. npmでlesscとuglify-jsをインストール。-gオプションをつけると/usr/local/binにインストールしてくれる。
    [156]% [156]% npm install less uglify-js -g
    npm http GET https://registry.npmjs.org/less
    npm http 200 https://registry.npmjs.org/less
    npm http GET https://registry.npmjs.org/less/-/less-1.3.0.tgz
    npm http 200 https://registry.npmjs.org/less/-/less-1.3.0.tgz
    /usr/local/bin/lessc -> /usr/local/lib/node_modules/less/bin/lessc
    less@1.3.0 /usr/local/lib/node_modules/less
    
    npm http GET https://registry.npmjs.org/uglify-js
    npm http 200 https://registry.npmjs.org/uglify-js
    npm http GET https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.6.tgz
    npm http 200 https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.6.tgz
    /usr/local/bin/uglifyjs -> /usr/local/lib/node_modules/uglify-js/bin/uglifyjs
    uglify-js@1.2.6 /usr/local/lib/node_modules/uglify-js
    
    [157]% 
    
    
    これで準備OK。

bootstrapをビルド

  1. とりあえずgithubから取得
    [126]% git clone https://github.com/twitter/bootstrap.git
    Cloning into 'bootstrap'...
    remote: Counting objects: 16437, done.
    remote: Compressing objects: 100% (5901/5901), done.
    remote: Total 16437 (delta 11451), reused 15137 (delta 10358)
    Receiving objects: 100% (16437/16437), 10.75 MiB | 248 KiB/s, done.
    Resolving deltas: 100% (11451/11451), done.
    
    
    
  2. Makefileがおかしい気がする。make docsしてからmake bootstrapしないとうまくいかないかも。
    [268]% cd bootstrap
    [269]% make bootstrap
    mkdir -p bootstrap/img
    mkdir -p bootstrap/css
    mkdir -p bootstrap/js
    cp img/* bootstrap/img/
    lessc ./less/bootstrap.less > bootstrap/css/bootstrap.css
    lessc --compress ./less/bootstrap.less > bootstrap/css/bootstrap.min.css
    lessc ./less/responsive.less > bootstrap/css/bootstrap-responsive.css
    lessc --compress ./less/responsive.less > bootstrap/css/bootstrap-responsive.min.css
    cat js/bootstrap-transition.js js/bootstrap-alert.js js/bootstrap-button.js js/bootstrap-carousel.js js/bootstrap-collapse.js js/bootstrap-dropdown.js js/bootstrap-modal.js js/bootstrap-tooltip.js js/bootstrap-popover.js js/bootstrap-scrollspy.js js/bootstrap-tab.js js/bootstrap-typeahead.js > bootstrap/js/bootstrap.js
    uglifyjs -nc bootstrap/js/bootstrap.js > bootstrap/js/bootstrap.min.tmp.js
    echo "/**\n* Bootstrap.js by @fat & @mdo\n* Copyright 2012 Twitter, Inc.\n* http://www.apache.org/licenses/LICENSE-2.0.txt\n*/" > bootstrap/js/copyright.js
    cat bootstrap/js/copyright.js bootstrap/js/bootstrap.min.tmp.js > bootstrap/js/bootstrap.min.js
    rm bootstrap/js/copyright.js bootstrap/js/bootstrap.min.tmp.js
     
    [270]% ls bootstrap/*
    bootstrap/css:
    bootstrap-responsive.css bootstrap.css
    bootstrap-responsive.min.css bootstrap.min.css
    
    bootstrap/img:
    glyphicons-halflings-white.png glyphicons-halflings.png
    
    bootstrap/js:
    bootstrap.js bootstrap.min.js
    [271]%
    
    
    bootstrapディレクトリの下にcssとjavascriptが生成されている。bootstrap-responsive.min.cssはレンスポンシブデザインのcss。