はじめに
Bootstrap 3でCollapse(折りたたみ)機能を試して見る(1)では、Collapse機能の基本を試しましたが、不満な点もあります。そこで今回は、Collapseの不満な点を改善する応用的な使用方法を試してみます。
2013年12月28日 12時46分
Bootstrap 3でCollapse(折りたたみ)機能を試して見る(1)では、Collapse機能の基本を試しましたが、不満な点もあります。そこで今回は、Collapseの不満な点を改善する応用的な使用方法を試してみます。
作業の前提条件は、下記のとおりです。
| ソフトウエア | バージョン |
|---|---|
| OS | Windows 7 Ultimate 32bit |
| Cygwin | Setup Version 2.831 |
Collapseを試して見ると、以下の不満点があります。
| 不満点 | 概要 |
|---|---|
| Anchorをクリックする必要がある。 | デフォルトのCollapseでは、panelクラス使っているため、テキストアンカーをクリックしないと展開できない。 |
| 複数パネルを表示できない。 | デフォルトのCollapseでは、複数パネルのうち、クリックしたパネルを表示し、その他を折りたたむため、複数パネルの展開ができない。 |
上に挙げた不満点を解消するための、使用方法を解説します。
デフォルトでは、panel-headingクラスを使用しているため、list-item-groupを使用することで、アンカー以外をクリックしても展開できるようになります。
変更前
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapse">
Sample
</a>
</h4>
</div>
変更後
<a class="list-group-item" data-toggle="collapse" data-parent="#accordion" href="#collapse">
Sample
</a>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!--[if IE]>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>025-1</title>
<link href="bootstrap.min.css" rel="stylesheet">
</head>
<body>
<header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
</header>
<div class="container">
<div class="row">
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
<!-- メインコンテンツ -->
<div class="col-xs-6 col-sm-6 col-md-6">
<h3>panel方式(デフォルト)</h3>
<div class="panel-group" id="accordion1">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse11">
アコーディオン #1
</a>
</h4>
</div>
<div id="collapse11" class="panel-collapse collapse in">
<div class="panel-body">
<p>
アコーディオン #1<br>アコーディオン #1<br>
アコーディオン #1<br>アコーディオン #1
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse12">
アコーディオン #2
</a>
</h4>
</div>
<div id="collapse12" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #2<br>アコーディオン #2<br>
アコーディオン #2<br>アコーディオン #2
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse13">
アコーディオン #3
</a>
</h4>
</div>
<div id="collapse13" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #3<br>アコーディオン #3<br>
アコーディオン #3<br>アコーディオン #3
</p>
</div>
</div>
</div>
</div><!-- panel-group -->
<h3>list-item-group方式</h3>
<div class="panel-group" id="accordion2">
<div class="panel panel-default">
<a class="list-group-item" data-toggle="collapse" data-parent="#accordion2" href="#collapse21">
アコーディオン #1
</a>
<div id="collapse21" class="panel-collapse collapse in">
<div class="panel-body">
<p>
アコーディオン #1<br>アコーディオン #1<br>
アコーディオン #1<br>アコーディオン #1
</p>
</div>
</div><!-- panel-collapse -->
</div><!-- panel -->
<div class="panel panel-default">
<a class="list-group-item" data-toggle="collapse" data-parent="#accordion2" href="#collapse22">
アコーディオン #2
</a>
<div id="collapse22" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #2<br>アコーディオン #2<br>
アコーディオン #2<br>アコーディオン #2
</p>
</div>
</div><!-- panel-collapse -->
</div><!-- panel -->
<div class="panel panel-default">
<a class="list-group-item" data-toggle="collapse" data-parent="#accordion2" href="#collapse23">
アコーディオン #3
</a>
<div id="collapse23" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #3<br>アコーディオン #3<br>
アコーディオン #3<br>アコーディオン #3
</p>
</div>
</div><!-- panel-collapse -->
</div><!-- panel -->
</div><!-- panel-group -->
</div><!-- col-6 -->
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
</div><!-- row -->
</div><!-- container -->
<script src="jquery-1.10.2.min.js"></script>
<script src="bootstrap.min.js"></script>
</body>
</html>
ページを表示すると、デフォルト方式とlist-item-group方式が表示されます。

