通过 🎓 在线互动课程、📺 教育视频和 🧑🏻‍💻 项目构建教程学习 CSS。
下载

赞助

Route Planner and Route Optimizer

Bulma 的深色模式


Bulma 具有 自动深色模式

现代浏览器可以通过使用 prefers-color-scheme 关键字来检测用户是否已将其主题偏好设置为 lightdark

此值可用于媒体查询以相应地更改网站的样式

@media (prefers-color-scheme: dark) {
  :root {
    /* Update CSS variables */
  }
}

但是,网站无法更改此偏好。 这就是为什么最好 同时 添加 data-theme HTML 属性或 theme-dark CSS 类。

这是 Bulma 定义其深色主题的方式

@media (prefers-color-scheme: dark) {
  :root {
    /* Update CSS variables */
  }
}

[data-theme=dark],
.theme-dark {
  /* Update CSS variables */
}

使用以下规则

  • 如果没有设置用户偏好,网站将默认为 浅色
  • 如果用户已将其偏好设置为 light,它也将为 浅色
  • 如果用户已将其偏好设置为 dark,则网站将为 深色

在页面中强制深色模式 #

您可以通过简单地使用 HTML 属性或 CSS 类在 HTML 的一部分中 启用 深色模式

<div>
  This is in Light Mode if the user hasn't set a preference, or if their preference is set to <code>light</code>.
</div>

<div data-theme="dark">
  This is in Dark Mode
</div>

<div class="theme-dark">
  This is also in Dark Mode
</div>

为整个网页强制深色模式 #

如果要为整个网页启用深色模式,只需在 <html> 元素上设置属性或类

<html data-theme="dark">
<!-- Or -->
<html class="theme-dark">

深色主题的创建方式 #

这是 sass/themes/dark.scss 文件的内容

@use "sass/utilities/initial-variables" as iv;
@use "sass/utilities/css-variables" as cv;
@use "sass/utilities/derived-variables" as dv;
@use "sass/themes/setup";

// The main lightness of this theme
$scheme-main-l: 11%;
$background-l: 14%;
$text-l: 71%;

// The main scheme color, used to make calculations
$scheme-main: hsl(iv.$scheme-h, iv.$scheme-s, $scheme-main-l);
$background: hsl(iv.$scheme-h, iv.$scheme-s, $background-l);
$text: hsl(iv.$scheme-h, iv.$scheme-s, $text-l);

@mixin dark-theme {
  // Required: update the lightness colors and hover/active states
  @include cv.register-vars(
    (
      "scheme-brightness": "dark",
      "scheme-main-l": $scheme-main-l,
      "scheme-main-bis-l": $scheme-main-l + 2%,
      "scheme-main-ter-l": $scheme-main-l + 4%,
      "background-l": $background-l,
      "border-weak-l": 21%,
      "border-l": 24%,
      "text-weak-l": 53%,
      "text-l": $text-l,
      "text-strong-l": 93%,
      "text-title-l": 100%,
      "hover-background-l-delta": 5%,
      "active-background-l-delta": 10%,
      "hover-border-l-delta": 10%,
      "active-border-l-delta": 20%,
      "hover-color-l-delta": 5%,
      "active-color-l-delta": 10%,
    )
  );

  // Required: update the "on scheme" colors since the main scheme color is changed
  // from white (100% lightness)
  // to black (11% lightness in this case)
   @each $name, $color in dv.$colors {
    @include cv.generate-on-scheme-colors($name, $color, $scheme-main);
  }

  // Optional: update the shadow color
  @include cv.register-hsl("shadow", white);
}

此 mixin 输出 CSS 变量及其新值的列表。

要将此主题与 prefer-color-scheme 媒体查询一起使用,请编写以下内容

@use "sass/utilities/css-variables" as cv;
@use "sass/themes/dark";

@include cv.system-theme($name: "dark") {
  @include dark.dark-theme;
}

要将此主题与 [data-theme=dark].theme-dark 选择器一起使用,请编写以下内容

@use "sass/utilities/css-variables" as cv;
@use "sass/themes/dark";
@use "sass/themes/setup";

@include cv.bulma-theme($name: "dark") {
  @include dark.dark-theme;
  @include setup.setup-theme;
}

bulma-theme() mixin

此 mixin 将允许您生成一个 CSS 规则集,其中包含适当的 HTML 属性选择器和 CSS 类选择器,其名称由 $name 参数定义。

@use "sass/utilities/css-variables" as cv;

@include cv.bulma-theme($name: "my-theme") {
  // Your code
}

这将输出以下内容

[data-theme=my-theme],
.theme-my-theme {
  /* Your code */
}

system-theme() mixin

此 mixin 将生成一个 @media (prefers-color-scheme: $name) 媒体查询。

@use "sass/utilities/css-variables" as cv;

@include cv.system-theme($name: "dark") {
  // Your code
}

这将输出以下内容

@media (prefers-color-scheme: dark) {
  :root {
    /* Your code */
  }
}

register-vars() 函数

所有 Bulma CSS 变量都以 bulma- 为前缀。 此前缀由 $cssvars-prefix: "bulma-"; Sass 变量定义。

因为使用此前缀编写所有 CSS 变量可能很麻烦,所以 Bulma 提供了一个 Sass 函数来注册新变量:register-vars()

此函数接受 name: value 对的 Sass 映射。

