Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Смена темы сайта без мерцания (https://javascript.ru/forum/xhtml-html-css/53792-smena-temy-sajjta-bez-mercaniya.html)

FanAizu 18.02.2015 12:34

Смена темы сайта без мерцания
 
Скриптами я меняю значение href у тега link со стилями сайта. То есть меняю темы сайта безе перезагрузки сайта. Так вот, как только скрипт меняет href у link, то сайт становится без оформления, пока не загрузятся стили новой темы и не применятся браузером. Как избавиться от такого поведения?

ksa 18.02.2015 13:25

Цитата:

Сообщение от FanAizu
Как избавиться от такого поведения?

Например:
- грузить все стили разом
- применить некую предзагрузку
- использовать "спрайты"

danik.js 18.02.2015 22:10

Альтернативные таблицы стилей тут были бы очень кстати. Вот только поддержка хромает. С хромом совсем печально. Вот версия, рабочая как минимум в последних версиях IE, Firefox, Chrome:

<!DOCTYPE html>
<meta charset="utf-8" />
<link rel="stylesheet" title="Default" href="data:text/css,body%7Bbackground%3Ared%7D" />
<link rel="alternate stylesheet" title="Alternate" href="data:text/css,body%7Bbackground%3Ablue%7D" />
<script>
    function selectStyle(style) {
        var sheets = document.styleSheets;
        for (var i = 0; i < sheets.length; i++) {
            var sheet = sheets[i];
            var disabled = sheet.title !== style;
            sheet.ownerNode.disabled = !disabled; // webkit workaround
            sheet.ownerNode.disabled = sheet.disabled = disabled;
        }
    }
</script>
Test
<button onclick="selectStyle(textContent)">Default</button>
<button onclick="selectStyle(textContent)">Alternate</button>


Причем Firefox и IE предоставляют выбор темы прямо в меню браузера (появляется по Alt'у). Кроме того, IE восстанавливает последнюю выбранную тему после перезагрузки страницы.

В общем, считаю что это отлично подходит, вот только нужно протестировать в разных браузерах.

Вообще, вместо плясок с disabled мы должны использовать document.selectedStyleSheetSet = 'Имя темы'. Но это поддерживается только в Firefox. В хроме свойство есть, но оно не реагирует на запись.

2chan 18.02.2015 22:14

Попробуй загружать все link, а потом менять.
Смотри, есть стили:
<link rel="stylesheet" data-default-style type="text/css" href="css/style1.css" title="Style1">
<link rel="alternate stylesheet" type="text/css" href="css/style2.css" title="Style2">
<link rel="alternate stylesheet" type="text/css" href="css/style3.css" title="Style3">
<link rel="alternate stylesheet" type="text/css" href="css/style4.css" title="Style4">
<link rel="alternate stylesheet" type="text/css" href="css/style5.css" title="Style5">
<link rel="alternate stylesheet" type="text/css" href="css/style6.css" title="Style6">
<link rel="alternate stylesheet" type="text/css" href="css/style7.css" title="Style7">
<link rel="alternate stylesheet" type="text/css" href="css/style8.css" title="Style7">

.
По умолчанию будет запускаться тот, у которого в rel нет "alternate", насколько я помню.
Потом скриптами меняешь:

var userStyle = function(styleTitle) {
	var links = document.head.querySelectorAll('link[rel~="stylesheet"][title]');
	var found = false;
	for(var i=0; i<links.length; i++) {
		links[i].disabled = true;
		if(styleTitle == links[i].getAttribute('title')) { /* слышал, что IE глючит с title у link. Поэтому getAttribute */
			links[i].disabled = false;
			found = true; 
		}
	}
	if(!found) { /* не найдено → устанавливаем тот, что по умолчанию */
		document.head.querySelector('[data-style-default]').disabled = false;
	} 
};

У меня немного по-другому, ибо ООП, но должно работать.

danik.js 18.02.2015 22:25

Цитата:

Сообщение от 2chan
link[rel*="style"]

Есть ведь link[rel~="stylesheet"]. А вообще, не проще ли юзать document.styleSheets?

В хроме работает твой код?

2chan 18.02.2015 22:35

Цитата:

Сообщение от danik.js (Сообщение 357232)
link[rel~="stylesheet"]

Пожалуй, ты прав. Профиксил. Спасибо.


Часовой пояс GMT +3, время: 08:26.