ブラウザゲームCSS3アニメーション作成者:馬場 宣孝所属チーム /上位部署: :Mobile UIチーム / UIT室作成年月日: 2011 / 02 / 25
自己紹介UIT室 Mobile UIチーム馬場 宣孝baba noritakaTw: pesblogフロントエンドエンジニア 29才前職 3DCGテクニカルデザイナー写真好き(Flickrも好き!)
アジェンダ初めにサービスの説明 はじめに本題問題点1 CSS3アニメーション問題点2 グラデーションとrgba問題点3 角丸とディスプレイ本資料に掲載されている内容は無断転載禁止です。本資料に関して質問・要望などがございましたら、NHN Japan株式会社 UIT室 馬場 宣孝baba.noritaka@nhn.comまでお問い合わせください。  
ゲーム紹介 ブラウザゲームの一覧
ゲーム紹介 対戦リバーシ
はじめにiOS iPhone3GS (3.1.3) iPhone4 (4.1)Android HT-03A (1.6) xperia (1.6) Desire (2.1)
はじめに今回は作りながら起こった問題点と対処を紹介します
はじめにまずは、CSS3の表現力をデザイナーさんに伝えるところから始まります
はじめにデザイナーさんと協力しないことには始まりません!
はじめにCSS3は万能ではない
はじめに出来ることはもちろん、出来ないことへの対処方法や、処理の重さ等々、話し合おう!
はじめにCSS3を多用したのはなぜか理由1 ダウンロードサイズをとにかく軽く理由2 高解像度の端末でキレイに表示理由3 パーツ用の、画像切り出しコストを削減理由4 CSS3にとても期待
はじめにCSS3の中で主に使ったもの-webkit-user-select: none;-webkit-border-radius-webkit-box-sizing:border-box;-webkit-box-shadow-webkit-gradient-webkit-transform-webkit-text-shadow-webkit-text-overflow:ellipsis;overflow: -webkit-marquee;rgba(color)
数々の問題点色々問題が出てきた…問題点1 CSSアニメーションの壁x2問題点2 グラデーションとrgbaの壁問題点3 角丸とディスプレイの壁
CSS3アニメーションの壁x2 その1どんなアニメーションかDEMO
CSS3アニメーションの壁x2 その1どんなアニメーションか
CSS3アニメーションの壁x2 その1実際のソースコード(一部抜粋)
CSS3アニメーションの壁x2 その1の、その前に、CSSアニメーションの 基礎編
CSS3アニメーションの壁x2 その1アニメーションで使用するプロパティの簡単な説明※実際にはプリフィックスを付けます@keyframes’アニメーション名’{ 0%{スタート時のプロパティ} 50%{半分の時のプロパティ} 100%{エンド時のプロパティ}}animation-duration(アニメーションの長さ)の値を元にしたパーセンテージ0%50%100%
CSS3アニメーションの壁x2 その1アニメーションで使用するプロパティの簡単な説明※実際にはプリフィックスを付けます  div{animation-name:名前; animation-duration: 一回分の長さ; animation-timing-function: タイミングや進行具合; animation-iteration-count: 何回再生か; animation-direction: リピートするか; animation-play-state: 実行状態; animation-delay: 待ち時間;}
CSS3アニメーションの壁x2 その1アニメーションで使用するプロパティの簡単な説明※実際にはプリフィックスを付けます  div{animation-name:名前; animation-duration: 一回分の長さ; animation-timing-function: タイミングや進行具合; animation-iteration-count: 何回再生か; animation-direction: リピートするか; animation-play-state: 実行状態; animation-delay: 待ち時間;}  ↑まずはこの値でタイミングを調整してみた
CSS3アニメーションの壁x2 その1実際のソースコード(一部抜粋)
@keyframes’koma-black-to-white’{ 0%{opacity:0;} 0.1%{opacity:1;} 99.9%{opacity:1;} 100%{opacity:0;}}← opacity:1; 見える← opacity:0; 見えない※実際にはプリフィックスを付けます
.koma1{ ...animation-delay: 0; ← すぐに再生を始める}.koma2{ ...animation-delay: 0.2; ← 0.2秒後に再生を始める}.koma3{ ...animation-delay: 0.4; ← 0.4秒後に再生を始める}※実際にはプリフィックスを付けます
CSS3アニメーションの壁x2 その1概念図: animation-delay Version  見える見えない↑0.2秒↑スタート地点↑0.4秒↑0.6秒時間軸
CSS3アニメーションの壁x2 その1試したところ、失敗!チカチカしてしまった…DEMOiPhoneOS 3.1.3 のみ
CSS3アニメーションの壁x2 その1animation-delayはまだ信用できない!iPhoneOS 3.1.3 のみ
CSS3アニメーションの壁x2 その2試行錯誤 + 他サイト研究!
CSS3アニメーションの壁x2 その2浮上したのは
CSS3アニメーションの壁x2 その2キーフレームアニメーション!
.koma1{ ...animation-name: koma-black-to-white1; animation-delay: 0; ←}.koma2{ ...animation-name: koma-black-to-white2;animation-delay: 0; ←}.koma3{ ...animation-name: koma-black-to-white3;animation-delay: 0; ←}※実際にはプリフィックスを付けます※全体を10秒に設定しています  
@keyframes’koma-black-to-white3’{ 0%{opacity:0;} 3.99%{opacity:0;} 4%{opacity:1;} 6%{opacity:1;} 6.01%{opacity:0;} 100%{opacity:0;}}@keyframes’koma-black-to-white1’{ 0%{opacity:0;} 0.01%{opacity:1;} 2%{opacity:1;} 2.01%{opacity:0;} 100%{opacity:0;}}@keyframes’koma-black-to-white2’{ 0%{opacity:0;} 1.99%{opacity:0;} 2%{opacity:1;} 4%{opacity:1;} 4.01%{opacity:0;} 100%{opacity:0;}}※実際にはプリフィックスを付けます※全体を10秒に設定しています  
CSS3アニメーションの壁x2 その2概念図: keyframe Version  見える見えない↑0.2秒↑スタート地点↑0.4秒↑0.6秒時間軸
CSS3アニメーションの壁x2 その2やっと正常に再生された!DEMO全機種OK!
CSS3アニメーションの壁x2 その2と、思ったら…
CSS3アニメーションの壁x2 その2「このアニメーション  重いです」(ふ、普通に再生されてる けど?)
CSS3アニメーションの壁x2 その2「コマが大量に増えると  遅くなるんですよ…」
CSS3アニメーションの壁x2 その2どれどれ?DEMO全機種NG
CSS3アニメーションの壁x2 その2「わ、分かりました。なんとか軽くしてみます」
CSS3アニメーションの壁x2 その2コマの描画を簡素にしたdiv x 3個div x 1個
CSS3アニメーションの壁x2 その2まだ重い…
CSS3アニメーションの壁x2 その2もう、いっそのこと画像にしたdiv x 3個div x 1個img
CSS3アニメーションの壁x2 その2まだ重い…
CSS3アニメーションの壁x2 その2え、どうすりゃいいの?
CSS3アニメーションの壁x2 その2もしかしてCSS3アニメーションって重い…?
CSS3アニメーションの壁x2 その2どうも原因は opacityのよう
CSS3アニメーションの壁x2 その2でも、当時は時間も無くJavascriptで表示切替しました。(アレ…
var stoneImages = [],animationTime = 360,stoneColor = 1;stoneImages[1] = [$('<img src="boardarea_black.png">'),$('<img src="boardarea_blacktowhite01.png">'),$('<img src="boardarea_blacktowhite02.png">'),$('<img src="boardarea_blacktowhite03.png">')];stoneImages[2] = [$('<img src="boardarea_white.png">'),$('<img src="boardarea_whitetoblack01.png">'),$('<img src="boardarea_whitetoblack02.png">'),$('<img src="boardarea_whitetoblack03.png">')];
function animationOneFrame(allCell, frameCount, stoneColor, newStoneColor) {  setTimeout(function() {    if(frameCount === 3) {      allCell.html(stoneImages[stoneColor === 1 ? 2 : 1][0].clone());      return;    }    allCell.html(stoneImages[stoneColor][frameCount + 1].clone());animationOneFrame(allCell, frameCount + 1, stoneColor, newStoneColor);  }, animationTime / 3);}
CSS3アニメーションの壁x2 その2やっと正常に再生された!パート2DEMO全機種OK!
CSS3アニメーションの壁x2 まとめCSS3アニメーションまとめまとめ1 animation-delay で タイミングをとらず      keyframeを使用することまとめ2 DOMが多いと重いまとめ3 opacity の多用も重いまとめ4 javascriptの使用も考慮に入れること
数々の問題点問題点1 CSS3アニメーションの壁x2問題点3 角丸とディスプレイの壁問題点2 グラデーションとrgbaの壁
グラデーションとrgbaの壁↑to↑from↑color-stop↑↑color-stop↑color-stopbackground: -webkit-gradient(linear,       left top,right top,       from(#f00),       color-stop(0.4,#0036ff),       color-stop(0.6,#0cff00),       color-stop(0.75,#ffea00),       to(#f00));background: -webkit-gradient(radial,       center center, 0,       center center, 70,       from(#1A82F7), to(#2F2727))
グラデーションとrgbaの壁コードだけでグラデーション作れる!
グラデーションとrgbaの壁サイズ違いの背景のために「bg_gra01.gif」「bg_gra02.gif」とかとか、必要なくて楽チンしかも…
グラデーションとrgbaの壁コードのみなので断然軽い!※※少なくともダウンロードサイズは
グラデーションとrgbaの壁さらに…
グラデーションとrgbaの壁colorの新しい指定方法rgbaと組み合わせたらもっと楽しいはず!
グラデーションとrgbaの壁background: -webkit-gradient(linear,       left top,right top,       from(#f00),       color-stop(0.4,rgba(0,0,0,0)),       color-stop(0.6,rgba(0,0,0,0)),       to(#f00));background: -webkit-gradient(radial,       center center, 20,       center center, 70,       from(rgba(0,0,0,0)),       color-stop(0.5,#f00),       to(rgba(0,0,0,0)))
グラデーションとrgbaの壁ところが!
グラデーションとrgbaの壁Android1.6でバグ発見他のOSAndroid1.6
グラデーションとrgbaの壁結局、画像で対処することに…
グラデーションとrgbaの壁 まとめグラデーションとrgbaまとめまとめ1 背景画像の作成・管理から開放されるまとめ2 軽い!まとめ3 rgba() と組み合わせると色々出来るまとめ4 radial + rgba() はまだバグ有り
数々の問題点問題点1 CSS3アニメーションの壁x2問題点2 グラデーションとrgbaの壁問題点3角丸とディスプレイの壁
角丸とディスプレイの壁皆さんご存知の角丸border-radius:5px;via: http://www.w3.org/TR/css3-background/#corners
角丸とディスプレイの壁うちのデザインでも多用しています。  の箇所は全て角丸です。via: http://www.w3.org/TR/css3-background/#corners
角丸とディスプレイの壁ここにも問題が発生
角丸とディスプレイの壁ディスプレイに原因が!
角丸とディスプレイの壁CSSの描画にはアンチエリアシングが無い
角丸とディスプレイの壁left = 偶数 その他すべて偶数left = 奇数 その他すべて偶数Android端末の7割~8割
角丸とディスプレイの壁小さい図形ほど、しかも、border-radius 以外でも目に付く
角丸とディスプレイの壁原因 -> devicePixelRatio実寸だと、こんな見栄えでも、、、iPhone3GS 480x320iPhone4 960x480Android 800x480Android 854x480
角丸とディスプレイの壁1Pixelの大きさを同じにしてみると、こんなに違います。iPhone3GS 480x320iPhone4 960x480Android 800x480Android 854x480
角丸とディスプレイの壁devicePixelRatio = 画像 1pixel を 何pixel で描画するか、という値画像データディスプレイ上1pixel1.5pixel1pixel原因1.5pixel2pixel
角丸とディスプレイの壁devicePixelRatio が 1.5pixel の場合は、全て偶数にする必要がある。原点
角丸とディスプレイの壁 まとめ角丸とディスプレイまとめまとめ1 DevicePixelRatioを知るまとめ2 小さい部位ほど偶数を意識まとめ3 出来るなら    top left height width border-radius      すべてを偶数にする
Thank you.作成者:馬場 宣孝所属チーム /上位部署: :Mobile UIチーム / UIT室連絡先: baba.noritaka@nhn.com作成年月日: 2011 / 02 / 25

NHN HTML5勉強会 CSS3アニメーション