Vyhledávání na webu

reactjs - Manuální tmavý režim Tailwindcss nefunguje v projektu NextJS


Potřebuji integrovat tmavý režim do svého projektu. Používám NextJs v12.1.3, React 18.1.0 a tailwindcss v3.1.2. Zkoušel jsem tento návod na oficiálních stránkách, ale manuální výběr mi nefunguje. Vždy se zobrazuje téma operačního systému.

Například, pokud chci vynutit světlé téma, udělám toto:

    <html className="light">
      <body className="h-10 w-10">
        <div className="bg-white flex w-10 h-10 dark:bg-black"></div>
      </body>
    </html>

Toto vždy zobrazuje téma operačního systému. Také jsem toto přidal, abych to vynutil:

    // On page load or when changing themes, best to add inline in `head` to avoid FOUC
    if (
      localStorage.theme === 'dark' ||
      (!('theme' in localStorage) &&
        window.matchMedia('(prefers-color-scheme: dark)').matches)
    ) {
      document.documentElement.classList.add('dark');
    } else {
      document.documentElement.classList.remove('dark');
    }
    
    // Whenever the user explicitly chooses light mode
    localStorage.theme = 'light';

Také jsem to udělal do souboru _document.tsx:

    <Html className="light">
      <Head />
      <body>
        <Main />
        <NextScript />
      </body>
    </Html>

Také jsem nastavil darkMode: 'class' do souboru tailwind.config.js

Toto je můj celý soubor tailwind.config.js

    const colors = require('tailwindcss/colors');

    module.exports = {
      purge: [],
      darkMode: 'class',
      content: [
        './pages/**/*.{js,ts,jsx,tsx}',
        './components/**/*.{js,ts,jsx,tsx}',
      ],
      tailwindcss: {},
      autoprefixer: {},
      theme: {
        colors: {
          transparent: 'transparent',
          current: 'currentColor',
          black: '#212121',
          white: colors.white,
          gray: {
            ...colors.gray,
            100: '#f0f2f5',
            200: '#DADFE7',
            300: '#a9b5c6',
            400: '#6c809d',
            500: '#647697',
            600: '#5a6C87',
            700: '#394556',
            800: '#313B49',
            900: '#181D25',
          },
          teal: {
            50: '#ECFDFA',
            100: '#DAFCF6',
            200: '#B4F8ED',
            300: '#8FF5E4',
            400: '#6AF1DB',
            500: '#47EED1',
            600: '#15E0BE',
            700: '#10A88F',
            800: '#0A705F',
            900: '#053830',
          },
          indigo: colors.indigo,
          red: colors.rose,
          yellow: colors.amber,
          orange: {
            ...colors.orange,
            300: '#ffce30',
            700: '#d49100',
          },
          extend: {
            transitionDuration: {
              0: '0ms',
              2000: '2000ms',
            },
          },
        },
      },
      plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')],
    };

Upřímně řečeno, v tuto chvíli chci jen světlý režim, ale mám některé komponenty naformátované i pro tmavý režim a nechci je přeformátovávat, protože je budu později potřebovat.

Co myslíš, že jsem udělal špatně?

P.S. Nechci používat next-themes pro správu tmavého/světlého režimu.

Odpověď č. 1

Pokud je váš tailwind.config.js nakonfigurován s darkMode: 'class', ujistěte se, že při zabalení aplikace do ThemeProvider používáte:

<ThemeProvider attribute="class">

To řekne next-themes, aby na hlavní značku <HTML> používal třídy light/dark.

Zdroj: https://github.com/pacocoursey/next-themes#class-instead-of-data-attribute

Odpověď č. 2

Pro manuální tmavý režim proveďte následující:

V souboru tailwind.config.css nastavte darkMode na class

module.exports = {
  darkMode: 'class',
  // ...
}

A když potřebujete darkMode, stačí přidat ClassName s dark do značky html

<html className="dark">
<body>
  <!-- Will be black -->
  <div className="bg-white dark:bg-black">
    <!-- ... -->
  </div>
</body>
</html>

A když potřebujete light, stačí odstranit ClassName dark uvnitř tagu html

Doufám, že to pomůže!

Související články