iPhone/Android等モバイル版webkitで縦持ち(portrait)横持ち(landscape)のcssを切り替えたい
iPhone/AndroidではJavaScriptのwindow.orientation;を取得できる。
jQueryスタイルでの記述方法を用いると、下記のような大変シンプルなコードでデバイスの縦持ち(portrait)と横持ち(landscape)でcssの切り替えが実装可能である。
function switchOrientation(){ var orientation = window.orientation; if(orientation == 0){ $("body").addClass("portrait"); $("body").removeClass("landscape"); }else{ $("body").addClass("landscape"); $("body").removeClass("portrait"); } } $(document).ready(function(){ switchOrientation(); var agent = navigator.userAgent; if(agent.search(/iPhone/) != -1){ window.onorientationchange = switchOrientation; }else{ window.onresize = switchOrientation; } });
上記の記述でbodyタグに縦持ちの時はclass=”portrait”が、横持ちの時class=”landscape”が付加される。
あとはcssでportrait時/landscape時それぞれの値を指定すればよい。
.portrait div#contents { //ここに縦持ち(portrait)のときのスタイルを記入 例)width:452px; } .landscape div#contents { //ここに横持ち(landscape)のときのスタイルを記入 例)width:687px; }
jQueryのキャッチコピー”The Write Less, Do More(より少ない記述で、より多くのことを)”を体現するような、シンプルなコードとなった。
(追記2011.5.9)
■Android2.3での不具合について
Android 2.3とiPhoneのブラウザでは、window.onresizeがコールされ、
window.onorientationchangeはコールされない。
2.2以下では、window.onorientationchangeがコールされる。
そのため、Android2.3に対応するためには上記の条件分岐を書き換える必要がある。
ということは、つまり、こんなコードでいいのではないか?!
$(function(){ $(window).resize(function(){ var orientation = window.orientation; if(orientation == 0){ $("body").addClass("portrait"); $("body").removeClass("landscape"); }else{ $("body").addClass("landscape"); $("body").removeClass("portrait"); } }); });
全機種検証などはしていないけど、いかがでしょう。