2013年6月7日金曜日

3ds で animation-timing-function:steps() が動かない

3ds のウェブブラウザは CSS の keyframe-animation に対応しています。
animation-timing-function に linear や cubic-bezier() を指定すると動作するのですが、
steps() を指定しても動作しませんでした。

steps(1) を指定すると PC ではフレームの切り替えを 1 ステップでやってくれるため、
パラパラ漫画になるのですが、
3ds では ease を指定した時と同じように切り替えがなめらかになってしまい、
パラパラ漫画になりません。余計な切り替えアニメーションが表示されてしまいます。

そのため、キーフレームアニメーションを使ってパラパラアニメが作れません。
cubic-bezier() を使ってフレームの遷移速度を速くすることはできるものの、
フレームが切り替わる余計な部分も表示されてしまいます。

@-webkit-keyframe 内で background-image を変更してみても
PC だけしか反応してくれませんでした。

3ds で -webkit-animation-timing-function: steps(1) が指定出来れば楽なんですが・・・。
パラパラアニメは JavaScript のタイマーを使って css をいじるしかないのでしょうか。
うーむ・・・。


#animation {
 position: absolute;
 left: 100px;
 top: 100px;
 width: 25px;
 height: 25px;
 
 background-image: url('img/piece.png');
 background-position: 0px;
 -webkit-animation-name: play;
 -webkit-animation-duration: 1s;
 -webkit-animation-timing-function: steps(1);  /* 3dsで無効 */
 -webkit-animation-iteration-count: infinite;
}

@-webkit-keyframes play {
 0% { background-position: 0px; }
 17% { background-position: 25px; }
 34% { background-position: 50px; }
 51% { background-position: 75px; }
 68% { background-position: 100px; }
 85% { background-position: 125px; }
 100% { background-position: 150px; }
}

2013年6月6日木曜日

クリックイベントの取得

AngularJS でクリックイベントを取得する方法です。
ng-click でクリック時に処理を指定出来ます。

2013年6月5日水曜日

ページごとに異なるコントローラを設定する

AngularJS の $routeProvider でページを切り替えた際に、
各ページごとにコントローラを設定出来ます。

when() メソッドの第二引数に渡すオブジェクトの controller にコントローラ名を渡します。

page.js
angular.module('page', []).config(['$routeProvider', function($routeProvider) {
 $routeProvider.when('/page1', {templateUrl: 'page1.html', controller: Page1Controller});
 $routeProvider.when('/page2', {templateUrl: 'page2.html', controller: Page2Controller});
 $routeProvider.otherwise({redirectTo: '/page1'});
}]);

var Page1Controller = function($scope) {
 $scope.message = 'ここはページ1です';
}

var Page2Controller = function($scope) {
 $scope.message = 'ここはページ2です';
}

page1.html
<h1>ページ1</h1>
<p>{{message}}</p>
<a href="#/page2">ページ2へ移動する</a>

page2.html
<h1>ページ2</h1>
<p>{{message}}</p>
<a href="#/page1">ページ1へ移動する</a>

2013年6月4日火曜日

テンプレートによるページ切り替え

AngularJS では Ajax を使ってページの切り替えができます。
URL のフラグメント以下のパターンによって表示する内容を変えることができます。

http://example.com/#/page1  ->  ページ1を表示
http://example.com/#/page2  ->  ページ2を表示
それ以外  ->  ページ1を表示

という感じです。
実際には外部の HTML ファイルを Ajax で取得して、ページ内へ挿入しています。


index.html の作成

まず index.html を作成します。
テンプレートの HTML を表示したいタグに、ng-view を設定します。

index.html
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>ページ切り替えテスト</title>
 </head>
 <body ng-app>
  <div ng-view></div>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
  <script src="page.js"></script>
 </body>
</html>

ngView - AngularJS
http://docs.angularjs.org/api/ng.directive:ngView


テンプレート用 HTML の作成

