一般商務型或是需要有客服的網站都會提供簡易的問與答頁面,會把一些常見的問題整理成一個清單後,接著再針對問題來一一回答。當顧客有使用上或是其它疑問時,可以先自行透過問與答來找找看是否有符合自己問題的項目。
但請試著想像一下,若每一項問題的回答都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(); }); |
筆者還增加新的效果:當點擊某一項目時,會先把其它已經展開的項目給隱藏起來,保持一次只有一個是展開的。
男丁老師,如何一開始就先展開第一個項目?
在程式的後面多補上一句:
男丁大師:
之前是網頁編排,所以對這方面我很菜,但很想學會。
請問這樣是html css javaScript三個檔嗎?還是共一個呢?
to Rita
可放在同一個.htm裡面,或是要掛.js與.css也可
to derek
還是不懂!為何我的畫面沒有出現問題、答案等等呢
當然也不會動了。可以貼個完整一樣的給我看嗎??
我覺得你把有問題的網頁傳上來看..這樣大家要幫你找問題也會比較快!
問題分類
問題
答案
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;
}
// 全部展開
$('#qaContent .qa_showall').click(function(){
$('#qaContent ul.accordionPart li div.qa_content').slideDown();
return false;
});
// 全部隱藏
$('#qaContent .qa_hideall').click(function(){
$('#qaContent ul.accordionPart li div.qa_content').slideUp();
return false;
});
$(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();
});
不知是否漏掉什麼了
唔...這位同學..你貼的都是我的 code...這..沒什麼幫助啊..
把整個 html + js + css 寄給我試看看吧XD
sorry...
我想還是需要多知道了解一些再提問好了。謝謝各位
南丁
請問我要從另一個頁面連結到特定的問題時,
要怎麼讓特定的答案展開呢? (預設是全關...)
謝謝~
(新手真是萬事起頭難啊~~) XD
你可以參考第四個範例, 網址後面我多帶了一個 #q2 的值,
仔細看我網頁中問題標題的 class, 還會多設一個 id, 這樣就可以利用錨點的功能來做控制
按照第四個範例 連結處加上錨點
是否有提供送貨到離島的服務?
訂購相關問題
是否有提供送貨到離島的服務?
因航運成本較高,本站提供免運費服務的範圍只限台灣本島。
連結是會跑 但他似乎不會往下移動顯示答案 請問老師該怎麼做
可以的話, 把你的問題檔案寄給我看看。
哇! 謝謝男丁..
我自己也有寫出來,只是沒你寫的好!
感謝....(又學了一招!) ^_^
黑貓白貓, 抓的到老鼠的就是好貓!能完成需求的就是好方法。
請問,不同瀏覽器都相容嗎??
因為我用火狐的話可以看到每一個的標題
但是ie8就只能看見第一個了
我都有試過了..應該是OK的, 不知道你執行的範例是第幾個?
老師~請問如果「訂購相關問題」、「退貨相關問題」也是收合的項目(意思是總共有兩層收合項目),這部分網頁程式碼和javascript該如何做調整?
應該只要把所謂的訂購相關問題等也是設計成使用 ul li 的方式就可以了