隨着網站個性化體驗的要求不斷提高,無論移動和PC 端,都會有主題切換的功能;當然切換的樣式復雜度大小不同,從簡單的配色切換到復雜的配色布局切換;現總結幾種方案,可根據項目需求,實現復雜程度和效果體驗,選擇方案;
一、切換樣式表引用:
編寫兩套樣式 them1.css 、them2.css 通過js 動態切換 link 標簽的屬性,或追加目標主題樣式表、清除現有樣式表;Fixfox 瀏覽器可以通過瀏覽器切換 link 樣式表,但是IE 瀏覽器不支持,需要手動實現
優點:簡單、快捷、方便;
缺點:由於是切換引用css 文件,會由於網絡原因造成加載css 文件延遲、或由於javascript 錯誤阻塞造成切換失敗,不利於客戶體驗;
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>CSS主題切換</title> <link rel="stylesheet" type="text/css" href="a.css" title="a"> <link rel="alternate stylesheet" type="text/css" href="b.css" title="b"> <script> // 對切換主題的按鈕綁定事件,用來做觸發 document.getElementById("sheet-a").addEventListener("click",function(){ setStyleSheet("a"); }); document.getElementById("sheet-b").addEventListener("click",function(){ setStyleSheet("b"); }); /** * 查找所有的link標簽,找到符合條件的css進行切換 * @title:需要切換的css文件名稱,也可以是某值,主要是能夠找到所要切換的link標簽 **/ function setStyleSheet(title){ // 首先找到DOM中所有的link標簽 var link_list = document.getElementsByTagName("link"); if ( link_list ){ for ( var i=0;i<link_list.length;i++ ){ // 要找到所有link中rel屬性值包括style的,也就是包括stylesheet和alternate stylesheet; if ( link_list[i].getAttribute("rel").indexOf("style") != -1 ){ // 將符合條件的link的disabled的屬性設為true,都改為禁用; link_list[i].disabled = true; // 然后判斷link標簽中的title屬性,找到我們需要替換的css文件 // 找到后將該link的disabled改為啟用; if ( link_list[i].getAttribute("title") === title){ link_list[i].disabled = false; } } } } }; </script> </head> <body> <div class="main"> <div class="con"> <input type="button" id="sheet-a" value="主題a" /> <input type="button" id="sheet-b" value="主題b" /> </div> </div> </body </html>
二、通多 javaScript 操作Dom Class 屬性
該方式需要統一Class 的命名規則前綴or后綴,如按鈕 btn-them1、btn-them2,通過javascript 控制 class
優點:響應快速、沒有延遲;適用於單頁面應用和局部樣式切換
缺點:全局樣式切換 需要全局樣式添加標記、多頁面的話開發量相對較大,繁瑣,很難做到全站的CSS切換,只能局限在當前頁上。
三、通過服務器端腳本
Asp、 Php 、Jsp 都可實現