@use "sass/utilities/css-variables" as cv;

$scheme-main-l: 11%;
$background-l: 14%;
$text-l: 71%;

@include cv.bulma-theme($name: "my-theme") {
  @include cv.register-vars(
    (
      "scheme-brightness": "dark",
      "scheme-main-l": $scheme-main-l,
      "scheme-main-bis-l": $scheme-main-l + 2%,
      "scheme-main-ter-l": $scheme-main-l + 4%,
      "background-l": $background-l,
      "border-weak-l": 21%,
      "border-l": 24%,
      "text-weak-l": 53%,
      "text-l": $text-l,
      "text-strong-l": 93%,
      "text-title-l": 100%,
      "hover-background-l-delta": 5%,
      "active-background-l-delta": 10%,
      "hover-border-l-delta": 10%,
      "active-border-l-delta": 20%,
      "hover-color-l-delta": 5%,
      "active-color-l-delta": 10%,
    )
  );
}

更新亮度

对于深色模式,Bulma 将保持主配色方案颜色的色调和饱和度不变。 但是,它会 反转 背景、边框、文本颜色以及悬停/活动状态的亮度。

亮度名称 浅色模式(默认) 深色模式(默认)
--bulma-scheme-main-l 100% 11%
--bulma-scheme-main-bis-l 98% 13%
--bulma-scheme-main-ter-l 98% 15%
--bulma-background-l 96% 14%
--bulma-border-weak-l 93% 21%
--bulma-border-l 86% 24%
--bulma-text-weak-l 48% 53%
--bulma-text-l 29% 71%
--bulma-text-strong-l 21% 93%
--bulma-text-title-l 14% 100%
--bulma-hover-background-l-delta 5% 5%
--bulma-active-background-l-delta 10% 10%
--bulma-hover-border-l-delta 10% 10%
--bulma-active-border-l-delta 20% 20%
--bulma-hover-color-l-delta 5% 5%
--bulma-active-color-l-delta 10% 10%

generate-on-scheme-colors() 函数

配色方案颜色用于

  • 背景
  • 边框
  • 文本阴影
    • 粗体文本
    • 弱化文本
    • 标题文本
    • 和普通文本

对于 7 种主要颜色中的每一种 ,默认的 Bulma 主题会生成 在配色方案上 的阴影,这意味着每种颜色的阴影在主配色方案颜色上看起来都不错。

在浅色模式下,它们看起来像这样

link var(--bulma-link-on-scheme)
primary var(--bulma-primary-on-scheme)
info var(--bulma-info-on-scheme)
success var(--bulma-success-on-scheme)
warning var(--bulma-warning-on-scheme)
danger var(--bulma-danger-on-scheme)

因为在深色模式下,我们要反转这些颜色的亮度,所以页面背景将从白色 变为黑色 。 因此,我们需要更新所有 7 种主要颜色的 -on-scheme 颜色。

在深色模式下,它们看起来像这样

link var(--bulma-link-on-scheme)
primary var(--bulma-primary-on-scheme)
info var(--bulma-info-on-scheme)
success var(--bulma-success-on-scheme)
warning var(--bulma-warning-on-scheme)
danger var(--bulma-danger-on-scheme)

如果您要创建自己的主题,则可以使用 generate-on-scheme-colors()每种 颜色自动生成新的 -on-scheme 颜色。 它有 3 个参数

  • $name,它是一个字符串。 例如 "primary"
  • $color,它是颜色值。 例如
  • $scheme-main,它是主题的主要配色方案颜色(用作页面背景)。 例如 #fff

完整的代码如下所示

@use "sass/utilities/css-variables" as cv;
@use "sass/utilities/derived-variables" as dv;

$scheme-main-l: 11%;
$scheme-main: hsl(iv.$scheme-h, iv.$scheme-s, $scheme-main-l);

@include cv.bulma-theme($name: "my-theme") {
  @each $name, $color in dv.$colors {
    @include cv.generate-on-scheme-colors($name, $color, $scheme-main);
  }
}

setup-theme() 函数

在 Bulma 中,一些 CSS 变量引用了其他 CSS 变量。 例如,--bulma-scheme-main 的定义如下

:root {
  --bulma-scheme-main: hsl(
    var(--bulma-scheme-h)
    var(--bulma-scheme-s)
    var(--bulma-scheme-main-l)
  );
}

由于 CSS 变量的工作方式,如果您更新了 --bulma-scheme-main-l 的值,您需要重新定义 --bulma-scheme-main。 这就是 setup-theme() 所做的事情。

[data-theme=my-theme],
.theme-my-theme {
  --bulma-scheme-main-l: 7%;
  --bulma-scheme-main: hsl(
    var(--bulma-scheme-h)
    var(--bulma-scheme-s)
    var(--bulma-scheme-main-l)
  );
}

如果您创建了自己的主题,只需在设置完自己的 CSS 变量之后调用此函数

@use "sass/themes/setup";

@include cv.bulma-theme($name: "my-theme") {
  // Set your own CSS variables,
  // either manually:
  --bulma-scheme-main-l: 7%;
  // or using Bulma's register-vars() function:
  @include register-vars((
    "bulma-scheme-main-l": 7%,
  ));

  // Then, setup the new theme.
  @include setup.setup-theme();
}

如何支持 Bulma

#native_company# #native_desc#
#native_cta#
免费开始使用
免费开始使用