技术

·

3 min read

·

- Views

React+Tailwindcss实现暗黑模式

Copied

React+Tailwindcss实现暗黑模式

前言

最近想用React 来实现一个在线面试的网站, 主要功能大概是协同代码编辑+WebRTC视频通话。 现在先从零开始慢慢做。

现代网站对于暗黑模式切换肯定是必不可少的。当项目使用了tailwindcss后可以很方便的集成暗黑模式

步骤

安装tailwindcss

这一步不过多赘述,直接去tailwindcss官网就可以

修改tailwindcss.config.js文件

config文件中,主要是启用darkMode, 将其设置为’selector’。 文件第一行有这个注释后,修改这个配置文件就会有代码提示,可以发现darkMode有三种模式 ‘class’, ‘media’, ‘selector’

官网中对其有解释, 大致区别就是

media是通过媒体查询@media (prefers-color-scheme: dark) 来自动更改dark或者light, 也就是说使用了media我们代码里就无法手动更改网站主题, 它只能根据系统的主题来自动变换

class 则是需要我们手动给html元素 添加一个class=’dark’或者class=’light’ ,这样暗黑模式才会生效。相对media来说更灵活,不过需要写逻辑来手动切换。

selector 等同于class,官网只说了selector策略取代了tailwindcss v3.4.1 中的class策略。但是我在我最新版的v3.4.3中依然能使用class策略

添加一点不同主题下的基础色

.dark 中声明的变量就是dark模式下使用的。

通过创建Context来实现手动修改Theme

新建文件 /src/components/ThemeProvider.tsx

这个文件主要逻辑是

  1. 首先从 localStorege 中获取主题,如果没有找到,则使用默认主题。
  1. 监听主题状态的变化。每当主题改变时,更新 html 的 class。如果主题为 system,则根据 prefers-color-scheme 来检测系统的主题色设置,给 html 添加对应的 class。
  1. setTheme函数将新的主题存储在localStorage中,并更新主题状态。
  1. 通过ThemeProviderContext.Provider组件将主题状态和setTheme函数传递给其子组件。

useTheme是一个自定义Hook,它可以在任何函数组件中访问主题上下文。如果它在ThemeProvider之外被调用,将抛出一个错误。

修改入口文件

使用

封装一个切换Theme的组件

修改一下Context逻辑

在使用时发现一个问题,很多时候我需要通过theme来渲染不同的svg , 但是当我使用context提供的theme来进行判断时会发现还会存在system 这个值,这导致我无法直接判断。 在next-themes 中有解决这个问题,它会导出一个resolvedTheme来表示最终得到的theme 。所有我们也加一个。

ok现在可以愉快的使用暗黑模式了

AntD中使用暗黑模式

在antdesign5+中,可以通过智能算法快速地根据主色来计算出一些状态辅助色。 同样暗黑模式也可以根据智能算法快速切换。

修改一下App.tsx文件