DeNA Creative Seminar vol.1




        CSS3 / JavaScript で作る
       スマートフォンUIと落とし穴

                              株式会社まぼろし
                              フロントエンドエンジニア
                              西畑 一馬
西畑 一馬
 ・雑誌や書籍の執筆
 ・Webクリエイター向けの講座やトレーニング
http://blog.webcreativepark.net/
HTML / CSS
マークアップ


HTML5 / CSS3
スマートフォンサイト作成


JavaScript / Ajax
システム開発


Movable Type / WordPress
サイト構築
UI ?
Appli or Web ?
1. スワイプギャラリー
2. 固定配置
3. オーバーレイ
1. スワイプギャラリー
MouseDown   ≒   TouchStart
MouseMove   ≒   TouchMove
MouseUp     ≒   TouchEnd
-webkit-transform:
        translate3d(100px,0,0);
         GPUで高速に動作
これで完璧?
Andoridの落とし穴


3D系のtransformにバグ多い
Andoridの落とし穴


GPUに切り替わらない
   端末も多い
Andoridの落とし穴


     一部の端末では
touchmoveイベントをロスト
$("ul").on("touchstart",function(e){
! if(/Android/.test(navigator.userAgent)){
! ! e.preventDefault();
!}
}):

  touchStart 時に縦スクロールを止める
Androidでは
次の3種類の実装が主流
e.preventdefault()型
touchmove無視型
フリック型



レコチョク
Androidは非対応




         ビックカメラ
メリット・デメリットを
    理解して
最適な実装をチョイス
   しましょう
2. 固定配置
2. 固定配置
CSS ?
//set Full Screen without StatusBar

var ua = navigator.userAgent.toLowerCase();
$.browser.android = /android/.test(ua);
$.browser.iphone = /iphone/.test(ua);
var portraitHeight,landscapeHeight;

window.onload = function(){
! $("html,body").height("1000px");
! if($.browser.iphone){
! ! $("body").css("position","relative");
! }
! setTimeout(function(){
! ! scrollTo(1,0);
! ! setTimeout(function(){
! ! ! var height = window.innerHeight;
! ! ! $("html,body").height(height+"px");
! ! ! if(Math.abs(window.orientation)==0){
! ! ! ! portraitHeight = height;
! ! ! }else{
! ! ! ! landscapeHeight = height;
! ! ! }
! ! ! setTimeout(loaded, 200);
! ! },100);
! }, 200);
};
$(window).bind("orientationchange",function(){
! if(Math.abs(window.orientation)==0){
! ! if(!portraitHeight)portraitHeight = window.innerHeight;
! ! height = portraitHeight;
! }else{
! ! if(!landscapeHeight)landscapeHeight = window.innerHeight;
! ! height = landscapeHeight;
! }
! $("html,body").height(height+"px");
! setTimeout(function(){
! ! scrollTo(1,0);
! }, 200);
});
3.オーバーレイ
Andoridの落とし穴


   レイヤー下の
要素にフォーカスが当たる
$("a").not(".modalInner a")
! .css("-webkit-tap-highlight-color",
! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! "rgba(0,0,0,0)");
Andoridの落とし穴

レイヤー下のテキスト位置で
   ハイライトカラーや
UI要素などの動作がおかしい
まとめ


 スマートフォンのUI実装では
Androidのバグ対応がほとんど
株式会社まぼろしでは
   Androidと戦う
フロントエンドエンジニア
    を募集中です
Thank you!!

CSS3 / JavaScriptで作るスマートフォンUIと落とし穴