Переключение стилей css с помощью jquery

На одном из проектов (да на том самом osinform.ru) возникли споры по выбору стиля внешнего вида (ну темный или светлый) … помучившись немного (дней так 10) с шаблоном я все же решился сделать 2 шаблона, но потом как представил … очередные шаблоны, лишняя нагрузка и так далее … ну и в итоге решил сделать просто 2 css стиля …

Нашел я один java скрипт у себя на компе, но он у меня так и не завелся (ну из за подключенной jquery). Ну в итоге проведя ритуал в google нашел неплохое решение …
Кстати при выборе картинки для этой статьи я нашел некую картинку с текстом «Переключение между файлами стилей CSS для DataLife Engine». Не понимаю, почему только для DLE ?! … В общем затер эти надписи, так что автор данной картинки — не обижайся …

Ладно перейдем к делу … Нам нужно сделать ссылки которые будут переключать стили и смогут работать с Cookies!
Для начала заготовим несколько стилей для нашего сайта. Пусть их будет 3 …
Для элементов присвоим id=»init», ну и сам стиль «по  умолчанию» подключаем на прямую в head:

 <link type="text/css" rel="stylesheet" media="screen" title="style-default" href="style-default.css" />

Главное не потерять атрибут title в элементе , иначе ничего не заработает.

Теперь подключим другие стили с помощью функций jquery:

<!-- Переключение css - подключаем стили -->
<script type="text/javascript">
$(document).ready(function() {
var inject = $('#init');
var skinsPath = '/tenplates/lite/css/'; //путь к директории со стилями
inject.append(
'<link type="text/css" rel="stylesheet" media="screen" title="style-1" href="'+ skinsPath+'style-1.css" />' +
'<link type="text/css" rel="stylesheet" media="screen" title="style-2" href="'+ skinsPath+'style-2.css" />' +
'<link type="text/css" rel="stylesheet" media="screen" title="style-3" href="'+ skinsPath+'style-3.css" />' +
);
});
</script>

Теперь добавим функцию jQuery переключения CSS стилей:

/* Switch Styles*/
$(function($) {
$(document).ready(function() {
$('.styleswitch').click(function() {
$("#header").fadeOut(700);
switchStylestyle(this.getAttribute("rel"));
$("#header").fadeIn(900);
return false;
});
var c = readCookie('style');
if (c) switchStylestyle(c);
});
function switchStylestyle(styleName) {
$('link[rel*=style][title]').each(function(i) {
this.disabled = true;
if (this.getAttribute('title') == styleName) this.disabled = false;
});
createCookie('style', styleName, 365);
}
})(jQuery);

/* cookie style core */
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
} else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}

function eraseCookie(name) {
createCookie(name,"",-1);
}

Автор данного способа добавил анимацию fadeIn и fadeOut для региона header в моём шаблоне. Это сглаживает прогрузку фонового изображения и делает переключение более плавным. Можете вписать туда body, если изменяющихся участков много.

Теперь добавим сами переключатели:

<!--noindex-->
<a href="#" rel="style-default" class="styleswitch s2">Белая версия</a> |
<a href="#" rel="style-1" class="styleswitch s1">Темная версия</a> |
<a href="#" rel="style-2" class="styleswitch s3">Красная версия</a> |
<a href="#" rel="style-3" class="styleswitch s4">Зеленая версия</a>
<!--/noindex-->

Класс styleswitch используется для установки события click, атрибут rel должен содержать имя стиля синхронизируемое с title в . Ссылки можно обвернуть списком или вовсе сделать кнопками и запилить для них CSS по вкусу. Я также завернул их в noindex, чтобы не индексировать несемантичную функциональность.

Проверенно на всем что есть кроме IE (у меня линь :) …)