用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
xl5550的公告
文章分类
存档

转载  Javascript 标签页(TAB)浏览控件推介之:DOMTab 收藏

如何在越来越显得狭小的页面空间上显示更多内容?相信很多人立即想到的就是标签页(TAB),她允许在同一个地方显示多个内容。标签页有很多种制作方法,本文介绍的是 Christian Heilmann 写的 DOMTab。


--------------------------------------------------------------
点此浏览示例文件
--------------------------------------------------------------


Javascript:
  1.  
  2. /*
  3. DOMtab Version 3.1415927
  4. Updated March the First 2006
  5. written by Christian Heilmann
  6. check blog for updates: http://www.wait-till-i.com
  7. free to use, not free to resell
  8. */
  9.  
  10. domtab={
  11. tabClass:'domtab', // class to trigger tabbing
  12. listClass:'domtabs', // class of the menus
  13. activeClass:'active', // class of current link
  14. contentElements:'div', // elements to loop through
  15. backToLinks:/#top/, // pattern to check "back to top" links
  16. printID:'domtabprintview', // id of the print all link
  17. showAllLinkText:'show all content', // text for the print all link
  18. prevNextIndicator:'doprevnext', // class to trigger prev and next links
  19. prevNextClass:'prevnext', // class of the prev and next list
  20. prevLabel:'previous', // HTML content of the prev link
  21. nextLabel:'next', // HTML content of the next link
  22. prevClass:'prev', // class for the prev link
  23. nextClass:'next', // class for the next link
  24. init:function(){
  25. var temp;
  26. if(!document.getElementById || !document.createTextNode){return;}
  27. var tempelm=document.getElementsByTagName('div');
  28. for(var i=0;i<tempelm.length;i++){
  29. if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
  30. domtab.initTabMenu(tempelm[i]);
  31. domtab.removeBackLinks(tempelm[i]);
  32. if(domtab.cssjs('check',tempelm[i],domtab.prevNextIndicator)){
  33. domtab.addPrevNext(tempelm[i]);
  34. }
  35. domtab.checkURL();
  36. }
  37. if(document.getElementById(domtab.printID)
  38. && !document.getElementById(domtab.printID).getElementsByTagName('a')[0]){
  39. var newlink=document.createElement('a');
  40. newlink.setAttribute('href','#');
  41. domtab.addEvent(newlink,'click',domtab.showAll,false);
  42. newlink.onclick=function(){return false;} // safari hack
  43. newlink.appendChild(document.createTextNode(domtab.showAllLinkText));
  44. document.getElementById(domtab.printID).appendChild(newlink);
  45. }
  46. },
  47. checkURL:function(){
  48. var id;
  49. var loc=window.location.toString();
  50. loc=/#/.test(loc)?loc.match(/#(\w.+)/)[1]:'';
  51. if(loc==''){return;}
  52. var elm=document.getElementById(loc);
  53. if(!elm){return;}
  54. var parentMenu=elm.parentNode.parentNode.parentNode;
  55. parentMenu.currentSection=loc;
  56. parentMenu.getElementsByTagName(domtab.contentElements)[0].style.display='none';
  57. domtab.cssjs('remove',parentMenu.getElementsByTagName('a')[0].parentNode,domtab.activeClass);
  58. var links=parentMenu.getElementsByTagName('a');
  59. for(i=0;i<links.length;i++){
  60. if(!links[i].getAttribute('href')){continue;}
  61. if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
  62. id=links[i].href.match(/#(\w.+)/)[1];
  63. if(id==loc){
  64. var cur=links[i].parentNode.parentNode;
  65. domtab.cssjs('add',links[i].parentNode,domtab.activeClass);
  66. break;
  67. }
  68. }
  69. domtab.changeTab(elm,1);
  70. elm.focus();
  71. cur.currentLink=links[i];
  72. cur.currentSection=loc;
  73. },
  74. showAll:function(e){
  75. document.getElementById(domtab.printID).parentNode.removeChild(document.getElementById(domtab.printID));
  76. var tempelm=document.getElementsByTagName('div');
  77. for(var i=0;i<tempelm.length;i++){
  78. if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
  79. var sec=tempelm[i].getElementsByTagName(domtab.contentElements);
  80. for(var j=0;j<sec.length;j++){
  81. sec[j].style.display='block';
  82. }
  83. }
  84. var tempelm=document.getElementsByTagName('ul');
  85. for(i=0;i<tempelm.length;i++){
  86. if(!domtab.cssjs('check',tempelm[i],domtab.prevNextClass)){continue;}
  87. tempelm[i].parentNode.removeChild(tempelm[i]);
  88. i--;
  89. }
  90. domtab.cancelClick(e);
  91. },
  92. addPrevNext:function(menu){
  93. var temp;
  94. var sections=menu.getElementsByTagName(domtab.contentElements);
  95. for(var i=0;i<sections.length;i++){
  96. temp=domtab.createPrevNext();
  97. if(i==0){
  98. temp.removeChild(temp.getElementsByTagName('li')[0]);
  99. }
  100. if(i==sections.length-1){
  101. temp.removeChild(temp.getElementsByTagName('li')[1]);
  102. }
  103. temp.i=i; // h4xx0r!
  104. temp.menu=menu;
  105. sections[i].appendChild(temp);
  106. }
  107. },
  108. removeBackLinks:function(menu){
  109. var links=menu.getElementsByTagName('a');
  110. for(var i=0;i<links.length;i++){
  111. if(!domtab.backToLinks.test(links[i].href)){continue;}
  112. links[i].parentNode.removeChild(links[i]);
  113. i--;
  114. }
  115. },
  116. initTabMenu:function(menu){
  117. var id;
  118. var lists=menu.getElementsByTagName('ul');
  119. for(var i=0;i<lists.length;i++){
  120. if(domtab.cssjs('check',lists[i],domtab.listClass)){
  121. var thismenu=lists[i];
  122. break;
  123. }
  124. }
  125. if(!thismenu){return;}
  126. thismenu.currentSection='';
  127. thismenu.currentLink='';
  128. var links=thismenu.getElementsByTagName('a');
  129. for(i=0;i<links.length;i++){
  130. if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
  131. id=links[i].href.match(/#(\w.+)/)[1];
  132. if(document.getElementById(id)){
  133. domtab.addEvent(links[i],'click',domtab.showTab,false);
  134. links[i].onclick=function(){return false;} // safari hack
  135. domtab.changeTab(document.getElementById(id),0);
  136. }
  137. }
  138. id=links[0].href.match(/#(\w.+)/)[1];
  139. if(document.getElementById(id)){
  140. domtab.changeTab(document.getElementById(id),1);
  141. thismenu.currentSection=id;
  142. thismenu.currentLink=links[0];
  143. domtab.cssjs('add',links[0].parentNode,domtab.activeClass);
  144. }
  145. },
  146. createPrevNext:function(){
  147. // this would be so much easier with innerHTML, darn you standards fetish!
  148. var temp=document.createElement('ul');
  149. temp.className=domtab.prevNextClass;
  150. temp.appendChild(document.createElement('li'));
  151. temp.getElementsByTagName('li')[0].appendChild(document.createElement('a'));
  152. temp.getElementsByTagName('a')[0].setAttribute('href','#');
  153. temp.getElementsByTagName('a')[0].innerHTML=domtab.prevLabel;
  154. temp.getElementsByTagName('li')[0].className=domtab.prevClass;
  155. temp.appendChild(document.createElement('li'));
  156. temp.getElementsByTagName('li')[1].appendChild(document.createElement('a'));
  157. temp.getElementsByTagName('a')[1].setAttribute('href','#');
  158. temp.getElementsByTagName('a')[1].innerHTML=domtab.nextLabel;
  159. temp.getElementsByTagName('li')[1].className=domtab.nextClass;
  160. domtab.addEvent(temp.getElementsByTagName('a')[0],'click',domtab.navTabs,false);
  161. domtab.addEvent(temp.getElementsByTagName('a')[1],'click',domtab.navTabs,false);
  162. // safari fix
  163. temp.getElementsByTagName('a')[0].onclick=function(){return false;}
  164. temp.getElementsByTagName('a')[1].onclick=function(){return false;}
  165. return temp;
  166. },
  167. navTabs:function(e){
  168. var li=domtab.getTarget(e);
  169. var menu=li.parentNode.parentNode.menu;
  170. var count=li.parentNode.parentNode.i;
  171. var section=menu.getElementsByTagName(domtab.contentElements);
  172. var links=menu.getElementsByTagName('a');
  173. var othercount=(li.parentNode.className==domtab.prevClass)?count-1:count+1;
  174. section[count].style.display='none';
  175. domtab.cssjs('remove',links[count].parentNode,domtab.activeClass);
  176. section[othercount].style.display='block';
  177. domtab.cssjs('add',links[othercount].parentNode,domtab.activeClass);
  178. var parent=links[count].parentNode.parentNode;
  179. parent.currentLink=links[othercount];
  180. parent.currentSection=links[othercount].href.match(/#(\w.+)/)[1];
  181. domtab.cancelClick(e);
  182. },
  183. changeTab:function(elm,state){
  184. do{
  185. elm=elm.parentNode;
  186. } while(elm.nodeName.toLowerCase()!=domtab.contentElements)
  187. elm.style.display=state==0?'none':'block';
  188. },
  189. showTab:function(e){
  190. var o=domtab.getTarget(e);
  191. if(o.parentNode.parentNode.currentSection!=''){
  192. domtab.changeTab(document.getElementById(o.parentNode.parentNode.currentSection),0);
  193. domtab.cssjs('remove',o.parentNode.parentNode.currentLink.parentNode,domtab.activeClass);
  194. }
  195. var id=o.href.match(/#(\w.+)/)[1];
  196. o.parentNode.parentNode.currentSection=id;
  197. o.parentNode.parentNode.currentLink=o;
  198. domtab.cssjs('add',o.parentNode,domtab.activeClass);
  199. domtab.changeTab(document.getElementById(id),1);
  200. document.getElementById(id).focus();
  201. domtab.cancelClick(e);
  202. },
  203. /* helper methods */
  204. getTarget:function(e){
  205. var target = window.event ? window.event.srcElement : e ? e.target : null;
  206. if (!target){return false;}
  207. if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;}
  208. return target;
  209. },
  210. cancelClick:function(e){
  211. if (window.event){
  212. window.event.cancelBubble = true;
  213. window.event.returnValue = false;
  214. return;
  215. }
  216. if (e){
  217. e.stopPropagation();
  218. e.preventDefault();
  219. }
  220. },
  221. addEvent: function(elm, evType, fn, useCapture){
  222. if (elm.addEventListener)
  223. {
  224. elm.addEventListener(evType, fn, useCapture);
  225. return true;
  226. } else if (elm.attachEvent) {
  227. var r = elm.attachEvent('on' + evType, fn);
  228. return r;
  229. } else {
  230. elm['on' + evType] = fn;
  231. }
  232. },
  233. cssjs:function(a,o,c1,c2){
  234. switch (a){
  235. case 'swap':
  236. o.className=!domtab.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
  237. break;
  238. case 'add':
  239. if(!domtab.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
  240. break;
  241. case 'remove':
  242. var rep=o.className.match(' '+c1)?' '+c1:c1;
  243. o.className=o.className.replace(rep,'');
  244. break;
  245. case 'check':
  246. var found=false;
  247. var temparray=o.className.split(' ');
  248. for(var i=0;i<temparray.length;i++){
  249. if(temparray[i]==c1){found=true;}
  250. }
  251. return found;
  252. break;
  253. }
  254. }
  255. }
  256. domtab.addEvent(window, 'load', domtab.init, false);
  257.  



示例代码:
HTML:
  1.  
  2. <style type="text/css">
  3. <!--
  4. body {
  5. margin:0;
  6. padding:10px 5px;
  7. font-size:12px;
  8. font-family:verdana,arial,sans-serif,"宋体";
  9. }
  10. #warp {
  11. width:600px;
  12. margin:0 auto;
  13. }
  14. /* TAB样式 开始 */
  15. ul.domtabs {
  16. list-style: none;
  17. font-size: 0.9em;
  18. border-bottom: 1px solid #D55E12;
  19. margin: 0 0 20px 0;
  20. padding: 0 30px 2px 0;
  21. text-align: right;
  22. }
  23. ul.domtabs li {
  24. display: inline;
  25. margin: 0;
  26. }
  27. ul.domtabs a:link,
  28. ul.domtabs a:visited,
  29. ul.domtabs a:active,
  30. ul.domtabs a:hover {
  31. text-decoration: none;
  32. padding: 2px 5px 4px 5px;
  33. position: relative;
  34. bottom: 2px;
  35. color: #EA8544;
  36. }
  37. ul.domtabs li.active a:link,
  38. ul.domtabs li.active a:visited,
  39. ul.domtabs li.active a:active,
  40. ul.domtabs li.active a:hover {
  41. background:#fff;
  42. padding: 2px 10px 4px 10px;
  43. border: 1px solid #D55E12;
  44. border-bottom: 1px solid #fff;
  45. position: relative;
  46. bottom: 2px;
  47. color: #D55E12;
  48. font-weight:bold;
  49. }
  50. ul.domtabs a:hover {
  51. text-decoration: underline;
  52. color: #D55E12;
  53. }
  54. ul.domtabs li.active a:hover {
  55. text-decoration: none;
  56. }
  57. /* 前后跳转 */
  58. ul.prevnext {
  59. list-style-type: none;
  60. margin: 0;
  61. padding: .5em 0;
  62. border-top: 1px solid #D55E12;
  63. }
  64. ul.prevnext li a {
  65. display: block;
  66. width: 6em;
  67. color: #FFF;
  68. background-color: #D55E12;
  69. padding: 2px 0;
  70. text-align: center;
  71. text-decoration: none;
  72. font:12px bold "verdana";
  73. }
  74. ul.prevnext li a:hover {
  75. color: #FFF;
  76. background-color: #EA8544;
  77. }
  78. ul.prevnext .prev { float: left; }
  79. ul.prevnext .next { float: right; }
  80. h2.title {color:#D55E12;}
  81. -->
  82. </style>
  83.  
  84. <script type="text/javascript" src="js/domtab.js"></script>
  85.  
  86. <div id="warp">
  87.  
  88. <div class="domtab doprevnext">
  89.  
  90. <ul class="domtabs">
  91. <li><a href="#tab1">PHP/MySQL</a></li>
  92. <li><a href="#tab2">(X)HTML/CSS</a></li>
  93. <li><a href="#tab3">Javascript</a></li>
  94. <li><a href="#tab4">Ajax</a></li>
  95. </ul>
  96.  
  97. <h2 class="title">Codebit.cn - 聚合小段精华代码</h2>
  98.  
  99. <!-- TAB 1 -->
  100. <div>
  101.  
  102. <h2><a name="tab1" id="tab1">PHP</a></h2>
  103. <p>PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。 </p>
  104.  
  105. <h2><a name="mysql">MySQL</a></h2>
  106. <p>MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。</p>
  107.  
  108. <p><a href="#top">back to menu</a></p>
  109.  
  110. </div>
  111.  
  112. <!-- TAB 2 -->
  113. <div>
  114.  
  115. <h2><a name="tab2" id="tab2">(X)HTML</a></h2>
  116. <p>HTML语言是我们建立网页的工具,从它出现发展到现在,规范不断完善,功能越来越强。但是依然有缺陷和不足,人们仍在不断的改进它,使它更加便于控制和有弹性,以适应网络上日新月异的应用需求。2000年底,国际W3C(World Wide Web Consortium)组织公布发行了XHTML 1.0版本。</p>
  117.  
  118. <p>XHTML 1.0是一种在HTML 4.0基础上优化和改进的的新语言,目的是基于XML应用。XHTML是一种增强了的HTML,它的可扩展性和灵活性将适应未来网络应用更多的需求。</p>
  119.  
  120. <h2><a name="css">CSS</a></h2>
  121. <p>CSS 是 Cascading Style Sheet 的缩写。译作「层叠样式表单」。是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。</p>
  122.  
  123. <p><a href="#top">back to menu</a></p>
  124.  
  125. </div>
  126.  
  127. <!-- TAB 3 -->
  128. <div>
  129.  
  130. <h2><a name="tab3" id="tab3">Javascript</a></h2>
  131. <p>JavaScript 是一种新的描述语言,此一语言可以被嵌入 HTML 的文件之中。透过 JavaScript 可以做到回应使用者的需求事件 (如: form 的输入) 而不用任何的网路来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端 (server)处理,再传回来的过程,而直接可以被客户端 (client) 的应用程式所处理。</p>
  132.  
  133. <p><a href="#top">back to menu</a></p>
  134.  
  135. </div>
  136.  
  137. <!-- TAB 4 -->
  138. <div>
  139.  
  140. <h2><a name="tab4" id="tab4">Ajax</a></h2>
  141. <p>AJAX (Asynchronous JavaScript and XML, 异步 JavaScript 及 XML 技术) 是个新词,但内涵是两个存在已有一段时间的 JavaScript 功能。这两种功能以往一直被忽略,在 Gmail、Google suggest 及 Google Maps 出现后才一举成名天下知。</p>
  142.  
  143. <p>这两个 JavaScript 功能 是:
  144. <ul>
  145. <li>在不重新读取页面的情况下对伺服器送出要求(request)</li>
  146. <li>解析、使用 XML 文件</li>
  147. </ul>
  148. </p>
  149.  
  150. <p><a href="#top">back to menu</a></p>
  151.  
  152. </div>
  153.  
  154. </div>
  155.  
  156. </div>
  157.  



DOMTab 的页面样式完全由 css 控制,你可以通过在样式为 domtab 的 DIV 上添加一个 doprevnext 样式来生成前后跳转链接:

HTML:
  1.  
  2. <ul class="prevnext">
  3. <li class="prev"><a href="#">previous</a></li>
  4. <li class="next"><a href="#">next</a></li>
  5. </ul>
  6.  


官方网站:
http://onlinetools.org/tools/domtabdata/
 

发表于 @ 2007年08月07日 08:54:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:优秀的界面设计是如何诞生的

  • 发表评论
  • 评论内容:
  •  
Copyright © xl5550
Powered by CSDN Blog