連載:jQuery Mobile入門

第3回 開閉可能パネル/リスト・ビュー/ナビゲーション・バーを使いこなそう

山田 祥寛
2012/03/23
Page1 Page2 Page3

ネイティブ・アプリ・ライクなリストを生成する

 jQuery Mobileでは、<ul>/<li>要素(=箇条書きリスト)、または<ol>/<li>要素(=番号付きリスト)に対して「data-role="listview"」属性を指定することで、ネイティブ・アプリ・ライクなリストを生成できる*3。以下は、そのコード例と実行例である。

*3 「data-role="listview"」属性を指定しなければ、ブラウザ標準スタイルの箇条書き/番号付きリストを表示させることもできる。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>jQuery Mobile入門</title>
<link rel="stylesheet"
  href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js">
</script>
</head>
<body>

<div id="basic" data-role="page" data-title="jQuery Mobile入門">

  <div data-role="header">
    <h1>jQuery Mobile入門</h1>
  </div>

  <div data-role="content">
    <ul data-role="listview">
      <li>ASP.NET MVC3入門</li>
      <li>jQuery Mobile入門</li>
      <li>Entity Framework 4.1入門</li>
      <li>jQuery逆引きリファレンス</li>
      <li>JavaScriptプログラミング再入門</li>
      <li>.NETでAndroid開発</li>
      <li>独習ASP.NET 第3版</li>
    </ul>
  </div>

  <div data-role="footer">
    Copyright 1998-2012, WINGS Project
  </div>

</div>

</body>
</html>
listviewウィジェットを適用した基本的なリストのコード(list.html)
ネイティブ・アプリ・ライクなリスト(上記のコードの実行結果)

 もっとも、これだけではただ外観がリッチになっただけで、あまり面白みもない。以降では、上のサンプルを基に、表現にさまざまなバリエーションを加えてみよう。

リストにリンクを加える

 リスト項目にアンカー・タグを加えることで、リンク・リストを生成することも可能だ。一般的なスマホ・アプリでは、リスト・ビューを単なる表示目的で利用することは少なく、ほとんどはタップ可能なリンク・リストとして利用することになるだろう。以下が、そのコード例と実行例だ。

<ul data-role="listview">
  <li><a href="#">ASP.NET MVC3入門</a></li>
  <li><a href="#">jQuery Mobile入門</a></li>
  <li><a href="#">Entity Framework 4.1入門</a></li>
  ……中略……
</ul>
リスト項目に対してリンクを設置したコード(list_link.html)
タップ可能であることが分かるように[>]アイコンが付与されたリスト(上記のコードの実行結果)

 タップ可能であることが視覚的にも分かるように、右端に[>]アイコンが付与されることが確認できる。アイコンは、data-icon属性によって変更することも可能だ(以下は、そのコード例と実行例)。

<ul data-role="listview">
  <li data-icon="home"><a href="#">ASP.NET MVC3入門</a></li>
  <li data-icon="alert"><a href="#">jQuery Mobile入門</a></li>
  ……中略……
  <li data-icon="false"><a href="#">独習ASP.NET 第3版</a></li>
</ul>
右端のアイコン画像をカスタマイズしたコード(list_icon.html)
data-icon属性によって変更されたアイコン画像(上記のコードの実行結果)

 data-icon属性に指定できる値については、第2回の表「data-icon属性で指定できる値」を参照されたい。リンク・リストであるにもかかわらず、アイコンを非表示にしたい場合には、data-icon属性にfalseを指定すればよい*4

*4 ただし、見た目にもリンクであることが判別しにくくなるため、お勧めはしない。

リスト・ビューに付随情報を加える

 リスト・ビューには、サムネイル画像やアイコン、補足説明、サブ・リンクなど、さまざまな付随情報を追加することもできる。

(1)サブ・リンクを設置する

 本来のリンクとは別に、補助的なリンク(=サブ・リンク)を設置するには、リスト項目(=<li>要素)の配下に2つ目のアンカー・タグを配置すればよい*5

 例えば以下は、メインである記事リンクとは別に、サブ・リンクとして目次へのリンクを設置したコード例と実行結果だ。

*5 ただし、サブ・リンクとして認識されるのは、リスト項目配下の「最後の」アンカー・タグのみである。3個以上のリンクを追加した場合、メイン・リンクとサブ・リンク以外は通常のリンクとして表示される。

<ul data-role="listview">
  <li><a href="#">ASP.NET MVC3入門</a>
    <a href="#">目次</a></li>
  <li><a href="#">jQuery Mobile入門</a>
    <a href="#" data-icon="home">目次</a></li>  ……
  <li><a href="#">Entity Framework 4.1入門</a>
    <a href="#">目次</a></li>
  ……中略……
</ul>
リスト項目にサブ・リンクを追加したコード例(list_sublink.html)
2つ目のアンカー・タグがサブ・リンクとしてアイコン化される(上記のコードの実行結果)

 このように、サブ・リンクはアイコンとして表示されるわけだ。アイコン画像を変更したい場合には、先ほどと同じくdata-icon属性を指定する()。

 サブ・リンクのアイコンをまとめて変更したいならば、<ul>/<ol>要素に対して、data-split-icon属性を指定してもよい。以下は、そのコード例と実行結果である。

