jQuery实现无刷新切换主题皮肤功能

news/2024/7/19 15:48:07 标签: js, jquery

主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验。本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能。

查看演示DEMO:https://www.helloweba.net/demo/style-switch/

实现该功能的原理就是通过点击定义的主题样式,改变页面当前引用的主题CSS文件,并且将当前的主题样式写入cookie中或者写入数据库中,以便下次该用户重新访问页面时,调用的就是上次设置好的主题样式。

准备主题皮肤样式

首先,我准备了三个样式表CSS文件,分别是三种风格的主题皮肤,将其引入页面,放置在页面的<head>之间。

<link title="default" rel="stylesheet" type="text/css" href="css/default.css" /> 
<link title="blue" rel="stylesheet" type="text/css" href="css/blue.css" disabled="disabled" /> 
<link title="brown" rel="stylesheet" type="text/css" href="css/brown.css" disabled="disabled" /> 

注意我给每个<link>添加了title属性,是由用处的,另外我禁用了第2个和第3个CSS文件,就是默认起作用的是第1个CSS文件。

XHTML

<ul id="styles"> 
    <li id="default">经典</li> 
    <li id="blue">淡蓝</li> 
    <li id="brown">棕色</li> 
</ul> 

三种主题风格用于点击切换,注意我分别给每个li加了id属性。

CSS

ul#styles{margin-top:10px} 
ul#styles li{float:left; width:50px; height:40px; line-height:40px; padding:2px;  
margin-left:10px; border:1px solid #fff; text-align:center; color:#fff; cursor:pointer} 
ul#styles li.cur{border:1px solid #369; background-image:url(images/selected.gif);  
background-repeat:no-repeat; background-position:4px 32px} 
ul#styles li#default{background-color:#162934;} 
ul#styles li#blue{background-color:#90c5e7} 
ul#styles li#brown{background-color:#601f00}

用CSS渲染XHTML,其中ul#styles li.cur是指当前主题选中下的样式,我用一个小勾表示当前选中的主题。

jQeury

首先我们要引入jquery库和jquery.cookie插件。jquery.cookie插件为jQuery提供了强大的cookie操作功能,你不用去写复杂的原生的javascript,只管直接调用该插件就行。关于该插件的使用,请阅读本站文章:使用jQuery操作Cookies

<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery.cookie.js"></script> 

接下来,当用户点击切换选择主题时,要发生以下动作:获取选择的主题(id),查看引用的CSS文件,如果发现其title属性值正好与当前选中的主题id值相等,则应用该主题CSS文件,同时将其他引用的CSS文件禁用,并且将当前选中的主题写入cookie中,设置cookie过期时间,最后将当前选中的主题按钮(li)设置为当前选中状态。具体看下面的代码:

$("#styles li").click(function(){ 
    var style = $(this).attr("id"); 
    $("link[title='"+style+"']").removeAttr("disabled"); 
    $("link[title!='"+style+"']").attr("disabled","disabled"); 
    $.cookie("mystyle",style,{expires:30}); 
    $(this).addClass("cur").siblings().removeClass("cur"); 
}); 

注意,在本例中我将选中的样式保存在用户cookie中,cookie名称为”mystyle“,值为当前选中的主题值,过去时间为30天,即:expires:30

接着需要做的是页面载入时,读取主题cookie值,如果主题cookie存在则调用cookie值对应的主题样式CSS文件,并且设置当前主题按钮状态为选中状态,反之,则调用默认样式。代码如下:

var cookie_style = $.cookie("mystyle"); 
if(cookie_style==null){ 
    $("link[title='default']").removeAttr("disabled"); 
    $("#styles li#default").addClass("cur"); 
}else{ 
    $("link[title='"+cookie_style+"']").removeAttr("disabled"); 
    $("#styles li[id='"+cookie_style+"']").addClass("cur"); 
    $("link[title!='"+cookie_style+"']").attr("disabled","disabled"); 
} 

将以上两段代码加入到$(function(){})中,工作到此完成,去看看效果吧。

值得一提的是,本文应用的cookie记录用户所选择设置的主题皮肤样式,但是当cookie到期或者用户清除了浏览器的COOKIE,亦或者用户换用其他浏览器浏览时,当前设置的主题就会失效。为了让用户永久保存选择的主题样式,必须将所选的主题与用户信息对应,并写入数据库,下次该用户登录就可以直接读取主题,当然,该方法应用在有用户权限范围的系统,如后台管理系统,个人中心等。

方法二:存到localStorage

<!DOCTYPE>
<html>
<head>
<title> new document </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.0/css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="red.css" rel="stylesheet" type="text/css" title="default" class="forSkin" disabled="disabled">
<link href="blue.css" rel="stylesheet" type="text/css" title="blue" class="forSkin" disabled="disabled">
<link href="green.css" rel="stylesheet" type="text/css" title="green" class="forSkin" disabled="disabled">
</head>

