質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

Q&A

解決済

2回答

7600閲覧

ReactでCSS変数を使いたい

Romay

総合スコア40

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

0グッド

0クリップ

投稿2021/07/19 18:05

前提・実現したいこと

React(TypeScript) × Railsでアプリケーション開発しています。各ユーザーごとに画面UIの色を変更したいと思い調べていると、CSS変数というものを見つけました。ただ、ReactでのCSS変数の使い方がイマイチ分からず、全体の方針などお教えいただけると嬉しいです。

React (TypeScript)
Ruby on Rails
material UI

やりたいことのフロー

  1. 今ベタがきでCSSの色を指定しているところを変数で統一する
  2. ユーザーテーブルにカラーコードを追加し、ユーザーごとにカラーコード(#FFFFFF的な)を入力できる画面を用意する
  3. 各ユーザーが持つカラーコードをDB上から引っ張り、フロントに渡す
  4. フロント側のCSS変数で色がユーザーごとに出し分けられる

まずは、"1"をやりたいと考えています。現状、すべてのカラーコードをベタがきしているのでこれを変数化したいです。
また、Material UIを用いているため、ThemeTemplate.tsxで変数管理するのも良いのではと思っています。(その場合、Rails側からどのControllerで渡すべきなのかイマイチ分からないのですが。。)

  • ThemeTemplate.tsx

React

1const theme = createMuiTheme({ 2 overrides:{ 3 MuiCard:{ 4 root:{ 5 background: 'none', 6 'box-shadow': 'none' 7 }, 8 }, 9 palette: { 10 primary: { 11 main: "#efefef", 12 light: "#faabcb", 13 dark: "#cccccc" 14 }, 15 }, 16省略... 17})
  • index.tsx (実際の色を変更したいユーザー側の画面)

React

1const useStyles = makeStyles((theme: Theme) => 2 createStyles({ 3 root: { 4 padding: theme.spacing(1, 2), 5 color: "white", 6 }, 7 hogehoge: { 8 backgroundColor: "#FEE8EA", //ここを変数化したい 9 }, 10省略... 11 }) 12)

試したこと

通常のCSSでの書き方などは記事があったのですが、Reactのものはなかなか見つからず、どのように書けるのかがわかりませんでした。

CSS カスタムプロパティ (変数) の使用

また、ただ1ファイル内で変数化して管理を楽にするのではなく、DB側からユーザーに紐づくカラーコードのデータを取ってきてそれを変数に入れるなどをしたいので、Rails側も考慮して変数化が必要なのでは と考えています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Reactでスタイルを動的に制御したい場合は値を明示的に差し替えるだけで可能です。まずは、オーソドックスなやり方の説明から入るとわかるのではないかと。

js

1const hogehoge = "black" 2<div style={{background-color: hogehoge}}>

この変数hogehogeに値を変えていくだけです。要はオブジェクトリテラルの中にスタイル制御用のブラケットが入っている状態です。

js

1const hogehoge = "black" 2<div style={ 3 {background-color: hogehoge} 4}>

あとはこの要素に対し、clickイベントなどで値を差し替えるだけです

js

1const stylecolor = "black" 2const ev = false //判定用フラグ 3const anycolor = '' //取得した任意のカラー 4const [color,setColor] = useState("") 5const handle = (e)=>{ 6 let ev = e.target.value 7 if(ev === stylecolor){ 8 anycolor = stylecolor 9 }else{ 10 anycolor = '' 11 } 12 setColor(anycolor) 13} 14return ( 15 <div 16 onClick={handle(anycolor)} 17 style={{background-color: anycolor}} 18></div> 19) 20

CSS変数はこの応用です。さっきまでのやり方だとプロパティの値だけを制御する必要がありましたが、CSS変数を用いることでプロパティごと設定が可能になります。

js

1const = style{ "--my-css-var": 10 } as React.CSSProperties; 2render(){ 3 return <div style={style}></div> 4} 5

こんな感じで…

※CSS変数がちゃんと動くかはこれから検証しますが、自分もちょうど今スタイルをリアクティブ制御しているところです。

投稿2021/07/20 02:32

編集2021/07/20 02:38
FKM

総合スコア3640

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Romay

2021/08/01 09:57

ありがとうございます!  今回はクリック等で色を変えるのではなく、ユーザーごとに色を変えるので、Material-UIのpaletteで管理できないかトライしてみようと思います。
guest

0

ベストアンサー

Default Theme - Material-UI

Theme はここにある構造のようになっていて theme.palette.primary.main で取得できます。

投稿2021/07/19 23:27

anozon

総合スコア662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Romay

2021/08/01 10:05 編集

ありがとうございます!  themeTemplateのprimary.mainで設定をし、反映させるtsxファイルのuseStyle内で呼び出したのですが、themeTemplateで設定した色が反映されず、デフォルトの#3f51b5のままになってしまいました。useStyle内で呼び出すのが間違っているのでしょうか。 呼び出す側のファイル const useStyles = makeStyles((theme: Theme) => createStyles({ hogehoge: { backgroundColor: theme.palette.primary.main, } }) また、import ThemeTemplate from "../../layouts/ThemeTemplate" という形でimportしています。
anozon

2021/08/01 11:14

ThemeProvider を設定していない可能性があります
Romay

2021/08/01 11:37

ありがとうございます。 呼び出す側のファイル(index.tsx)のreturn 内で、 <Button color="primary" > </Button>のようには利用できています。 createStyle内でのcssだけ反映されていないのですが、この場合もThemeProviderが原因でしょうか。 return内で利用できているので、themeTemplate.tsxファイルには問題なく、index.tsxファイルで呼び出しはできているものの、createStyle内での呼び出し方が違うのかと思いました。
Romay

2021/08/01 12:36

ご丁寧にありがとうございます!  ただ、呼び出しファイル側でThemeProviderを使っておらず、returnの中は、<ThemeTemplete>にしています。その中で直接color="primary"とすると呼び出せています。一方、createStyle内でクラスを作り、classNameでクラスを当てたところだと色が反映されません。 こちらの新しい質問に詳細を記載したのでこちらでご回答いただけますでしょうか。 https://teratail.com/questions/352291 解決できましたらどちらもベストアンサーにさせていただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問