Techioz Blog

Ruby on Rails 7 の明るいテーマと暗いテーマを切り替える際のちらつき効果

概要

この YouTube チュートリアルを使用して、テーマ (ライト、ダーク、またはシステムのデフォルト) を切り替える機能を紹介しました。すべて正常に動作しますが、ちらつき効果というバグがあります。 たとえば、LIGHT テーマを使用しており、他のサブページにアクセスすると、すべて良好で、Light テーマが表示されます。 ダークテーマに切り替えます。これは機能しますが、他のサブページにアクセスすると、暗いテーマが適用される前に明るいテーマが一瞬表示され、ちらつきが生じます。

このテーマの切り替えが機能するようにチュートリアルに記載されているコード変更は次のとおりです。

application.html.erb (クリック可能なリンク):

<%= cookies[:theme] %>
<%= link_to 'Light', set_theme_path(theme: 'light') %>
<%= link_to 'Dark', set_theme_path(theme: 'dark') %>
<%= link_to 'System default', set_theme_path %>

テーマ.scss:

@media (prefers-color-scheme: dark) {
    .home {
      background:black;
      color: white;
    }

    .home.light {
        background: silver;
        color: black;
    }
  }


  @media (prefers-color-scheme: light) {
    .home {
        background: silver;
        color: black;

    }

    .home.dark {
        background:black;
        color: white;
    }
  }

ルート.rb:

  get 'set_theme', to: 'theme#update'

テーマコントローラー.rb:

class ThemeController < ApplicationController
    def update
        cookies[:theme] = params[:theme]
        redirect_to(request.referrer || root_path )
    end
end

テーマの切り替えは機能しますが、このちらつき効果を削除したいと考えています。誰かこれについて手伝ってくれませんか?

ありがとう

解決策

HTML でテーマを直接設定していないため、読み込みの開始時にテーマが設定されていると思います。

<html class="<%= cookies[:theme] == 'dark' ? 'dark' : 'light' %>">

これとは別に、StimulusJS を使用して、JS 経由でトグルと Cookie 設定を追加することをお勧めします。