一般商務型或是需要有客服的網站都會提供簡易的問與答頁面,會把一些常見的問題整理成一個清單後,接著再針對問題來一一回答。當顧客有使用上或是其它疑問時,可以先自行透過問與答來找找看是否有符合自己問題的項目。
但請試著想像一下,若每一項問題的回答都2-3行的話,當問題項目一多的時候,這樣網頁就會變的很長很長...。如果能把回答暫時先隱藏起來,當顧客點擊到該問題項目時才展開答案的話,至少網頁應該就會變的比較乾淨一點。
因為問與答是一對一的項目型態,因此筆者就直接用 ul 及 li 來當做項目使用:
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 | <div id="qaContent"> <h3 class="qa_group_1">問題分類</h3> <ul class="accordionPart"> <li> <div class="qa_title">問題</div> <div class="qa_content">答案</div> </li> </ul> </div> |
h3 是用來當做問題分類用的,等等也會用 CSS 來把它加上背景圖片做美化。而每一組 li 都會有問題及答案的 div,且各自有不同的 className。
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | ul, li { margin: 0; padding: 0; list-style: none; } #qaContent { width: 500px; } #qaContent h3 { width: 500px; height: 22px; text-indent: -9999px; } #qaContent h3.qa_group_1 { background: url(qa_group_1.gif) no-repeat; } #qaContent h3.qa_group_2 { background: url(qa_group_2.gif) no-repeat; } #qaContent ul.accordionPart { margin: 10px 10px 50px 30px; } #qaContent ul.accordionPart li { border-bottom: solid 1px #e3e3e3; padding-bottom: 12px; margin-top: 12px; } #qaContent ul.accordionPart li .qa_title { background: url(icon_q_a.gif) no-repeat 0px 3px; padding-left: 28px; color: #1186ec; cursor: pointer; } #qaContent ul.accordionPart li .qa_title_on { text-decoration: underline; } #qaContent ul.accordionPart li .qa_content { margin: 6px 0 0; background: url(icon_q_a.gif) no-repeat 0px -24px; padding-left: 28px; color: #666; } |
CSS 這邊只是幫 h3 標題換成指定的背景圖片標題,且把問題及答案前面都加個 Icon 來區別用。
最後就是 jQuery 上場來幫我們的問與答加上魔法效果囉:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 | $(function(){ // 幫 div.qa_title 加上 hover 及 click 事件 // 同時把兄弟元素 div.qa_content 隱藏起來 $('#qaContent ul.accordionPart li div.qa_title').hover(function(){ $(this).addClass('qa_title_on'); }, function(){ $(this).removeClass('qa_title_on'); }).click(function(){ // 當點到標題時,若答案是隱藏時則顯示它;反之則隱藏 $(this).next('div.qa_content').slideToggle(); }).siblings('div.qa_content').hide(); }); |
最後我們就能預覽畫面及效果:
這樣是不是效果會比落落長的清單好很多呢?!不過若是清單一多時,要一一幫問題及答案加上 className 就變成是麻煩的事(可用後端程式來輸出),所以筆者這邊就把它改用程式來加:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $(function(){ // 幫 #qaContent 的 ul 子元素加上 .accordionPart // 接著再找出 li 中的第一個 div 子元素加上 .qa_title // 並幫其加上 hover 及 click 事件 // 同時把兄弟元素加上 .qa_content 並隱藏起來 $('#qaContent ul').addClass('accordionPart').find('li div:nth-child(1)').addClass('qa_title').hover(function(){ $(this).addClass('qa_title_on'); }, function(){ $(this).removeClass('qa_title_on'); }).click(function(){ // 當點到標題時,若答案是隱藏時則顯示它,同時隱藏其它已經展開的項目 // 反之則隱藏 var $qa_content = $(this).next('div.qa_content'); if(!$qa_content.is(':visible')){ $('#qaContent ul li div.qa_content:visible').slideUp(); } $qa_content.slideToggle(); }).siblings().addClass('qa_content').hide(); }); |
筆者還增加新的效果:當點擊某一項目時,會先把其它已經展開的項目給隱藏起來,保持一次只有一個是展開的。
男丁老師,請教您一個問題,如果我要使用者在同一個動作不要按2次,例如:最多試用幾天內才能退貨呢?這個選項他展開後再點擊一次他不會收起來,需要點其它項目才會收合,這個動作該如何製做?謝謝~
你需要在點擊後判斷其內容是否已展開, 若是的話則不動作
南丁老師
可請教一下怎樣可以先設定開啟其中一個Q&A
就好像這例子
http://jqueryui.com/demos/accordion/default.html
它有個設定 active, 預設是 0, 所以會展開第一個, 把它加入並改成你要預設展開的那個即可。
老師, 請問範例4, 多#3值可以直接開啟,但是在網址列輸入其他值卻無法立即反應,需要按下F5重新整理才能跳到指定的範圍,請問該如何解決此問題?????????????
我猜這應該是瀏覽器的關係, 不過這樣的效果本來就是要從其它頁面跳過來使用的~
請問男丁老師,我使用範例二,遇到的問題是:回答那 div 區塊裏文字太多,再點其它的會讓視窗往上跳,還要把捲軸向上捲才能看到剛剛點的問題,想問可不可以設定讓被點選的 一直保持在頁面的 top 頂端,像加上 name 那樣的效果,當問題被點開的時候會比較方便。盡量用文字敘述,謝謝老師啦 ... 希望密密麻麻的文字沒傷到老師眼睛!
網頁本身就有錨點功能了, 除非你取消掉它原有的動作
有漏字,補充完整:想問可不可以設定讓被點選的 li 一直保持在頁面的 top 頂端
不好意思,更正:盡力用文字敘述了,謝謝男丁老師!
請教大大,如何讓它在的描述下,滑出也能很順暢呢.....
請教大大,如何讓它在DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN的描述下,滑出也能很順暢呢.....
我看起來應該是都還ok..jQuery 版本是最新的嗎?
老師想請問一下
因為我隱藏的內容很多
所以使用者在點的開的時候會很長
能不能在隱藏內容最底下再加入一個連結
讓內容隱藏並回到原本的標題那邊?
我的隱藏內容很多
如果使用者看的話就要拉到很下面
這樣子還要回標題才能夠隱藏內容
想請問老師
能不能在內容的最下面
加入一個隱藏的連結?
要如何寫?
直接參考範例 5 吧~