Как я могу обновить класс элемента до загрузки веб-сайта (до onMount)?

Я добавил темный режим на свой сайт Svelte + Tailwind. Я сделал это, сначала проверив предпочтительную тему пользователя (системную по умолчанию), а также добавил кнопку, позволяющую изменить ее в любое время. По сути, я просто обновляю локальное хранилище, чтобы хранить либо темное, либо светлое, а затем добавляю или удаляю класс «темный» из корневого элемента html. Однако я столкнулся с проблемой: я добавляю или удаляю «темный» класс onMount, что означает, что светлая тема по умолчанию мигает на секунду (ослепляя любого в радиусе 10 км), прежде чем она сменится на темную тему.

Связанный код (взят непосредственно из руководства по темному режиму Tailwind):

onMount(() => {
    if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
        document.documentElement.classList.add('dark');
        localStorage.theme = 'dark';
    } else {
        document.documentElement.classList.remove('dark');
        localStorage.theme = 'light';
    }
});

Мои вопросы):

Есть ли способ запустить функцию, которая проверяет localStorage и применяет «темный» класс перед отображением исходного веб-сайта?

Если нет способа сделать то, что я пытаюсь сделать, есть ли другой способ сразу реализовать темы с правильным рендерингом страницы?

Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
REACT и NEXT JS вместе с Tailwind CSS
REACT и NEXT JS вместе с Tailwind CSS
Наличие собственного или персонального сайта необходимо в современном мире, а сочетание React и Next JS позволяет разработчику сделать это за меньшее...
Современные подходы к организации и работе с CSS в проекте
Современные подходы к организации и работе с CSS в проекте
Любой, кто писал CSS в течение некоторого времени, знает о сложностях, которые с этим связаны, и о том, насколько это может быть болезненно.
Как использовать псевдокласс :hover в Tailwind только тогда, когда это действительно необходимо (при наличии курсора)
Как использовать псевдокласс :hover в Tailwind только тогда, когда это действительно необходимо (при наличии курсора)
Я люблю Tailwind. Раньше я относился к нему с подозрением, но как только я попробовал его использовать, я был поражен тем, сколько времени он мне...
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я исправил это, переместив код onMount из самого верхнего +layout.svelte непосредственно в элемент сценария в app.html. Это устранило мигание светлой темы при перезагрузке.

Ответ принят как подходящий

onMount работает на клиенте довольно поздно.
Вероятно, вы также можете переместить логику в главный скрипт макета:

<svelte:head>
  <script>
    ...
  </script>
</svelte:head>

Такие сценарии должны выполняться как можно раньше (но вы не можете использовать там возможности Svelte).

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