AngularJS1でngRouteを使ったページ遷移時に、それまでの画面が奥に引っ込むアニメーションや、逆に出てくるアニメーションを入れて、見た目をリッチにしてみた。
AngularJSを使ったHTMLページ作成
JSでAngularJSのモジュールapp
とコントローラAppController
を定義する:
// script.js |
- 今のところ定義しただけで、特に何もしない
HTMLで、それらを使ったHTMLを定義する:
<!--index.html--> |
スタイルは適当に:
/* style.css */ |
- 画面いっぱいに表示されるように、
html
とbody
にheight: 100%
を指定
ngRouteによるページ遷移
ngRouteというモジュールを使うと、同一ページ内で擬似的なページ遷移を行えるようになる。
JSでルーティングの設定をする:
// script.js |
- 依存するモジュールに
ngRoute
を指定する $routeProvider
にルーティングを定義するtemplateUrl
にパスを指定するが、後述のng-template
で定義した名前を指定するとその中身が参照されることになる
<!-- index.html --> |
ng-view
で指定した要素のところに、ルーティングで設定された内容が埋め込まれるtype="text/ng-template"
を指定したスクリプトタグで、ルーティングで表示される内容を定義できる- リンクのURLは
<a href="#/〜">
でハッシュとして指すことができる
/* style.css */ |
ng-view
で指定した要素をposition: absolute
にする(後でアニメーションさせるときに必要)
アニメーションの導入
<!-- index.html --> |
root
じゃなくてそれより上の要素(ここではbody
)にクラスアトリビュートをセットして、アニメーションを選択する
// script.js |
- 依存するモジュールに
ngAnimate
を追加
/* style.css */ |
body
のbackground-color: black
で、背景を黒くする#root
にtransition: 500ms
で、アニメーションの時間を指定する- ここでは
scaledown-frombottom
というクラス名のアニメーションを定義しているscaledown-frombottom
の直後のスペースは必要で、これで階層のついた要素のスタイルを指定できる?
- 奥に引っ込む時に、
z-index
を負の値にしてやり、奥に描画されるようにするtransform: translate3d()
を使ったら描画の優先順序をいい具合にしてくれないかと思ったが、そうはいかず…
アニメーションの種類を設定
ページを戻る時には別のアニメーションをすることで、「行った」「戻った」というページ間の関係を分かりやすくする。
// script.js |
pageTransitAnim
というディレクティブを定義して、アニメーションを指定できるようにする- リンクがクリックされた時に、そのアトリビュートの値を
$rootScope.pageTransitionAnimType
に代入してやる
- リンクがクリックされた時に、そのアトリビュートの値を
<!-- index.html --> |
body
のng-class="pageTransitionAnimType"
で、AngularJSの$rootScope.pageTransitionAnimType
がクラス名として設定され、JS内で値を変更することで再生するアニメーションが切り替わる- 定義されたディレクティブ
page-transit-anim
をa
タグのアトリビュートとして、そのリンクがクリックされた時にアニメーションを指定する
/* style.css */ |
- 追加のアニメーション
movetobottom-scaleup
を定義する