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を定義する