<ul data-role="listview" data-split-icon="info">
  ……中略……
</ul>
サブ・リンクのアイコン画像をリスト全体でまとめて設定するコード
サブ・リンクのアイコンが全てinfo(情報)に置き換わった(上記のコードの実行結果)
ただし、個別にdata-icon属性を指定している箇所は、個別の指定が優先される。

(2)リスト項目にサムネイル画像を表示する

 リスト項目に<img>要素を追加することで、リストにサムネイル画像を付与できる(以下のコード例と実行結果を参照)。

<ul data-role="listview">
  <li><a href="#">
    <img src="images/mvc3.jpg" />ASP.NET MVC3入門</a></li>
  <li><a href="#">
    <img src="images/jqm.jpg" />jQuery Mobile入門</a></li>
  ……中略……
</ul>
リスト項目にサムネイル画像を追加したコード(list_thumb.html)
リスト項目の先頭にサムネイル画像が追加された(上記のコードの実行結果)

 画像が大きい場合にも最大80×80px(ピクセル)になるように縮小されるが、縦横比が大きく異なる画像の場合、下(もしくは右)に空白が空くため、見栄えもよくない(次の画面は横長のサムネイル画像を指定した場合の表示例)。原則として、あらかじめ80×80pxにそろえたサムネイル画像を用意しておくのが望ましいだろう。

横長のサムネイル画像を指定した場合の表示例

 ただし、もしも縦長の画像を利用すると、サムネイル画像の横幅が短くなるので、サムネイル画像とリンク・テキストの間の余白が広がってしまう。このような場合には、以下のコード例のようにリンク・テキストの左パディング(=既定では「100px」)をCSSで再設定しておくことで空白を調整することも可能だ(以下のコード例では「70px」となっているが、当然この余白の長さは画像幅によって変更しなければならない)。

<style>
.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit { padding-left: 70px; }
</style>
リンク・テキストの左に余白を設定するコード(list_thumb.html)

(3)リスト項目にアイコン画像を付与する

 <img>要素に「class="ui-li-icon"」属性を付与することで、リスト項目にアイコン画像を付与することもできる。以下は、そのコード例と実行結果。

<ul data-role="listview">
  <li><a href="#">
    <img src="images/entry.gif" class="ui-li-icon" />
    ASP.NET MVC3入門</a></li>
  <li><a href="#">
    <img src="images/entry.gif" class="ui-li-icon" />
    jQuery Mobile入門</a></li>
  <li><a href="#">
    <img src="images/entry.gif" class="ui-li-icon" />
    Entity Framework 4.1入門</a></li>
  ……中略……
</ul>
リスト項目にアイコン画像を追加したコード(list_ui_icon.html)
リスト項目の先頭にアイコン画像が追加された(上記のコードの実行結果)

 本質的には(2)と同じ考え方で、内部的には「リスト項目の左パディングを40px」「画像を最大40×40px(それより大きい場合は縮小)」としたうえで配置しているようだ。ただし、公式サイトでは「To use standard 16x16 pixel icons in list items」とあるように、16×16pxのアイコンを想定しているようで、以下に示すように、大きなアイコン画像を埋め込もうとすると、リスト項目の境界線をはみ出してしまうので要注意だ。

大きな画像をアイコン画像として埋め込んだ場合の表示結果

(4)リスト項目に見出しや補足を追加する

 より複雑なリストでは、リスト項目に見出しや補足を付与することも可能だ。以下は、そのコード例と実行結果。

<ul data-role="listview">
  <li>
    <a href="#">
      <h3>ASP.NET MVC3入門</h3>  ……
      <p>Visual Studio 2010(.NET Framework 4)……中略……</p> ……
      <p class="ui-li-aside">ASP.NET、フレームワーク、MVC</p>   ……
    </a>
  </li>
  ……中略……
</ul>
リスト項目に見出しや補足を追加したコード(list_ui-li-aside.html)
リスト項目に見出しと補足を追加(上記のコードの実行結果)

 リスト項目(=<li>要素)配下のマークアップの規則は、以下のとおりだ。

        見出しは<h1>〜<h6>要素としてマークアップする*6
        見出し以外は<p>要素でマークアップする
        補足は<p>要素に「class="ui-li-aside"」属性を付与する

*6 開閉パネルと同じく、見出しには<h1>〜<h6>いずれの要素を利用してもよい。外観には影響しないので、上位の見出しレベルに応じて、最適なものを選択しよう。

 なお、リスト・ビューでは、見出し、コンテンツ、補足いずれも長くなると、末尾が「...」で切り捨てられるので注意してほしい(改行されるわけではない)。特に、このような複雑なリストでは切り捨てが発生しやすいので、文字量にも留意すべきだろう。

