折りたたみ式Q&A
Q&Aページで、質問文をクリックするとその下に回答内容が表示される…
といったのが時々ありますが、訳あってそんなのを作ってみたんで折角なのでupしてみます。
ソース
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>JavaScript Q and A</title> <style type="text/css"> div#qabox { background-color: #dcdcdc; padding: 10px; } div#qabox h4 { margin: 0px; padding-left: 0.5em; background-color: #fff; } div#qabox ul { padding-left: 1em; } div#qabox ul li { list-style-type: none; } div#qabox ul li.que { cursor: pointer; } div#qabox ul li.ans { display: none; padding-left: 1em; } </style> <script type="text/javascript"> function changeVisible(e) { var own = e.srcElement ? e.srcElement: e.target; if (own.nodeName != 'LI' || own.className == 'ans') return; var tgt = own.nextSibling; if (tgt.currentStyle) { var s = tgt.currentStyle.display == 'none' ? 'block': 'none'; } else if (document.defaultView.getComputedStyle) { var s = document.defaultView.getComputedStyle(tgt, null).getPropertyValue('display') == 'none' ? 'block': 'none'; } tgt.style.display = s; } window.onload = function() { var elm = document.getElementById('qabox'); if (document.attachEvent) { elm.attachEvent('onclick', changeVisible); } else if (document.addEventListener) { elm.addEventListener('click', changeVisible, false); } } </script> </head> <body> <div id="qabox"> <h4>ほげに関して</h4> <ul> <li class="que">どうすればそんなにほげれるのでしょう? <li class="ans">一心不乱にほげる事のみを考えましょう。 <li class="que">ほげの先には何がありますか? <li class="ans">ふがです。 </ul> <h4>ふがに関して</h4> <ul> <li class="que">どうすればそんなにふがれるのでしょう? <li class="ans">適当でおkwwばっちこーい <li class="que">ふがはおいしいのですか? <li class="ans">超うめぇ </ul> </div> </body> </html>
方法的には至って簡単。特定のdiv要素内にlist要素で作成したQ&Aを質問・回答の順に配置して、
回答の方は予めcssのdisplay属性をnoneにして非表示にしておく。
で、質問側のlist要素をクリックしたら、それに対する回答、つまりは次のlist要素のdisplay属性を
blockにして表示させる…といった感じです。
サンプル
こんな感じになります。
ちなみに
予めdisplay属性をnoneにしているlist要素をjavascriptでblockとかにして表示させると、
なぜかマーカーやマーカー画像が表示されません。ソース中で明示的に
elm.style.listStyleType = 'disc';
としてやっても、表示されません。最初はFirefoxのバグかと思ったんですが、
その他のブラウザ*1も同じ挙動なので、自分のソースがおかしいのか、
はたまた、仕様なのか…*2
ちなみにIE6では表示されるんで、こんなとこでもIE6の異端ぶりが如何なく発揮されとります。(;^ω^)
とりあえず、この点については、またそのうち調べてみようと思います。