<body>
<div id="context">
        <div class="bs-example">
                <ul class="nav nav-pills" role="tablist">
                  <li role="presentation" class="dropdown">
                    <a id="drop5" href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                      Dropdown
                      <span class="caret"></span>
                    </a>
                    <ul id="menu3" class="dropdown-menu" aria-labelledby="drop5">
                      <li id="default"><a href="#">红色</a></li>
                      <li id="blue"><a href="#">蓝色</a></li>
                      <li id="green"><a href="#">绿色</a></li>
                    </ul>
                  </li>
                </ul> <!-- /pills -->
              </div>
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.0/js/bootstrap.js"></script>
<script>
$(function(){
    $("#menu3 li").click(function(){ 
        var style = $(this).attr("id");
        $(".forSkin").attr("disabled","disabled");
        $("link[title='"+style+"']").removeAttr("disabled"); 
        localStorage.setItem("myStyle", style);
    });

    var myStyle = window.localStorage.getItem("myStyle");

    console.log(myStyle);

    if(myStyle === "undefined" || myStyle == null){
        $(".forSkin").attr("disabled","disabled");
        $("link[title='default']").removeAttr("disabled"); 
    }else{
        $(".forSkin").attr("disabled","disabled");
        $("link[title='"+myStyle+"']").removeAttr("disabled");
    }
})    
</script>
</body>
</html>

 


http://www.niftyadmin.cn/n/887118.html

相关文章

linux启动时有两个选项,在linux启动的时候有一个up选项菜单

在linux启动的时候有一个up选项菜单(2011-09-01 05:24:45)标签&#xff1a;菜单杂谈在linux启动的时候有一个up选项菜单在linux启动的时候&#xff0c;有一个up和一个正常的选项菜单&#xff0c;请问&#xff0c;这两个选项&#xff0c;有什么区别啊。[quote]原帖由[i]doglovec…

Chrome表单自动填充如何取消(暂时可行的解决办法)

做项目时一直遇到一个问题&#xff0c;那就是用chrome测试的时候页面上的表单一直会自动填充&#xff0c;并且伴有黄色的背景颜色&#xff0c;有时候感觉很方便&#xff0c;有时候又很想去掉。 之前也多次寻找过方法&#xff0c;但是网上的方法都差不多&#xff0c;很多都是说…

C语言中如何把位赋值给字节,史上最全的C位域总结【转】

经过个人查阅相关的资料和理解,现对C语言的位域做一个总结,对于位域的定义我在这里没有多说,我这里主要是对位域有歧义的地方进行系统的总结.我个人觉得总结的比较完整,如有不够完整或有异义的地方大家可以留言指点.1.位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只…

四则混合运算c语言程序例,用c语言编程四则混合运算计算器

满意答案#include#include#includechar token[61]; /*存放表达式字符串的数组*/int n0;void error(void) /*报告错误函数*/{printf("ERROR!\n");exit(1);}void match(char expected) /*检查字符匹配的函数*/{if(token[n]expected)token[n]getchar();else error();}do…

博诺杯工业机器人比赛2019_涿职·喜报丨涿州职教中心电气自动化专业部学生喜获“博诺杯”工业机器人维修调试与技术应用赛项二、三等奖...

原标题&#xff1a;涿职喜报丨涿州职教中心电气自动化专业部学生喜获“博诺杯”工业机器人维修调试与技术应用赛项二、三等奖涿职喜报2019年11月22日至25日&#xff0c;2019年度机械行业职业教育技能大赛“博诺杯”工业机器人维修调试与技术应用赛项在美丽的山城重庆举行。在比…

Promise的简单用法

众所周知的&#xff0c;Javascript是一种单线程的语言&#xff0c;所有的代码必须按照所谓的“自上而下”的顺序来执行。本特性带来的问题就是&#xff0c;一些将来的、未知的操作&#xff0c;必须异步实现。本文将讨论一个比较常见的异步解决方案——Promise&#xff0c;时至本…

conda python数据分析_Python数据分析入门

anaconda使用常用命令更新包&#xff1a;conda upgrade –all列出已安装包&#xff1a;conda list安装包&#xff1a;conda install package(version)删除包&#xff1a;conda remove package搜索包名&#xff1a;conda search xxx这些命令在cmd中&#xff0c;就可以直接使用&a…

区块链技术用解决拜占庭将军问题_区块链技术如何解决拜占庭将军问题?

如果10个将军中的几个同时发起消息&#xff0c;势必会造成系统的混乱&#xff0c;造成各说各的攻击时间方案&#xff0c;行动难以一致。谁都可以发起进攻的信息&#xff0c;但由谁来发出呢?中本聪巧妙地在个系统加入了发送信息的成本&#xff0c;即&#xff1a;一段时间内只有…