jQueryを使って超シンプルなアコーディオンを作る

Posted by poundhound on February 17, 2009

jQueryを使った超シンプルなアコーディオンを作ってみました。#simpleAccordionを与えたdivの子要素であるh2をクリックするとその直後のdiv要素が開くと言うものです。

まずはデモです。

マークアップは次のようにします。

<div id="simpleAccordion">
<h1>jQuery Simple Accordion</h1>
<h2>Click This</h2>
<div>
<p>example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text </p>
</div>

<h2>Click This</h2>
<div>
<p>example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text </p>
</div>

<h2>Click This</h2>
<div>
<p>example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text example text </p>
</div>

<!-- // end #myAco --></div>

head要素に次のスクリプトを書きます。もちろんjQueryが必要です。

<script type="text/javascript" src="../js/jquery-1.2.3.pack.js"></script>
<script type="text/javascript">
$(function()
{
	$("div#simpleAccordion div").hide();
	$("div#simpleAccordion h2").each(function(i)
	{
		var elementVal = $(this).next("div");
		
		$(this).click(function()
		{
			elementVal.toggle("normal");
		});
	});
});
</script>

スクリプトの解説ですが、$("div#simpleAccordion div")で#simpleAccordionの子要素のdivをhideイベントで非表示にしておきます。

次にeachメソッドでelementVal配列に自身(h2)の直後に出てくるdiv要素を格納します。対応するh2がクリックされた時にh2直後のdivをtoggleイベントで表示・非表示を切り替えます。

今更ですが、jQueryはtoggleで表示・非表示を切り替えてくれるので凄く便利ですね。toggleイベントの引数をslow、fastにするとアニメーションのスピードが変わります。数値でも指定出来ます。

ちなみにh2をクリックさせるのでh2のCSSにcursor: pointerを指定するのを忘れないでください。

よろしければデモをzipでどうぞ
j_aco.zip

Category:JavaScript の最近の記事

Trackback(0)

Trackback URL: http://www.nk0206.com/mt/mt-tb.cgi/418

12 Comments

1

下に表示されるサンプルありませんか?

2

コメントありがとうございます。下に表示されるとはこういう事でしょうか?
http://www.nk0206.com/demo/jquery/accordion02.html
高さを指定していなのでカクカクしてしまいますが。

3

はじめまして、こちらのサイトを参考にさせていただいています。

1つお伺いしたいのですが、1つ目をクリックしてから2つ目を開くときに、1つ目を閉じさせたいのですが、どうすればいいでしょうか?
常に1つしか表示させたくないのですが。。。

お手数ですが、ご教示いただければ幸いです。
よろしくお願いします。

4

デモを用意しました。
解説も一応書いておいたのですが、こんな感じで良いですか?
jQuery Accordion Demo

5

ご丁寧にありがとうございます。
全てのソースを理解しきることはできませんでしたが、無事に動きましま。
今後もJSを勉強していきたいと思います。

あと、開いているタブをクリックすると閉じさせるにはどうすればよろしいのでしょうか?
現状では、.hide();を記述し、初めの状態では全て閉じている状態にしているので、できればクリックすると閉じることが可能なようにもしたいと思っております。
ご質問ばかりで申し訳ございませんが、教えていただけないでしょうか?

6

1.最初全て閉じている状態
2.クリックすると1つが開く。
3.他をクリックすると今まで開いていた物が閉じて新しい内容が開く
てな動きでよろしいのでしょうかね?
それなら最初のul:not(:first)の条件を外せば大丈夫だと思います。
jQuery Accordion Demo

7

1:Section1をクリックすると開く
2:Section1をもう一度クリックすると閉じ、はじめの全て閉じる状態になる

上記のことがしたいと思っております。
何度も大変申し訳ございません。

8

すいません、いまいち動きが分かりません。
記事のデモとは動きと同じように感じますが。

9

何度もすみません。
記事のデモに、質問した「次を開くときに自動で閉じる」を適用させたものを作りたいと思っております。

10

なるほど。
どういった状況で使うか不明ですが、一つ思うことがあります。
最初は全て閉じていても構わないと思いますが、一度開いた後に全てが閉じている状態に戻す必要があるのか?と言う事です。
訪問したユーザーは何らかの情報を得るためにクリックしますよね?
最初に開くパネルを選択するのはユーザーに委ねるとします。
一度開かれたパネルを全て閉じると言う事は、どのパネルの内容も不要と言う事になります。
内容が不要と言う事はユーザーはその場から離れると言うことでしょう。
パネルを全て閉じて離脱と言うユーザーはいないと思います。
まずはその動作が必要か不要かをもう一度考えてはいかがでしょうか?
一番最初の項目とそれ以降の項目で処理を分岐させる方法かな?と思いますが、少々複雑なコードになると思われます。

11

なるほどですね。
確かにそう言われると不必要だと思いました。
私のエゴだったのかもしれません。
ユーザー目線で考えると全く不必要ですね。

この事も踏まえ、ユーザー目線での考え方など、かなりいい勉強になりました。
ご丁寧にどうもありがとうございました。
また、サイトのほうもちょくちょく見に来ます。

12

ユーザー目線で物事を考えると言うのはとても大事ですよね。
制作側の観点で動きを与えてユーザーエクスペリエンスを…と考えることは往々にしてあることだと思います。
確かに動きは大事な要素であることに間違いはないと思いますが、その動きが必要か不必要かをしっかり考えることが一番大事だと思います。
こちらこそ色々コメントありがとうございました。
当ブログもちまちまと更新していきますのでたまに見に来てくださいね。

Leve comment

My Tweet

    @poundhound

    Google Adsence

    • Movable Type 5 Webサイト作成ガイドVolume 1