アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Onsen UIをWebサイトで使ってみよう

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を使ってインストールします。




  1. node.jsのインストール(npmもインストールされます)
  2. Gitのインストール
  3. 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のファイル一覧



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\"  &amp; &amp; 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です。





Onsen UIのファイル構成



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">
    <a href="https://www.asial.co.jpimages/profile-image-01.png &mode=1" class="popupimg"><img src="https://www.asial.co.jpimages/profile-image-01.png"></a>
    <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を使ったプロフィールページ



他にもサムネイル付きリストページのテンプレートパターンもあります。こういったデザインはブログやメディアサイトの記事一覧でも利用できるのではないでしょうか。





サムネイル付きリストページ






Onsen UIのアイコンはFont AwesomeやIoniconsを使えるようになっていますので、フラットUIなWebサイトを構築する際にも便利に使えます。よりスタイリッシュで高パフォーマンスなモバイルWebサイトを実現するためにOnsen UIをぜひご利用ください!



Onsen UI - A Custom Elements-Based HTML5 UI Framework | Onsen UI