在網路知識爆炸的 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)效果就已經蠻實用的,若美術設計能力夠的話,還能改用圖片的標籤來美化呢!
請問老師,我才剛入門,想請問一下,選單有辦法擺在橫向(左邊嗎)?
可以啊, 只要先能把 html 排出來
大大您好,關於你範例四,不知道為什麼,點進去會直接show出全部tab_container,除非去碰到tab,才會跑出相對應的tab_container,想請問如何在一開網頁時能夠先只秀出一個tab_container?
已修正...
目前正在學PHP+CSS 感謝大大分享此文章
老師,您好
請問一下
假如按"重新整理"可以隨機停留在第一或第二個頁籤
而不是都是停留在第一個頁籤
要怎麼修改設定呢??
像博客來 http://www.books.com.tw/ 中間那一大塊的呈現方式
老師您好
請問一下,假如我想要讓網友按重新整理的時候
不一定停在第一個頁籤,
而是可以隨機停在第二的頁籤內容,或第三個頁籤內容
請問這樣要加上什麼語法呢??
把
改成
您好~不好意思打擾老師~
請問我在IE 下無法做切換~文字會變亂碼~
試了很久才發現放在IE6似乎都有問題~
但在範例中卻沒有事情 @ @
http://www.payeasy.com.tw/Lovemore/test.html
http://www.payeasy.com.tw/Lovemore/tab.html
原本是想會不會是主機端的問題~
但在FX下也可以運作~ 頭大中 @A@
歐~ 我發現是語系問題~ ><" 不好意思~ 感謝~
Good job!
老師您好,請問我能動態隱藏頁籤嗎?
例如我有二個頁籤,但在a情況我只顯示第一個頁籤,B情況我要顯示2個,c情況只顯示第二個頁籤,這樣..
呃,我成功了,謝謝您XD
呵~多加判斷就好..不難吧!!
請問關於錨點該怎麼下?
範例1
是直接改成:
範例1
這樣對嗎?
做了一個頁籤的網頁,但是發現連結出去專屬頁面時回來畫面無法回到原來的頁籤!
花了時間查到是跟錨點有關,但是..選單的錨點該如何做呢?
我不太知道你的問題是什麼XD, 可以的話, 整理一個有問題的範例檔案寄給我試試。
您好:我想請問一下,我將您的code應用在我的網頁上面,是可以動作的,但我發現有一個情況我的畫面無法轉換~~~
我有二個tab,因為資料很多,所以二個tab我都有做類似書籤的方式可以直接跳到指定的位置上去看資料,但是我發現,當我在第一個tab時,若直接在瀏覽器上面的網址列keyin第二個tab的#xxx時,
它並不會跳到指定的頁面,反而跳回第一頁去,但是若我的畫面是停在第二個tab時,然後, 在瀏覽器上面的網址列keyin第二個tab的#xxx時畫面就會跳到正確的位置上,請問我該怎麼處理這個狀況呢?謝謝!
這樣的話, 判斷 #xxx 的部份就要特別再處理才行, 可以的話, 弄一個簡單且有問題的範例寄給我試試~
喜欢你写的帖子,很详细,也很热心,留名感谢下,希望你有时间能做更多东西看下 - -