(5)カウント・バブルを表示する

 「class="ui-li-count"」属性を持つ要素をリスト項目に含めることで*7、カウント・バブルを表示できる。カウント・バブルとは、リスト項目に関する個数を表したもの。例えば、メール・ボックスであればボックスごとの未読メール数であるとか、フィード・リーダであればフィード単位の新着記事数などを表すのに利用することになるだろう。

 例えば、以下はそれぞれの記事のブックマーク数を、カウント・バブルで表したコード例と、その実行結果だ。

*7 バブルを表す要素は何でもよいため、意味として中性的な<span>要素を利用することが多いようだ。

<ul data-role="listview">
  <li>
    <a href="#">ASP.NET MVC3入門
      <span class="ui-li-count">153</span></a>
  </li>
  <li>
    <a href="#">jQuery Mobile入門
      <span class="ui-li-count">250</span></a>
  </li>
  ……中略……
</ul>
ブックマーク数をカウント・バブルとして表示するコード
各記事のブックマーク数をカウント・バブルとして表示(上記のコードの実行結果)

リスト項目が多くなった場合の対処策

 リスト・ビューでは、項目数が多くなった場合にも可読性を損なわないために、区切りや階層リスト、フィルタのような仕組みを用意している。

(1)区切り線を追加する

 項目数が多くなった場合、まずは途中に区切り線(=デバイダ)を加えて、項目をグループ化するだけでもリスト全体が引き締まる。例えば以下は、記事リストをカテゴリ単位に区切った場合のコード例と実行結果だ。

<ul data-role="listview">
  <li data-role="list-divider">ASP.NET</li>
  <li><a href="#">ASP.NET MVC3入門</a></li>
  <li><a href="#">Entity Framework 4.1入門</a></li>
  <li><a href="#">独習ASP.NET 第3版</a></li>
  <li data-role="list-divider">JavaScript</li>
  ……中略……
</ul>
リストを区切り線でカテゴリ単位に分けるコード(list_divider.html)
記事リストをカテゴリで区切った結果(上記のコードの実行結果)

 デバイダを表すには、リスト項目(=<li>要素)に「data-role="list-divider"」属性を追加すればよい。

(2)リストを階層化する

 (1)のデバイダは簡易な手段であるが、項目数がさらに多くなった場合には、スクロールしないとリスト全体を把握できないという問題もある。項目数が多く、グループ単位にまずはリスト全体を把握させたいというケースでは、階層リストを利用するとよいだろう*8

 階層リストは、<ul>/<ol>リストを入れ子にすることで表現できる。以下は、そのコード例と実行結果。

*8 逆に、初期状態でリスト全体を見せることが主目的であるならば、デバイダを利用した方がよい。

<ul data-role="listview">
  <li>ASP.NET
    <ul>
      <li><a href="#">ASP.NET MVC3入門</a></li>
      <li><a href="#">Entity Framework 4.1入門</a></li>
      <li><a href="#">独習ASP.NET 第3版</a></li>
    </ul>
  </li>
  ……中略……
</ul>
リストをカテゴリ単位に階層化したコード(list_nest.html)
[JavaScript]をタップ
カテゴリをタップすると、配下の記事リストがサブページで表示される(上記のコードの実行結果)

 階層リストは、初期状態では最上位のリストのみが表示される。そして、それぞれのリスト項目をタップすることで、下位のリストがサブページとして表示されるわけだ(タップできることが分かるように、上位リストの右端には[>]アイコンが付与される)。

 なお、サンプルでは2階層リストの例を示しているが、必要であれば階層はいくらでも増やして構わない。

(3)フィルタ機能を設置する

 リスト・ビュー(=<ul>/<ol>要素)に「data-filter="true"」属性を付与することで、フィルタ機能を付与できる。以下は、そのコード例と実行結果。

<ul data-role="listview" data-filter="true">
  <li data-role="list-divider">ASP.NET</li>
  <li><a href="#">ASP.NET MVC3入門</a></li>
  <li><a href="#">Entity Framework 4.1入門</a></li>
  <li><a href="#">独習ASP.NET 第3版</a></li>
  ……中略……
</ul>
フィルタ機能を付与するコード
リスト上部の検索ボックスからキーワード入力すると……キーワードで部分一致検索された項目だけが絞り込み表示される(上記のコードの実行結果)

 フィルタ機能を有効にすると、リスト上部に検索ボックスが追加される。あとは検索ボックスにキーワードを入力すると、自動的に、部分一致検索で合致した項目だけが絞り込み表示されるわけだ(検索に際して大文字/小文字は区別されない)。

 デバイダにも対応しており、デバイダ配下のリスト項目が全て合致しない場合には、デバイダも非表示となる。


 INDEX
  [連載]jQuery Mobile入門
  第3回 開閉可能パネル/リスト・ビュー/ナビゲーション・バーを使いこなそう
    1.開閉可能なパネルを生成する
  2.ネイティブ・アプリ・ライクなリストを生成する
    3.ナビゲーション・バー/ヘッダやフッタの挙動を制御する

インデックス・ページヘ  「連載:jQuery Mobile入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH