请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 30371|回复: 31

[教程] 《CSS标准设计》系列之 CSS样式切换技巧 [复制链接]

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2005-1-3 15:49:00 |显示全部楼层
CSS样式切换技巧

样式与数据分离所带来的不只是符合标准这样的简单,样式既然与数据分离那么样式的切换则变得理所当然的了!但是网上这样的中文教程实在是太少了!所以我收集了一部分中外网站已经实现的技术资料整理出来供网友参考。

首先要具备不同内容的CSS文件(最好每个文件代表一种样式,或是代表需要作出变动的部分)。这里以三个为例:

第一个是背景为红色的CSS文件(red.css)CSS中的内容为:

body {background-color:red;}

第二个是背景为绿色的CSS文件(green.css)CSS中的内容为:
body {background-color:green;}

第三个是背景为黄色的CSS文件(yellow.css)CSS中的内容为:
body {background-color:yellow;}


然后在xthml文件中加入这三个CSS的链接

<link rel="alternate stylesheet" href="red.css" type="text/css" title="red" media="screen, projection"/>
<link rel="stylesheet" href="green.css" type="text/css" title="green" media="screen, projection"/>
<link rel="alternate stylesheet" href="yellow.css" type="text/css" title="yellow" media="screen, projection"/>

这三个中除了title不一样外还有一个地方有所不同,那就是REL。第一个与第三个都是alternate stylesheet只有第二个是stylesheet。这第二个就是当然样式。

在链接下面再导入一个JS文件,用来控制这个样式切换
  1. function setActiveStyleSheet(title) {
  2.   var i, a, main;
  3.   if (title) {
  4.   for(i=0; (a = document.getElementsByTagName('link')[i]); i++) {
  5.   if(a.getAttribute('rel').indexOf('style') != -1 && a.getAttribute('title')) {
  6.   a.disabled = true;
  7.   if(a.getAttribute('title') == title) a.disabled = false;
  8.   }
  9.   }
  10.   }
  11.   }
  12.   function getActiveStyleSheet() {
  13.   var i, a;
  14.   for(i=0; (a = document.getElementsByTagName('link')[i]); i++) {
  15.   if(a.getAttribute('rel').indexOf('style') != -1 && a.getAttribute('title') && !a.disabled) return a.getAttribute('title');
  16.   }
  17.   return null;
  18. }
复制代码


在合适的地方加入三个切换按钮

<a href="javascript :void()" onclick="setActiveStyleSheet('red'); return false;" title="红色样式"></a>
<a href="javascript :void()" onclick="setActiveStyleSheet('green'); return false;" title="绿色样式"></a>
<a href="javascript :void()" onclick="setActiveStyleSheet('yellow'); return false;" title="黄色样式"></a>
<a href="javascript :void()" onclick="setActiveStyleSheet('none'); return false;" title="没有样式"></a>


好了发布试试点那三个切换链接!是不是已经切换了样式?




补遗:带有记忆功能的JS文档
  1. function setActiveStyleSheet(title) {

  2. var i, a, main;

  3. for(i=0; (a = document.getElementsByTagName

  4. ("link")[i]); i++) {

  5. if(a.getAttribute("rel").indexOf("style")

  6. != -1 && a.getAttribute("title")) {

  7. a.disabled = true;

  8. if(a.getAttribute("title") == title)

  9. a.disabled = false;

  10. }

  11. }

  12. }

  13. function getActiveStyleSheet() {
  14. var i, a;
  15. for(i=0; (a = document.getElementsByTagName
  16. ("link")[i]); i++) {
  17. if(a.getAttribute("rel").indexOf("style")
  18. != -1 && a.getAttribute("title") && !a.disabled)
  19. return a.getAttribute("title");
  20. }
  21. return null;
  22. }

  23. function getPreferredStyleSheet() {
  24. var i, a;
  25. for(i=0; (a = document.getElementsByTagName
  26. ("link")[i]); i++) {
  27. if(a.getAttribute("rel").indexOf("style") != -1
  28. && a.getAttribute("rel").indexOf("alt") == -1
  29. && a.getAttribute("title")
  30. ) return a.getAttribute("title");
  31. }
  32. return null;
  33. }

  34. function createCookie(name,value,days) {
  35. if (days) {
  36. var date = new Date();
  37. date.setTime(date.getTime()+(days*24*60*60*1000));
  38. var expires = "; expires="+date.toGMTString();
  39. }
  40. else expires = "";
  41. document.cookie = name+"="+value+expires+";
  42. path=/";
  43. }

  44. function readCookie(name) {
  45. var nameEQ = name + "=";
  46. var ca = document.cookie.split(';');
  47. for(var i=0;i < ca.length;i++) {
  48. var c = ca[i];
  49. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  50. if (c.indexOf(nameEQ) == 0) return
  51. c.substring(nameEQ.length,c.length);
  52. }
  53. return null;
  54. }

  55. window.onload = function(e) {
  56. var cookie = readCookie("style");
  57. var title = cookie ? cookie :
  58. getPreferredStyleSheet();
  59. setActiveStyleSheet(title);
  60. }

  61. window.onunload = function(e) {
  62. var title = getActiveStyleSheet();
  63. createCookie("style", title, 365);
  64. }

  65. var cookie = readCookie("style");
  66. var title = cookie ? cookie :
  67. getPreferredStyleSheet();
  68. setActiveStyleSheet(title);
复制代码




Andy JOIN   

原文:
http://www.lifeinbox.com/blog/more.asp?name=join&id=359
已有 1 人评分威望 收起 理由
经典论坛大妈 + 3 历史打分

总评分: 威望 + 3   查看全部评分

西部数码顶级域名注册商39元抢注!
帖子
122
体力
46
威望
0
发表于 2005-1-4 01:33:00 |显示全部楼层
很不错

但是这样连接的话是不是三个样式表都已经下载了呢?如果叶面比较大,而且用户不准备切换样式表,那其余的样式表下载不久浪费了带宽么。

个人认为,比较好的样式表切换还是得用网站程序来做,比如asp、php,可以把用户最后选定的样式表保存在用户电脑的cookie中。这样用户下次访问时就还是上次的样式表了。而且不用一次连接多个样式表浪费带宽,不是么?

蓝色理想以前主页上有一个“我的配色”,虽然似乎不是通过更改样式表实现的,但是我觉得原理就应该是这样做的了。

当然楼主的程序对于小型一些的站点还是非常有用的了。
我的Blog,欢迎大家做客
www.mltr.cn/scyui/
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

garu 
帖子
1483
体力
3162
威望
0
发表于 2005-1-4 09:12:00 |显示全部楼层
好文章~

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2005-1-4 09:50:00 |显示全部楼层
yuioocom在上个帖子中说
很不错

但是这样连接的话是不是三个样式表都已经下载了呢?如果叶面比较大,而且用户不准备切换样式表,那其余的样式表下载不久浪费了带宽么。

个人认为,比较好的样式表切换还是得用网站程序来做,比如asp、php,可以把用户最后选定的样式表保存在用户电脑的cookie中。这样用户下次访问时就还是上次的样式表了。而且不用一次连接多个样式表浪费带宽,不是么?

蓝色理想以前主页上有一个“我的配色”,虽然似乎不是通过更改样式表实现的,但是我觉得原理就应该是这样做的了。

当然楼主的程序对于小型一些的站点还是非常有用的了。



你讲得没错!这个JS文件的确不支持样式记忆功能!但是对于一部分没有后台程序网页还是比较方便的,这个部分可以变形为字体大小变化,这样可以方便 一部分视力不好的人看网页内容。

还有,这个方式只会加载一个样式其它样式是在点击后加载进来的!所以不用担心这个会加大文件量!

使用道具 举报

帖子
3750
体力
2580
威望
5
发表于 2005-1-4 10:04:00 |显示全部楼层
为什么不使用外部传值来加载CSS?

例如 XXX.htm?css=green
Whip out the dissonance

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2005-1-4 10:21:00 |显示全部楼层
不含ppa在上个帖子中说
为什么不使用外部传值来加载CSS?

例如 XXX.htm?css=green


因为我们没有ASP这样的程序来支持!

使用道具 举报

帖子
3750
体力
2580
威望
5
发表于 2005-1-4 11:13:00 |显示全部楼层
小毅在上个帖子中说
不含ppa在上个帖子中说
[quote] 为什么不使用外部传值来加载CSS?

例如 XXX.htm?css=green


因为我们没有ASP这样的程序来支持! [/quote]
我的意思是说,JS接收外部传值,这样的话,根据传的值来判断加载哪一个CSS,这样,就不需要把所有CSS载入
Whip out the dissonance

使用道具 举报

帖子
1419
体力
7429
威望
0
发表于 2005-1-4 13:53:00 |显示全部楼层
收藏了,研究一下,不错的贴子
没有最好,只有更好!

