在網路知識爆炸的 Web 2.0 時代,一個頁面上要顯示的資訊越來越多,但總不可能把全部的內容都一次顯示出來塞滿整頁吧!所以就出現了頁籤(Tab)這樣的展示方式。
每個標籤都有相對應的內容區塊,這樣只要一個小小的位置能放置的資訊就會比原先的更多,就像是原本只是一層矮平房,現在把它蓋成 101 大樓一樣!
廢話不多說,讓我們先來看看 HTML 的部份吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <body> <div class="abgne_tab"> <ul class="tabs"> <li><a href="#tab1">男丁格爾</a></li> <li><a href="#tab2">jQuery</a></li> </ul> <div class="tab_container"> <div id="tab1" class="tab_content"> <h2>關於作者</h2> <p>目前工作是網頁開發為主,因此針對了 HTML, JavaScript, CSS 等知識特別深入研究。若有任何問題,歡迎直接留言或是透過 Mail 討論。</p> </div> <div id="tab2" class="tab_content"> <h2>jQuery is a new kind of JavaScript Library.</h2> <p>jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript</p> </div> </div> </div> </body> |
.abgne_tab 區塊是用來包覆我們的頁籤區塊,而 ul 及 li 是用來當標籤,其中的超連結是利用錨點(Anchor)的方式來設定,對應到指定的 id 元素。除了可以讓 jQuery 來直接取到元素之外,當 JavaScript 被停用時,至少還能用原本錨點(Anchor)的功能。
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ul, li { margin: 0; padding: 0; list-style: none; } .abgne_tab { clear: left; width: 400px; margin: 10px 0; } ul.tabs { width: 100%; height: 32px; border-bottom: 1px solid #999; border-left: 1px solid #999; } ul.tabs li { float: left; height: 31px; line-height: 31px; overflow: hidden; position: relative; margin-bottom: -1px; /* 讓 li 往下移來遮住 ul 的部份 border-bottom */ border: 1px solid #999; border-left: none; background: #e1e1e1; } ul.tabs li a { display: block; padding: 0 20px; color: #000; border: 1px solid #fff; text-decoration: none; } ul.tabs li a:hover { background: #ccc; } ul.tabs li.active { background: #fff; border-bottom: 1px solid#fff; } ul.tabs li.active a:hover { background: #fff; } div.tab_container { clear: left; width: 100%; border: 1px solid #999; border-top: none; background: #fff; } div.tab_container .tab_content { padding: 20px; } div.tab_container .tab_content h2 { margin: 0 0 20px; } |
當設定好 CSS 排版之後,大概就能看到基本的畫面了:
筆者的想法是,在未加上程式之前把內容都先顯示出來,預設讓 JavaScript 被停用或是載入失敗時還能看到內容。接著沒問題之後,就是加上 jQuery 來實做出完整的頁籤效果囉:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $(function(){ // 預設顯示第一個 Tab var _showTab = 0; var $defaultLi = $('ul.tabs li').eq(_showTab).addClass('active'); $($defaultLi.find('a').attr('href')).siblings().hide(); // 當 li 頁籤被點擊時... // 若要改成滑鼠移到 li 頁籤就切換時, 把 click 改成 mouseover $('ul.tabs li').click(function() { // 找出 li 中的超連結 href(#id) var $this = $(this), _clickTab = $this.find('a').attr('href'); // 把目前點擊到的 li 頁籤加上 .active // 並把兄弟元素中有 .active 的都移除 class $this.addClass('active').siblings('.active').removeClass('active'); // 淡入相對應的內容並隱藏兄弟元素 $(_clickTab).stop(false, true).fadeIn().siblings().hide(); return false; }).find('a').focus(function(){ this.blur(); }); }); |
一開始可以設定是要先顯示第幾個標籤的內容,接著就是把不顯示的部份給隱藏起來。當完成顯然及隱藏的步驟之後,就能看到完整的效果畫面了:
當點擊其它的頁籤時會立即的切換顯示相對應的內容。若想用滑鼠的滑入來觸發頁籤切換的話,只要把 click 事件改成 mouseover 事件就可以囉。
雖然完成了一個頁籤區塊,但有時可能一個頁面上就會放了2-3個頁籤區塊。若每個頁籤區塊的結構都差不多的話,我們就不用一一的為每個區塊來寫程式,只要善用 jQuery 的 each() 就能快速的完成 N 個頁籤區塊的設定:
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 | $(function(){ // 預設顯示第一個 Tab var _showTab = 0; $('.abgne_tab').each(function(){ // 目前的頁籤區塊 var $tab = $(this); var $defaultLi = $('ul.tabs li', $tab).eq(_showTab).addClass('active'); $($defaultLi.find('a').attr('href')).siblings().hide(); // 當 li 頁籤被點擊時... // 若要改成滑鼠移到 li 頁籤就切換時, 把 click 改成 mouseover $('ul.tabs li', $tab).click(function() { // 找出 li 中的超連結 href(#id) var $this = $(this), _clickTab = $this.find('a').attr('href'); // 把目前點擊到的 li 頁籤加上 .active // 並把兄弟元素中有 .active 的都移除 class $this.addClass('active').siblings('.active').removeClass('active'); // 淡入相對應的內容並隱藏兄弟元素 $(_clickTab).stop(false, true).fadeIn().siblings().hide(); return false; }).find('a').focus(function(){ this.blur(); }); }); }); |
這樣出來的頁籤(Tab)效果就已經蠻實用的,若美術設計能力夠的話,還能改用圖片的標籤來美化呢!
男丁高手您好:
謝謝您的範例!
想請問一下,範例中提到"一開始可以設定是要先顯示第幾個標籤的內容,接著就是把不顯示的部份給隱藏起來。當完成顯然及隱藏的步驟之後,就能看到完整的效果畫面了"—->請問如何隱藏起來?
我把click改成$('ul.tabs li').mouseover(function()
就可以達到yahoo當滑過去就可以顯示下一個頁籤嗎?弄了很久都不會隱藏所以只好請教閣下您了。謝謝
1.只要改程式中_showTab = 0 的部份..0 表示顯示第一個
2.只要把 click 改成 mouseover 即可..另外也要把
改成
以避免一些 bug..
男丁高手您好:
我剛剛又試了您提供的範例,如果單獨開一個html是沒問題。但是我這個是要放在table中就無法隱藏 請問怎麼做才會隱藏—>table中?
感謝您
男丁高手您好:
您提到"只要改程式中_showTab = 0 的部份..0 表示顯示第一個"
我總共有四列三欄 我是要放在第一列第二欄中那麼_showTab 要改為多少?
感謝您
可以的話..把你現在有問題的 html 提供給我看看
男丁老師您好:
謝謝您的範例!
想請問一下,可否不用外掛,用"js:或"css"寫得唔得,有方法可以解決嗎?
感謝!感謝!
如果你不想用像 jQuery 這類的 Framework 的話..
那就是要自己去寫出類似的語法來就可以了..
或者可以參考很久寫的一篇範例:http://blog.xuite.net/abgne/diary1/5258975
作者你好,不知道能不能做到幾秒之後切換到下個頁籤,以前有在玩 Discuz!,是用這種方法達到類似效果做網頁頁籤:http://www.dotblogs.com.tw/puma/archive/2008/10/29/5821.aspx,但想要改用你的方法,要加上什麼的 Javascript 語法來設定秒數?Thx!
要讓它們輪播其實很簡單..只要使用 SetTimeout() 來設定每隔多久切換頁籤就可以了。
你好,補充一下,我自己改程式碼當中的CSS,想把標籤分成 4 個,每一個標籤佔 25%(400px 裡頭的 100px),但沒辦法達到上下(頁籤和內容)框線對齊,會往下掉一個。
.abgne_tab { width:400px;}
ul.tabs { width: 100%;}
ul.tabs li { width:25%;}
不知道怎樣來修復這個問題?麻煩你了
因為 li 是有 border 的..所以 li 除了寬的 25% 還會再加上 border。
請問一下 該怎樣達到 兩層的效果呢~~?~
按照網站所交的 顯示出來ok ~ 但不知道怎樣去達到兩層頁籤效果
兩層是要長成怎樣呢?通常都是看你頁籤那邊的樣式如何去設計而已
例如 有MENU A , B A裡面有 1,2,3 B裡面也有1,2,3
獨立的123 都代表撈出不同的資料 ~ 假設點menu a 會先把a 的1,2,3 資料全撈出來 在各自點1,2,3去獨立顯示,或者點menu b 他會去撈b裡面的1,2,3資料
一層的方式 我套用你所教學的 ^^ 已經完成 在想說怎樣弄道兩層
建議你可以先用 html + css 把畫面排出來後再進行程式的設計
男丁老師,我有問題想請教老師您,我在
ul.tabs li a {
display: block;
color: #000;
text-decoration: none;
background-image: url(/0020_1_files/images/content/NEW.png);
width: 156px;
height: 70px;
}
放入圖片沒有顯示出來,哪邊出了問題
老師處理好了 ok了