HTML5のUIフレームワークであるOnsen UIはMonacaとの相性を考えて開発されていますが、必ずしもハイブリッドアプリ専用という訳ではありません。Webサイト開発にも利用が可能です。
GoogleがWebサイトのモバイル対応が行われているかどうかを検索順位に反映することを発表していたり、HTML5によってWebもどんどん多機能になっている中、Onsen UIを使うことで高速な描画で使いやすいWebサイトが構築できるはずです。
そこで今回はOnsen UIをWebサイト開発に利用する方法について紹介したいと思います。
準備
Onsen UI自体はJavaScript/スタイルシートで出来ていますのでダウンロードして配置するだけですが、今回はbowerを使って行いたいと思います。Onsen UIはbowerからコマンド一つでインストール可能です。bowerはnode.jsのパッケージ管理、npmを使ってインストールします。
- node.jsのインストール(npmもインストールされます)
- Gitのインストール
- bowerのインストール
node.jsはNode.js Downloadからダウンロード/インストールができます。GitはMac OSXであればHomebrewやMacPortsから、WindowsであればGit for Windowsをダウンロード/インストールしてください。終わったら続いてbowerをインストールします。
- $
npm install -g bower
これでインストールは完了です。
作業用ディレクトリの作成
続いてWebサイトを作るディレクトリ(フォルダ)を作成します。今回は onsenui_for_website としています。そのディレクトリの中でbowerコマンドを実行します。
- $
bower install onsenui - bower
cached git://github.com/OnsenUI/OnsenUI.git#1.2.2 - bower
validate 1.2.2 against git://github.com/OnsenUI/OnsenUI.git#* - bower
cached git://github.com/angular/bower-angular.git#1.3.15 - bower
validate 1.3.15 against git://github.com/angular/bower-angular.git#~1.3.0 - bower
install onsenui#1.2.2 - bower
install angular#1.3.15 - onsenui#1.2.2
bower_components/onsenui - └──
angular#1.3.15 - angular#1.3.15
bower_components/angular
Onsen UIがダウンロードされて、 bower_components 以下に展開されます。
Onsen UIを使う上で関連付いているAngularJSも一緒に展開されます。これでほぼ準備は完了です。
Gulpの準備
そのまま使っても良いのですが、 bower_components というフォルダに入ってしまっていたり、実際の運用時には不要なファイルも多いので Gulp を使ってまとめることにします。既にnpmは入っていますので、インストールは簡単です。まず最初にnpmで必要なパッケージを管理するようにします。
- $
npm init - This
utility will walk you through creating a package.json file. - It
only covers the most common items, and tries to guess sane defaults. - See
`npm help json` for definitive documentation on these fields - and
exactly what they do. - Use
`npm install <pkg> --save` afterwards to install a package and - save
it as a dependency in the package.json file. - Press
^C at any time to quit. - name:
(onsenui_for_website) - version:
(1.0.0) 0.0.1 - description:
Web site that use the Onsen UI - entry
point: (index.js) - test
command: - git
repository: - keywords:
- author:
Atsushi Nakatsugawa - license:
(ISC) MIT - About
to write to /Users/nakatsugawa/Dropbox/DevRel/Monaca/onsenui_for_website/package.json: - {
"name": "onsenui_for_website", "version": "0.0.1", "description": "Web site that use the Onsen UI", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Atsushi Nakatsugawa", "license": "MIT" - }
- Is
this ok? (yes) yes
そうすると package.json というファイルが作成されて、ライブラリを管理できるようになります。後はGulpと必要なライブラリをインストールしていきます。
- $
npm install --save-dev -g gulp - $
npm install --save-dev gulp-changed # ここから下はGulpのプラグインです。 - $
npm install --save-dev gulp-concat - $
npm install --save-dev gulp-coffee - $
npm install --save-dev gulp-uglify - $
npm install --save-dev gulp-sourcemaps - $
npm install --save-dev gulp-webserver - $
npm install --save-dev del
後はGulp用の設定ファイル、gulpfile.js を作成します。
- //
gulpfile.js - var
gulp = require('gulp'); - var
coffee = require('gulp-coffee'); - var
concat = require('gulp-concat'); - var
uglify = require('gulp-uglify'); - var
webserver = require('gulp-webserver'); - var
sourcemaps = require('gulp-sourcemaps'); - var
del = require('del'); - var
paths = { scripts: ['app/js/**/*.coffee', '!app/external/**/*.coffee'] - };
- //
Webサーバの機能です - gulp.task('webserver',
function() { gulp.src("./") .pipe(webserver({ livereload: true, })); - });
- //
スクリプトの結合と配置を行っています - gulp.task('scripts',
function() { return gulp.src([ './bower_components/onsenui/build/js/angular/angular.min.js', './bower_components/onsenui/build/js/onsenui_all.min.js' ]) .pipe(concat('all.js')) .pipe(gulp.dest('./javascripts/')); - });
- //
ファイルの変更を監視しています(今回は使っていません) - gulp.task('watch',
function() { gulp.watch(paths.scripts, ['scripts']); - });
- gulp.task('default',
['webserver', 'scripts', 'watch']);
これで $ gulp scripts
と実行すると、AngularJSとOnsen UIのJavaScriptファイルがくっついた状態で javascripts/all.js として生成されます。なおスタイルシートについても同様の操作が可能ですが、今回は bower_components/onsenui/build/css/ を プロジェクトルート直下に stylesheets という名称でコピーしています。
その結果、次のようなファイル構成になっていればOKです。
index.htmlの編集
では実際に表示を行うindex.htmlを作成しましょう。まず最初に次のようにHTMLファイルを作成します。
- <!DOCTYPE
html> - <html
class=""> <head> <meta charset="UTF-8"> <meta name="robots" content="noindex"> <link rel="stylesheet prefetch" href="stylesheets/onsenui.css"> <link rel="stylesheet prefetch" href="stylesheets/onsen-css-components.css"> </head> <body> <script src="javascripts/all.js"></script> <script> ons.bootstrap(); //@ sourceURL=pen.js </script> </body> - </html>
この形が Onsen UIの基本形になります。後はこの <body>〜</body>の間にコンテンツを書くだけです。JavaScript | Onsen UIには多くのコンポーネントを用意しています。例えばチェックボックスを表示します。内容はPattern: Checkbox List | Onsen UIにもありますが、bodyタグの中に次のように記述します。
- <ons-page>
<ons-toolbar> <div class="center">Checkboxes</div> </ons-toolbar> <ons-list> <ons-list-header>Favorite Sports</ons-list-header> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--list-item"> <input type="checkbox"> <div class="checkbox__checkmark checkbox--list-item__checkmark"></div> Baseball </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--list-item"> <input type="checkbox"> <div class="checkbox__checkmark checkbox--list-item__checkmark"></div> Soccer </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--list-item"> <input type="checkbox" checked="checked"> <div class="checkbox__checkmark checkbox--list-item__checkmark"></div> Basketball </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--list-item"> <input type="checkbox" checked="checked"> <div class="checkbox__checkmark checkbox--list-item__checkmark"></div> Golf </label> </ons-list-item> <ons-list-header>Favorite Food</ons-list-header> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--noborder checkbox--list-item"> <input type="checkbox" checked="checked"> <div class="checkbox__checkmark checkbox--noborder__checkmark checkbox--list-item__checkmark"></div> Hamburger </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--noborder checkbox--list-item"> <input type="checkbox"> <div class="checkbox__checkmark checkbox--noborder__checkmark checkbox--list-item__checkmark"></div> Beefsteak </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--noborder checkbox--list-item"> <input type="checkbox" checked="checked"> <div class="checkbox__checkmark checkbox--noborder__checkmark checkbox--list-item__checkmark"></div> Spaghetti </label> </ons-list-item> <ons-list-item modifier="tappable"> <label class="checkbox checkbox--noborder checkbox--list-item"> <input type="checkbox"> <div class="checkbox__checkmark checkbox--noborder__checkmark checkbox--list-item__checkmark"></div> Natto </label> </ons-list-item> </ons-list> - </ons-page>
この内容を書いたら、 gulp コマンドを実行します。そうすると8000番ポートでWebサーバが立ち上がるので、 http://localhost:8000/ にアクセスします。
プロフィール風画面を作る
同じようにbodyタグの内容を次のように変更します。
- <ons-page>
<ons-toolbar> <div class="left"><ons-back-button>Back</ons-back-button></div> <div class="center">Profile</div> <div class="right"> <ons-toolbar-button><ons-icon icon="ion-gear-a" style="vertical-align: -4px; font-size: 28px;"></ons-icon></ons-toolbar-button> </div> </ons-toolbar> <div class="profile-card"> <img src="images/profile-image-01.png" class="profile-image"> <div class="profile-name">Dave Graham</div> <div class="profile-id">@davegraham</div> <div class="profile-desc">Freelance designer, software engineer and cyclist</div> </div> <ons-list> <ons-list-item> <ons-row> <ons-col class="info-col"> <div class="info-num">87</div> <div class="info-unit">Comments</div> </ons-col> <ons-col class="info-col"> <div class="info-num">40</div> <div class="info-unit">Following</div> </ons-col> <ons-col class="info-col"> <div class="info-num">38</div> <div class="info-unit">Followers</div> </ons-col> </ons-row> </ons-list-item> </ons-list> <ons-list modifier="inset" style="margin-top: 10px"> <ons-list-item modifier="chevron"> Write a comment </ons-list-item> <ons-list-item modifier="chevron"> See details </ons-list-item> <ons-list-item modifier="chevron"> Save to the list </ons-list-item> </ons-list> <br> - </ons-page>
この場合は、別途スタイルシートが必要です。stylesheets/profile.cssなどとして次の内容でファイルを作成してください。また、HTML側でlinkタグを使って読み込み指定してください。
- .profile-card
{ width: 100%; text-align: center; color: white; padding: 30px 0; line-height: 1.4; background-color: #33393c; text-shadow: rgba(0, 0, 0, 0.4) 0px 1px 0px; - }
- .profile-image
{ height: 100px; width: 100px; border-radius: 50%; -webkit-border-radius: 50%; background-color: black; border 1px solid white; box-shadow:rgba(0, 0, 0, 0.2) 0px 2px 0px 0px; -webkit-box-shadow:rgba(0, 0, 0, 0.2) 0px 2px 0px 0px; - }
- .profile-name
{ margin: 20px 0 0 0; font-weight: 600; font-size: 17px; - }
- .profile-id
{ margin: 0 0 5px 0; font-size: 14px; opacity: 0.6; - }
- .profile-desc
{ font-size: 15px; opacity: 0.6; width: 90%; text-align: center; margin: 0 auto; - }
- .info-col
{ height: 60px; line-height: 1; padding: 12px 0 12px 4px; - }
- .info-num
{ font-size: 16px; font-weight: 500; opacity: 0.8; - }
- .info-unit
{ margin-top: 6px; font-size: 14px; opacity: 0.4; - }
後、こちらの画像をダウンロードして、 images/profile-image–01.png として保存してください。作業が完了すると、次のように表示されるはずです。
他にもサムネイル付きリストページのテンプレートパターンもあります。こういったデザインはブログやメディアサイトの記事一覧でも利用できるのではないでしょうか。
Onsen UIのアイコンはFont AwesomeやIoniconsを使えるようになっていますので、フラットUIなWebサイトを構築する際にも便利に使えます。よりスタイリッシュで高パフォーマンスなモバイルWebサイトを実現するためにOnsen UIをぜひご利用ください!
Onsen UI - A Custom Elements-Based HTML5 UI Framework | Onsen UI