index.html 内の ng-view 内に挿入される HTML ファイルを作成します。
URL フラグメントを指定してリンクを張ることで別のページヘジャンプすることができます。

page1.html
<h1>ページ1</h1>
<a href="#/page2">ページ2へ移動する</a>

page2.html
<h1>ページ2</h1>
<a href="#/page1">ページ1へ移動する</a>


モジュールを作成

JavaScript でページ切り替えの設定をします。
設定はページの初期化時に行います。
AngularJS では初期設定をするために angular.module を使います。

module - AngularJS
http://docs.angularjs.org/guide/module

まず、任意の名前でモジュールを作成します。
今回は page という名前にします。
第二引数を省略しなかった場合、新たなモジュールが作られます。

page.js
angular.module('page', []);

作成したモジュールを ng-app と関連付けます。
<body> タグの ng-app を ng-app="page" に変えます。
これで page モジュールを使って初期化が行われるようになります。

index.html
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>ページングテスト</title>
 </head>
 <body ng-app="page">
  <div ng-view></div>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>
  <script src="page.js"></script>
 </body>
</html>


$routeProvider の設定

URLフラグメントによるページ切り替えは $routeProvider によって行います。

$routeProvider - AngularJS
http://docs.angularjs.org/api/ng.$routeProvider

モジュール内で $routeProvider の初期設定をすることを通知します。
設定はモジュールの config() メソッドで行います。

page.js
angular.module('page', []).config(['$routeProvider', function($routeProvider) {
    // ここに設定処理を書く
}]);


URL パターンと、表示する HTML ファイルを設定します。

page.js
angular.module('page', []).config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/page1', {templateUrl: 'page1.html'});
    $routeProvider.when('/page2', {templateUrl: 'page2.html'});
    $routeProvider.otherwise({redirectTo: '/page1'});
}]);


これでページの切り替えができるようになります。
指定したパターンが URL フラグメントの後ろに現れた場合、
該当するテンプレート HTML が ng-view の中に表示されます。



ソースコードはこちらからダウンロード出来ます(ファイル->ダウンロード)
https://docs.google.com/file/d/0B0qhX3iM3_v0LWtqM2o4clBmOEE/edit?usp=sharing


2013年6月3日月曜日

セレクトボックスで並び替え

オブジェクトのリストを、要素の値によって並び替える方法です。
セレクトボックスで、どの要素で並び替えるのかをリアルタイムに変えられるようにしてみます。




Controller と Model を作る

並び替える条件として name と sex を準備します
var Controller = function($scope) {
    $scope.persons = [
        {name: 'tanaka', sex: 'man'},
        {name: 'sato', sex: 'woman'},
        {name: 'suzuki', sex: 'woman'},
        {name: 'okano', sex: 'man'},
        {name: 'kumagai', sex: 'man'}
    ];
}


View を作る

何もしないセレクトボックスを作成します
更にデータの一覧表示をします
<div ng-app ng-controller="Controller">
    <select>
        <option value="name">name</option>
        <option value="sex">sex</option>
    </select>
    <ul>
        <li ng-repeat="person in persons">
            {{person.name}} : {{person.sex}}
        </li>
    </ul>
</div>


<select> の値を取得する

ng-model を設定することで、選択した <option> の value を取得出来ます。
ここでは sort という名前のモデルに name または sex が入るようにします。
<div ng-app ng-controller="Controller">
    <select ng-model="sort">
        <option value="name">name</option>
        <option value="sex">sex</option>
    </select>
    <ul>
        <li ng-repeat="person in persons">
            {{person.name}} : {{person.sex}}
        </li>
    </ul>
</div>

<select> についてはこちらを参照

select - AngularJS
http://docs.angularjs.org/api/ng.directive:select


orderBy フィルタで並び替える

最後に <select> で取得した要素でリストを並び替えます。
orderBy フィルタに要素名を渡すと、その要素によって並び替えが行われます。
<div ng-app ng-controller="Controller">
    <select ng-model="sort">
        <option value="name">name</option>
        <option value="sex">sex</option>
    </select>
    <ul>
        <li ng-repeat="person in persons | orderBy:sort">
            {{person.name}} : {{person.sex}}
        </li>
    </ul>
