Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Тёмная тема

В Bulma 1.0 тёмная тема встроена и включается сама: если в системе пользователя выбрано тёмное оформление, страница с Bulma тоже станет тёмной. Делать для этого ничего не нужно — фон, текст, карточки, поля и таблицы меняют цвета вместе. Ваша задача — не сломать это своими цветами и при желании дать пользователю выбор.

Как это работает

Все цвета Bulma хранятся в CSS-переменных. Файл стилей содержит два набора значений: для светлой темы и для тёмной. Набор выбирается медиазапросом prefers-color-scheme — он сообщает, какую тему выбрал пользователь в системе. Включите тёмную тему в настройках системы и обновите любую страницу с Bulma — она потемнеет.

Принудительная тема

Атрибут data-theme или класс theme-dark / theme-light выбирает тему независимо от системы. На тег <html> их ставят для всей страницы:

<!DOCTYPE html>
<html lang="ru" data-theme="dark">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
  </head>
  <body>
    <section class="section">
      <h1 class="title">Винная карта</h1>
      <div class="box">Кьянти Классико — €32</div>
      <button class="button is-primary">Заказать</button>
    </section>
  </body>
</html>

Тёмный фон, светлый заголовок, тёмно-серый box и бирюзовая кнопка — даже если в системе светлая тема. Значение data-theme="light" наоборот закрепляет светлую тему.

Тема для части страницы

Класс theme-dark можно поставить на любой блок — тогда тёмными станут элементы Bulma внутри него:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
 
<div class="columns is-mobile">
  <div class="column theme-light">
    <div class="box">Обед: светлая карточка</div>
  </div>
  <div class="column theme-dark">
    <div class="box">Ужин: тёмная карточка</div>
  </div>
</div>

Две карточки рядом: светлая и тёмная. Сам блок с классом фон не получает — тёмные здесь именно box внутри.

Кнопка переключения

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
 
<section class="section">
  <button class="button" id="theme-toggle">Сменить тему</button>
  <div class="box mt-4">Trattoria Oliva — ждём вас с 12:00.</div>
</section>
 
<script>
  const root = document.documentElement;
  document.getElementById('theme-toggle').addEventListener('click', () => {
    const isDark = root.dataset.theme
      ? root.dataset.theme === 'dark'
      : matchMedia('(prefers-color-scheme: dark)').matches;
    root.dataset.theme = isDark ? 'light' : 'dark';
    console.log('Тема:', root.dataset.theme);
  });
</script>

Каждое нажатие меняет data-theme у <html>, страница переключается между светлой и тёмной темой, а под примером появляется название новой темы. Пока атрибута нет, текущую тему подсказывает системная настройка — её читает matchMedia. Чтобы выбор сохранялся между визитами, записывайте его в localStorage и читайте при загрузке.

Если тёмная тема не нужна

Возьмите сборку без неё: https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/versions/bulma-no-dark-mode.min.css. Или поставьте data-theme="light" на <html>.

Частая ошибка

Задавать цвета в своём CSS обычными значениями: .price { color: #333; }. В тёмной теме такой текст почти пропадает на тёмном фоне. Берите переменные Bulma, которые меняются вместе с темой: color: var(--bulma-text-strong) или background: var(--bulma-scheme-main).

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.