使用道具 举报

帖子
34
体力
54
威望
0
发表于 2005-1-4 16:31:00 |显示全部楼层
yuioocom在上个帖子中说
很不错

但是这样连接的话是不是三个样式表都已经下载了呢?如果叶面比较大,而且用户不准备切换样式表,那其余的样式表下载不久浪费了带宽么。

个人认为,比较好的样式表切换还是得用网站程序来做,比如asp、php,可以把用户最后选定的样式表保存在用户电脑的cookie中。这样用户下次访问时就还是上次的样式表了。而且不用一次连接多个样式表浪费带宽,不是么?

蓝色理想以前主页上有一个“我的配色”,虽然似乎不是通过更改样式表实现的,但是我觉得原理就应该是这样做的了。

当然楼主的程序对于小型一些的站点还是非常有用的了。


这个建议非常的不错~~在用户第二次登陆你的网站的时候做一些判断,如果他的机器上次用了某个css文件.那么这次就还用这个...恩恩~~不错.

使用道具 举报

淡獭 
帖子
16
体力
4
威望
1
发表于 2005-1-5 23:54:00 |显示全部楼层
小毅在上个帖子中说
不含ppa在上个帖子中说
[quote] 为什么不使用外部传值来加载CSS?

例如 XXX.htm?css=green


因为我们没有ASP这样的程序来支持! [/quote]

