Запрет рендеринга страницы при вставке тега ссылки CSS в JS

Я хотел бы позволить моим пользователям выбирать между "светлой" темой (по умолчанию) и "темной" темой, которая обеспечивается добавлением другого файла CSS.

Вот код JavaScript. Как видите, я постарался предусмотреть дополнительные темы в будущем.

var themes = {
    "dark": "HTML/css/dark-theme.css"
};

var themeCssLink = document.createElement('link');
themeCssLink.setAttribute('rel', 'stylesheet');
document.getElementsByTagName('head')[0].appendChild(themeCssLink);

var theme = localStorage.getItem('theme');
if (!(theme in themes))
    theme = null;
if (theme !== null)
    themeCssLink.setAttribute('href', themes[theme])

Проблема в том, что страница отображается до того, как загружается темная тема CSS, вызывая яркую белую вспышку, которую я хотел бы знать, как ее предотвратить.

Еще одна вещь, которую я попробовал, заключалась в том, чтобы поместить в HTML элемент-пустышку:

<link href='' rel='stylesheet' type='text/css' id='theme-css'>

а затем просто изменив href в JavaScript:

var themeCssLink = document.getElementById('theme-css');
var theme = localStorage.getItem('theme');
if (!(theme in themes))
    theme = null;
if (theme !== null)
    themeCssLink.setAttribute('href', themes[theme]);

К сожалению, это имеет тот же эффект.

Как убедить браузер заблокировать рендеринг до тех пор, пока не будет загружен CSS-файл темы?

1 ответ

Просто поместите ваш JavaScript-скрипт перед вашим CSS, чтобы ваша тема загружалась до вашего основного CSS.

Если вы делаете это, вы должны быть осторожны с файлом main.css, чтобы он не перекрывал загруженную ранее тему css.

Другие вопросы по тегам