panelクラスを使用した場合、同一グループ内で常に1つのパネルのみを展開し、その他のパネルを折りたたんでしまうため、panelクラスからlistクラスを使ってCollapseを実装します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!--[if IE]>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>025-2</title>
<link href="bootstrap.min.css" rel="stylesheet">
</head>
<body>
<header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
</header>
<div class="container">
<div class="row">
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
<!-- メインコンテンツ -->
<div class="col-xs-6 col-sm-6 col-md-6">
<h3>panel方式(デフォルト)</h3>
<div class="panel-group" id="accordion1">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse11">
アコーディオン #1
</a>
</h4>
</div>
<div id="collapse11" class="panel-collapse collapse in">
<div class="panel-body">
<p>
アコーディオン #1<br>アコーディオン #1<br>
アコーディオン #1<br>アコーディオン #1
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse12">
アコーディオン #2
</a>
</h4>
</div>
<div id="collapse12" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #2<br>アコーディオン #2<br>
アコーディオン #2<br>アコーディオン #2
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapse13">
アコーディオン #3
</a>
</h4>
</div>
<div id="collapse13" class="panel-collapse collapse">
<div class="panel-body">
<p>
アコーディオン #3<br>アコーディオン #3<br>
アコーディオン #3<br>アコーディオン #3
</p>
</div>
</div>
</div>
</div><!-- panel-group -->
<h3>List方式</h3>
<div class="list-group" id="accordion3">
<a data-toggle="collapse" data-parent="#accordion3" href="#collapse31" class="list-group-item">
アコーディオン #1
</a>
<div id="collapse31" class="collapse in">
<p class="list-group-item">
アコーディオン #1<br>アコーディオン #1<br>
アコーディオン #1<br>アコーディオン #1
</p>
</div>
<a data-toggle="collapse" data-parent="#accordion3" href="#collapse32" class="list-group-item">
アコーディオン #2
</a>
<div id="collapse32" class="collapse">
<p class="list-group-item">
アコーディオン #2<br>アコーディオン #2<br>
アコーディオン #2<br>アコーディオン #2
</p>
</div>
<a data-toggle="collapse" data-parent="#accordion3" href="#collapse33" class="list-group-item">
アコーディオン #3
</a>
<div id="collapse33" class="collapse">
<p class="list-group-item">
アコーディオン #3<br>アコーディオン #3<br>
アコーディオン #3<br>アコーディオン #3
</p>
</div>
</div>
</div><!-- col-6 -->
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
</div><!-- row -->
</div><!-- container -->
<script src="jquery-1.10.2.min.js"></script>
<script src="bootstrap.min.js"></script>
</body>
</html>
ページを表示すると、デフォルト方式とList方式が表示されます。

Collapseは、コードだけでなくさまざまなユースケースが考えられます。Collapseを使用する上で注意すべき点を挙げます。
| CASE | 注意点 | 概要 |
|---|---|---|
| 1 | panel-groupとdata-parentで指定するidが一致しない場合 | data-parentで指定したidがpanel-groupのidとミスマッチの場合も、hrefがマッチすれば展開されます。 |
| 2 | data-toggleで指定するリンク先(href)が、存在しない場合 | 折りたたみは行われません。 |
| 3 | リンク先が、別のpanel-groupのidの場合 | 指定されたidのデータが折りたたまれます。 |
1行目と4行目で指定したidがミスマッチでも、3行目と8行目で指定したhrefがマッチすれば、展開されます。
<div class="panel-group" id="accordion1">
<div class="panel panel-default">
<a href="#collapse11"
data-parent="#accordion100"
class="list-group-item" data-toggle="collapse">
data-parent is accordion100
</a>
<div id="collapse11" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
3行目と8行目で指定したhrefがミスマッチの場合、展開されません。
<div class="panel-group" id="accordion2">
<div class="panel panel-default">
<a href="#collapse21"
data-parent="#accordion2"
class="list-group-item" data-toggle="collapse">
展開されません
</a>
<div id="collapse51" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
8行目と17行目で指定したhrefがマッチしたの場合、異なるpanel-groupであっても、マッチしたhrefが展開されます。
<div class="panel-group" id="accordion3">
<div class="panel panel-default">
<a href="#collapse31"
data-parent="#accordion3"
class="list-group-item" data-toggle="collapse">
Target#1
</a>
<div id="collapse31" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
<h4>panel-group: accordion4</h4>
<div class="panel-group" id="accordion4">
<div class="panel panel-default">
<a href="#collapse31"
data-parent="#accordion4"
class="list-group-item active" data-toggle="collapse">
Target#1が展開されます
</a>
<div id="collapse41" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!--[if IE]>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>025-3</title>
<link href="bootstrap.min.css" rel="stylesheet">
</head>
<body>
<header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
</header>
<div class="container">
<div class="row">
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
<!-- メインコンテンツ -->
<div class="col-xs-6 col-sm-6 col-md-6">
<h3>CASE 1</h3>
<h4>panel-group: accordion1</h4>
<div class="panel-group" id="accordion1">
<div class="panel panel-default">
<a href="#collapse11"
data-parent="#accordion100"
class="list-group-item" data-toggle="collapse">
data-parent is accordion100
</a>
<div id="collapse11" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
<h3>CASE 2</h3>
<h4>panel-group: accordion2</h4>
<div class="panel-group" id="accordion2">
<div class="panel panel-default">
<a href="#collapse21"
data-parent="#accordion2"
class="list-group-item" data-toggle="collapse">
展開されません
</a>
<div id="collapse51" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
<h3>CASE 3</h3>
<h4>panel-group: accordion3</h4>
<div class="panel-group" id="accordion3">
<div class="panel panel-default">
<a href="#collapse31"
data-parent="#accordion3"
class="list-group-item" data-toggle="collapse">
Target#1
</a>
<div id="collapse31" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
<h4>panel-group: accordion4</h4>
<div class="panel-group" id="accordion4">
<div class="panel panel-default">
<a href="#collapse31"
data-parent="#accordion4"
class="list-group-item active" data-toggle="collapse">
Target#1が展開されます
</a>
<div id="collapse41" class="panel-collapse collapse">
<div class="panel-body"><p>Sample 1</p></div>
</div>
</div>
</div>
</div><!-- col-6 -->
<div class="col-xs-3 col-sm-3 col-md-3">
</div><!-- col-3 -->
</div><!-- row -->
</div><!-- container -->
<script src="jquery-1.10.2.min.js"></script>
<script src="bootstrap.min.js"></script>
</body>
</html>