http://vivi.cgshow.com/
就是传值``虽然简单了点``` ;)
《涅磐经》第十九卷:“八大地狱之最,称为无间地狱,为无间断遭受大苦之意,故有此名”【无间】“万恶之地,在无间行走的人,必具非常潜能!”

使用道具 举报

淡獭 
帖子
16
体力
4
威望
1
发表于 2005-1-6 00:06:00 |显示全部楼层
以下是源代码:
  1. <%
  2. css = Request("css")
  3. if css = "" then css = "index.css"
  4. %>

  5. <style type="text/css" title="currentStyle">
  6.         @import "css/public.css";
  7.         @import "css/<%=css%>";
  8. </style>


  9. <div id="quickNav">
  10.         <h3><a href="index.asp" title="首页" class="n1"><span>INDEX</span></a></h3>
  11.         <h3><a href="index.asp?css=work.css" title="工作" class="n2"><span>WORK</span></a></h3>
  12.         <h3><a href="index.asp?css=services.css" title="服务" class="n3"><span>SERVICES</span></a></h3>
  13.         <h3><a href="index.asp?css=contact.css" title="联系" class="n4"><span>CONTACT</span></a></h3>
  14. </div>
复制代码
《涅磐经》第十九卷:“八大地狱之最,称为无间地狱,为无间断遭受大苦之意,故有此名”【无间】“万恶之地,在无间行走的人,必具非常潜能!”

使用道具 举报

帖子
1
体力
14
威望
0
发表于 2005-1-12 06:09:00 |显示全部楼层
收获很大哦

使用道具 举报

帖子
11
体力
5
威望
0
发表于 2005-1-12 19:56:00 |显示全部楼层
大家看看Mozilla Thunderbird的帮助主页
http://texturizer.net/thunderbird/


  1. <link rel="stylesheet" type="text/css" media="screen,projection" href="../mozilla.org/css/style.css" />
  2. <link rel="stylesheet" type="text/css" href="http://texturizer.net/mozilla.org/css/print.css" media="print" />
  3. <link rel="alternate stylesheet" title="Locked Menu" media="screen,projection" href="../mozilla.org/css/lockedmenu.css" type="text/css" />

  4. <link rel="alternate stylesheet" title="Classic" media="screen,projection" href="../mozilla.org/css/classic.css" type="text/css" />
  5. <link rel="alternate stylesheet" title="Classic with Locked Menu" media="screen,projection" href="../mozilla.org/css/classic-lockedmenu.css" type="text/css" />
  6. <script src="../mozilla.org/javascript/styleswitcher.js" type="text/javascript"></script>
复制代码


styleswitcher.js内容
  1. // help function to get the site id

  2. function getID() {

  3.         var id = document.location.pathname;

  4.         var i=0;

  5.         for(i=id.length - 1; i>0; i--) {

  6.                 if(id[i]=='/')

  7.                         break;

  8.         }

  9.         //alert(id);

  10.         id = replace(id.substring(0,i+1),"extensions/","");

  11.         id = replace(id, "themes/", "");

  12.         id = replace(id, "downloads/", "");

  13.         return "style-" + id;

  14. }



  15. function replace(string,text,by) {

  16. // Replaces text with by in string

  17.     var strLength = string.length, txtLength = text.length;

  18.     if ((strLength == 0) || (txtLength == 0)) return string;



  19.     var i = string.indexOf(text);

  20.     if ((!i) && (text != string.substring(0,txtLength))) return string;

  21.     if (i == -1) return string;



  22.     var newstr = string.substring(0,i) + by;



  23.     if (i+txtLength < strLength)

  24.         newstr += replace(string.substring(i+txtLength,strLength),text,by);



  25.     return newstr;

  26. }





  27. function setActiveStyleSheet(title) {

  28.   var i, a, main;

  29.   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {

  30.     if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {

  31.       a.disabled = true;

  32.       if(a.getAttribute("title") == title) {

  33.               a.disabled = false;

  34.               a.disabled = true;

  35.               a.disabled = false;

  36.       }

  37.     }

  38.   }

  39. }



  40. function getActiveStyleSheet() {

  41.   var i, a;

  42.   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {

  43.     if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");

  44.   }

  45.   return null;

  46. }



  47. function getPreferredStyleSheet() {

  48.   var i, a;

  49.   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {

  50.     if(a.getAttribute("rel").indexOf("style") != -1

  51.        && a.getAttribute("rel").indexOf("alt") == -1

  52.        && a.getAttribute("title")

  53.        ) return a.getAttribute("title");

  54.   }

  55.   return null;

  56. }



  57. function createCookie(name,value,days) {

  58.   if (days) {

  59.     var date = new Date();

  60.     date.setTime(date.getTime()+(days*24*60*60*1000));

  61.     var expires = "; expires="+date.toGMTString();

  62.   }

  63.   else expires = "";

  64.   document.cookie = name+"="+value+expires+"; path=/";

  65. }



  66. function readCookie(name) {

  67.   var nameEQ = name + "=";

  68.   var ca = document.cookie.split(';');

  69.   for(var i=0;i < ca.length;i++) {

  70.     var c = ca[i];

  71.     while (c.charAt(0)==' ') c = c.substring(1,c.length);

  72.     if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);

  73.   }

  74.   return null;

  75. }



  76. window.onload = function(e) {

  77.   var cookie = readCookie(siteid);

  78.   var title = cookie ? cookie : getPreferredStyleSheet();

  79.   setActiveStyleSheet(title);

  80. }



  81. window.onunload = function(e) {

  82.   var title = getActiveStyleSheet();

  83.   createCookie(siteid, title, 365);

  84. }



  85. var cookie = readCookie(siteid);

  86. var title = cookie ? cookie : getPreferredStyleSheet();

  87. var siteid = getID();

  88. setActiveStyleSheet(title);
复制代码

使用道具 举报

帖子
11
体力
13
威望
0
发表于 2005-1-14 10:16:00 |显示全部楼层
听说用dom实现会很简单,不知道那位大侠会。

使用道具 举报

帖子
3252
体力
6788
威望
7
发表于 2005-1-14 14:36:00 |显示全部楼层
<link href="sty1.css" rel="stylesheet" type="text/css">
<script>
function changecss(i)
{
document.styleSheets(0).href = "sty"+i+".css";
}
</script>

使用道具 举报

帖子
27
体力
35
威望
0
发表于 2005-8-2 15:54:00 |显示全部楼层
马上就要用到这个,没想到还是比较麻烦的。

谢谢

使用道具 举报

eLore 
帖子
224
体力
673
威望
2
居住地
广东省 惠州市
发表于 2005-8-8 11:55:00 |显示全部楼层
确实不错
网络如此多娇 引无数小鸟竟折腰

使用道具 举报

base5 
帖子
61
体力
207
威望
0
发表于 2005-10-11 11:19:00 |显示全部楼层
html?
传值其实不用asp/jsp/php支持的

用js得到document.location.url
然后分析得到的url,就可以得到传进来的值了。

使用道具 举报

帖子
160
体力
442
威望
1
发表于 2005-10-11 13:58:00 |显示全部楼层
很不错文章,谢谢小毅。^_^
但加了记忆功能的JS代码后怎么链接显示为javascript :void()???
Design from the heart.

使用道具 举报

布鲁斯狼

荣誉管理

帖子
8064
体力
21540
威望
153
居住地
江苏省 扬州市
发表于 2005-10-13 08:48:00 |显示全部楼层
要有记忆,就需要使用到Cookie,将当前浏览者设置的样式生成Cookie文件保存在客户机器上,下次访问判断即可

http://cnbruce.com/test/css/

查看源代码即可知,不过不是标准页

使用道具 举报

zhting 
帖子
19
体力
61
威望
0
发表于 2005-10-26 16:51:00 |显示全部楼层
cnbruce在上个帖子中说
要有记忆,就需要使用到Cookie,将当前浏览者设置的样式生成Cookie文件保存在客户机器上,下次访问判断即可

http://cnbruce.com/test/css/

查看源代码即可知,不过不是标准页


还是这个方法简单实用,现在还有没有其他更好的方法了?

使用道具 举报

帖子
2
体力
5
威望
0
发表于 2006-3-7 17:31:00 |显示全部楼层
要是字体大小也能改变就好了,能够照顾到不同的群体浏览网页!
有谁知道怎么写吗?
选择了计算机,就选择了终身学习!

使用道具 举报

帖子
10
体力
26
威望
0
发表于 2006-3-8 08:39:00 |显示全部楼层
很经典,收藏。

使用道具 举报

yibote 
帖子
440
体力
682
威望
0
发表于 2006-3-8 11:59:00 |显示全部楼层
小毅在上个帖子中说
yuioocom在上个帖子中说
[quote] 很不错

但是这样连接的话是不是三个样式表都已经下载了呢?如果叶面比较大,而且用户不准备切换样式表,那其余的样式表下载不久浪费了带宽么。

个人认为,比较好的样式表切换还是得用网站程序来做,比如asp、php,可以把用户最后选定的样式表保存在用户电脑的cookie中。这样用户下次访问时就还是上次的样式表了。而且不用一次连接多个样式表浪费带宽,不是么?

蓝色理想以前主页上有一个“我的配色”,虽然似乎不是通过更改样式表实现的,但是我觉得原理就应该是这样做的了。

当然楼主的程序对于小型一些的站点还是非常有用的了。



你讲得没错!这个JS文件的确不支持样式记忆功能!但是对于一部分没有后台程序网页还是比较方便的,这个部分可以变形为字体大小变化,这样可以方便 一部分视力不好的人看网页内容。

还有,这个方式只会加载一个样式其它样式是在点击后加载进来的!所以不用担心这个会加大文件量! [/quote]
怀疑
  1. 这个方式只会加载一个样式其它样式是在点击后加载进来的!
复制代码
这句话,按照个人理解,应该是都要加载完了,这个页面才算加载完毕.
但愿我不再浮躁,每天进步一点点-------- [易博特]精彩世界
YIBOTE.COM


http://y

使用道具 举报

客家山哥

银牌会员

帖子
3633
体力
2708
威望
0
居住地
广东省 深圳市
发表于 2006-11-8 10:28:39 |显示全部楼层
要是在更换CSS同时能更换页面上的图片的话,那就好了
http://www.yczhang.com/work/skills/
像我这个,一直在寻找解决的方法,目前能在更换CSS的同时也更换了skin的图片目录,但是此方法在FF和IE7下不起作用,可以说是废物一个,而且也不记录cookie,请教哪位大虾能有更好的方法

使用道具 举报

AILY的小锤子

银牌会员

帖子
267
体力
1050
威望
0
发表于 2006-11-22 11:12:35 |显示全部楼层
恩,不错啊
为结婚奋斗中。。。

使用道具 举报

帖子
120
体力
440
威望
0
发表于 2007-2-8 13:39:12 |显示全部楼层
那我的网站皮肤是有多个样式表,怎么样同时切换所有的样式呢?

使用道具 举报

帖子
126
体力
140
威望
0
发表于 2008-9-3 23:55:31 |显示全部楼层
disabled

是不是让某元素不能显示啊
www.koowo.org.cn酷我

使用道具 举报

帖子
43
体力
141
威望
0
发表于 2008-9-5 00:08:36 |显示全部楼层
http://zhoushiya.cn
我的站刚加上了换肤功能
PS:佩服楼上,把三年前的贴翻出来

使用道具 举报

帖子
68
体力
313
威望
0
发表于 2008-9-5 16:36:47 |显示全部楼层
楼上的做个链接,www.nbhoho.com
www.NbHoHo.com

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 09:34 , Processed in 0.238703 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部