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");
}
});
});

全機種検証などはしていないけど、いかがでしょう。