</div>

orderBy - AngularJS
http://docs.angularjs.org/api/ng.filter:orderBy


2013年6月2日日曜日

検索フォームを作る

リスト内の文字列から検索条件に一致する文字列だけを表示する機能です。
Result タブをクリックして検索してみてください。




データの作成

Controller と Model を作成します。
var Controller = function($scope) {
    $scope.names = ['tanaka', 'sato', 'suzuki', 'nakamura', 'okano', 'yamada', 'ida'];
}


ビューの作成

まずはデータを一覧表示するだけのビューを作成します。
検索ボックスも作ります。
<div ng-app>
    <div ng-controller="Controller">
        検索:<input type="text"></input>
        <ul>
            <li ng-repeat="name in names">
                {{name}}
            </li>
        </ul>
    </div>
</div>


検索文字列の取得

検索ボックスに入力された文字列を取得します。
ng-model ディレクティブを使ってフォームに入力されたデータを取得出来ます。
入力された文字列を condition という名前で保存します。

ngModel - AngularJS
http://docs.angularjs.org/api/ng.directive:ngModel

<div ng-app>
    <div ng-controller="Controller">
        検索:<input type="text" ng-model="condition"></input>
        <ul>
            <li ng-repeat="name in names">
                {{name}}
            </li>
        </ul>
    </div>
</div>

フィルターを設定

検索文字列をフィルターとして ng-repeat に設定します。
ng-repeat 部分に | filter:condition を追加すると、文字列に condition が含まれるものだけがループへ入るようになります。

filter - AngularJS
http://docs.angularjs.org/api/ng.filter:filter

<div ng-app>
    <div ng-controller="Controller">
        検索:<input type="text" ng-model="condition"></input>
        <ul>
            <li ng-repeat="name in names | filter:condition">
                {{name}}
            </li>
        </ul>
    </div>
</div>

これで検索条件に引っかかる要素のみが表示されるようになります。

2013年6月1日土曜日

ModelのリストをViewで表示

View から Model のリストを順次読みだしながら表示する方法です。


View を作成

まず HTML で View を作成します。
コントローラを指定しておきます。
<div ng-app>
    <div ng-controller="Controller">
        <p>リストの中身を表示</p>
        <ul>
            <li>ここに配列の中身を表示したい</li>
            <li>ここに配列の中身を表示したい</li>
            <li>ここに配列の中身を表示したい</li>
        </ul>
    </div>
</div>


Controller と Model を作成

View で指定した名前の Controller を作成します。
Model として $scope に配列を追加します。
$scope に names を追加したことで View からも names へアクセスできるようになります。
var Controller = function($scope) {
    $scope.names = [
        'tanaka', 'suzuki', 'sato'
    ];
};


View でリストの表示方法を指定する

HTML の li 要素に ng-repeat を追加して配列内の要素の表示方法を指定します。
以下の例では Model の names から要素を1つずつ取り出して name へセットしています。
names の要素数だけ繰り返し li 要素を作成し、{{name}} が解釈されて文字列へ置き換わります。
<div ng-app>
    <div ng-controller="Controller">
        <p>リストの中身を表示</p>
        <ul>
            <li ng-repeat="name in names">
                {{name}}
            </li>
        </ul>
    </div>
</div>

これで以下の様に出力されます。
・tanaka
・sato
・suzuki


配列内のオブジェクトを読み出す

配列の中身がオブジェクトだった場合は、いつもどおり . をつけて要素を参照できます。
また、ng-repeat で要素を取り出している時に {{$index}} と書くことで現在の要素番号を表示できます。
ng-repeat について詳しい情報はこちらを参照してください。

ngRepeat - AngularJS
http://docs.angularjs.org/api/ng.directive:ngRepeat


以下は $index による番号表示と、配列内のオブジェクトの要素へのアクセス例です。