Html标签页的实现说明及结合JS基于对象特性的实现对比
2012-02-13 14:12
507 查看
最近*海*原有系统需要进行改进,可能会将Flex改为Flex与jsp相结合的方式,好发挥两者的优势。这两天在做html页面,页面内容主要展现在标签页中,其基础效果图如下所示:
为增强用户对标签页的体验效果,增加鼠标滑过时标签背景色更滑,选中某个标签后该标签应与标签内容形成一体等功能效果。标签页的标签可以使用列表来实现,标签页内容部分使用DIV来划分,此处仅显示DIV左右下三边框,上边框使用ul的下边框展示,便于选中某个标签时,通过控制标签下边框的隐藏,将标签与标签内容形成一个整体。代码实现如下所示:
上述代码中标签内容使用了DIV,这样每个标签都会有一个DIV,只需要将标签内容填入对应DIV中即可。这样所有内容都写在了一个HTML页面中。我们还可以将每个标签页内容分别放到不同的HTML页面中,使用iFrame展示选中标签的内容:<iframe id="osptgt" width="100%" frameborder="0" src="content.html"></iframe>。之前使用JS控制某个DIV的显现与否,现在使用JS控制嵌入iFrame中的页面。
JavaScript是一种基于对象的语言,之所以不是面向对象的语言,最主要是因为它没有提供象抽象、继承、重载等有关面向对象语言的许多功能。但它却将一切内容都视为对象来处理。下面所展现的标签页的另一种实现更能体现这一点:将所有javaScript方法和属性封装在一个叫做NeoCard类中,将HTML标签视作对象,在初始化时对li标签进行注册鼠标事件。
两种实现方式没有本质上的区别,标签页内容是否聚合在同一个页面中是两者的主要区别。哪种设计方式更适合不能仅仅依靠设计原则,也要参考实际,界面只是初步,后续还要在页面上做开发。前者的设计在界面实现上更为简便些,后续的开发中在同一个页面使用Ajax等也可能带来较为简便的操作,不过界面的内容显得有些庞大。还需在实践中考验前者的想法。
为增强用户对标签页的体验效果,增加鼠标滑过时标签背景色更滑,选中某个标签后该标签应与标签内容形成一体等功能效果。标签页的标签可以使用列表来实现,标签页内容部分使用DIV来划分,此处仅显示DIV左右下三边框,上边框使用ul的下边框展示,便于选中某个标签时,通过控制标签下边框的隐藏,将标签与标签内容形成一个整体。代码实现如下所示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <style> ul{ border-bottom:1px solid #3366aa; padding:0 0 27px 0; margin:0; width:600px; margin-bottom:0; } li{ float:left; display:inline; list-style:none; margin:0 5px 0 0; line-height:26px; padding:0 16px; text-align:center; border:1px solid #cccccc; background-color:#CFE0F2; border-bottom:0; } .selected{ border:1px solid #3366aa; color:#34B4BD; border-bottom:1px solid #ffffff; background-color:#ffffff; } #acceptContent ,#processContent ,#associateWorkOrder ,#processCourse{ display:none; border:1px solid #3366aa; border-top:1px solid #ffffff; width:600px; height:300px; font-weight::bold; margin-top:0; } #requireContent{ display:block; border:1px solid #3366aa; border-top:1px solid #ffffff; width:600px; height:300px; font-weight::bold; margin-top:0; } </style> </head> <script> var obj; //记录选中标签,对其进行样式设置 //鼠标滑过时 function mouseOver(){ event.srcElement.style.color = '#ffffff'; event.srcElement.style.backgroundColor = '#006699'; } //鼠标滑出时 function mouseOut(){ event.srcElement.style.color = ""; event.srcElement.style.backgroundColor = ""; } //鼠标单击选中标签时 function onClick(showDiv){ //点击时标签样式 event.srcElement.style.color = "#34B4BD"; event.srcElement.style.backgroundColor = "#ffffff"; //设置选中标签的样式 if(obj != null){ obj.className=""; } obj = event.srcElement; obj.className = "selected"; //仅显示选中标签所对应内容 requireContent.style.display = "none"; acceptContent.style.display = "none"; processContent.style.display = "none"; associateWorkOrder.style.display = "none"; processCourse.style.display = "none"; showDiv.style.display = "block"; } </script> <body > <div> <div> </div> <div> <ul id="ospsrc" class="neocard"> <b><li onmouseover="mouseOver()" onmouseout="mouseOut()" onclick="onClick(requireContent)">标签1</li> </b> <b><li onmouseover="mouseOver()" onmouseout="mouseOut()" onclick="onClick(acceptContent)">标签2</li> </b> <b><li onmouseover="mouseOver()" onmouseout="mouseOut()" onclick="onClick(processContent)">标签3</li> </b> <b><li onmouseover="mouseOver()" onmouseout="mouseOut()" onclick="onClick(associateWorkOrder)">标签4</li> </b> <b><li onmouseover="mouseOver()" onmouseout="mouseOut()" onclick="onClick(processCourse)">标签5</li> </b> </ul> <div> <div id="requireContent" > <!--标签1模块--> <label>标签1</label> </div> <div id="acceptContent"> <!--标签2模块--> <label>标签2</label> </div> <div id="processContent"> <!--标签3模块--> <label>标签3</label> </div> <div id="associateWorkOrder"> <!--标签4模块--> <label>标签4</label> </div> <div id="processCourse"> <!--标签5模块--> <label>标签5</label> </div> </div> </div> </div> </body> </html>
上述代码中标签内容使用了DIV,这样每个标签都会有一个DIV,只需要将标签内容填入对应DIV中即可。这样所有内容都写在了一个HTML页面中。我们还可以将每个标签页内容分别放到不同的HTML页面中,使用iFrame展示选中标签的内容:<iframe id="osptgt" width="100%" frameborder="0" src="content.html"></iframe>。之前使用JS控制某个DIV的显现与否,现在使用JS控制嵌入iFrame中的页面。
JavaScript是一种基于对象的语言,之所以不是面向对象的语言,最主要是因为它没有提供象抽象、继承、重载等有关面向对象语言的许多功能。但它却将一切内容都视为对象来处理。下面所展现的标签页的另一种实现更能体现这一点:将所有javaScript方法和属性封装在一个叫做NeoCard类中,将HTML标签视作对象,在初始化时对li标签进行注册鼠标事件。
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"/> <title>页签</title> <style type="text/css"> ul.neocard{ border-bottom:1px solid #3366aa; padding:0 0 27px 0; margin:0; } ul.neocard li{ float:left; display:inline; list-style:none; margin:0 0 0 5px; line-height:26px; padding:0 16px; cursor:hand; text-align:center; border:1px solid #cccccc; background-color:#f4f4f4; border-bottom:0; } ul.neocard li.selected{ border:1px solid #3366aa; color:#e28822; border-bottom:1px solid #ffffff; background-color:#ffffff; cursor:text; } </style> <script type="text/javascript"> NeoCard={ init:function (osp,tgt,sci){ NeoCard.cs='selected'; var os=document.getElementById(osp).getElementsByTagName('li'); for(var i=0,il=os.length;i<il;i++){ os[i].attachEvent('onmouseover',NeoCard.omi); os[i].attachEvent('onmouseout',NeoCard.omo); os[i].attachEvent('onclick',NeoCard.ock); } NeoCard.fm=document.getElementById(tgt); var m=20;//怎么获得这个值 探索中... NeoCard.fm.height=document.body.clientHeight-NeoCard.ops(NeoCard.fm).y-m; NeoCard.oc=os[sci]; NeoCard.fm.src=NeoCard.oc.src; NeoCard.oc.className=NeoCard.cs; }, ops:function(o){ var ps={x:o.offsetLeft||0,y:o.offsetTop||0}; o=o.offsetParent; if(o){ var _ps=arguments.callee(o); ps.x+=_ps.x; ps.y+=_ps.y; } return ps; }, //onmouseover omi:function (){ var _om=event.srcElement; if(_om==NeoCard.oc)return; NeoCard.om=_om; var s=NeoCard.om.style; s.color='#ffffff'; s.backgroundColor='#006699'; }, //onmouseout omo:function (){ var s=NeoCard.om.style; s.color=''; s.backgroundColor=''; }, //onclick ock:function (){ var _oc=event.srcElement; if(NeoCard.oc==_oc)return; NeoCard.oc.className=''; NeoCard.oc=_oc; NeoCard.fm.src=NeoCard.oc.src; NeoCard.oc.className=NeoCard.cs; NeoCard.omo(); } } </script> </head> <body> <ul id="ospsrc" class="neocard"> <li src="about:blank">页签</li> <li src="about:blank">页签</li> <li src="about:blank">页签</li> <li src="about:blank">页签</li> <li src="about:blank">页签</li> </ul> <iframe id="osptgt" width="100%" frameborder="0" src=""></iframe> </body> <script type="text/javascript"> NeoCard.init('ospsrc','osptgt',2); </script> </html>
两种实现方式没有本质上的区别,标签页内容是否聚合在同一个页面中是两者的主要区别。哪种设计方式更适合不能仅仅依靠设计原则,也要参考实际,界面只是初步,后续还要在页面上做开发。前者的设计在界面实现上更为简便些,后续的开发中在同一个页面使用Ajax等也可能带来较为简便的操作,不过界面的内容显得有些庞大。还需在实践中考验前者的想法。
相关文章推荐
- JS基于对象的特性实现去除数组中重复项功能详解
- 结合Html/js/css实现超级链接访问JavaScript的事件!(实例)
- 基于casperjs和resemble.js实现一个像素对比服务详解
- JS-结合html综合练习js的对象——班级成绩表制作
- JS与HTML结合实现流程进度展示条思路详解
- 玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传
- paip.基于HTML gui界面的javascript JS实现SLEEP。。
- 基于AngularJS+HTML+Groovy实现登录功能
- 常用的两个小功能(html结合js实现除法,js实现早中晚问候)
- 调用博客paip.基于HTML gui界面的javascript JS实现SLEEP。。
- js jquery 实现html页面之间参数传递(单一参数、对象参数传递)
- JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
- JS与HTML结合使用marquee标签实现无缝滚动效果代码
- 基于casperjs、resemble.js实现一个像素对比服务
- js如何判断一个对象是array ,instanceof 是基于什么实现的呢?
- resumable.js —— 基于 HTML 5 File API 的文件上传组件 支持续传后台c#实现
- 基于对象的JavaScript实现无刷新页面发送和获取数据Ajax.js
- Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
- html结合js实现简单的树状目录