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

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

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

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

React.js

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

Q&A

解決済

1回答

2158閲覧

React+CSS Modules+Scssの書き方が分からない記法があります

erajera

総合スコア22

SCSS

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

React.js

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

0グッド

0クリップ

投稿2021/09/20 00:35

前提・実現したいこと

以下の構成で、ボタンを押したらモーダルを開く機能を作成しています。

  • React.js
  • CSS Modules
  • Scss

下記はデモです。
CodeSandBox

モーダルをwrapするdivに「modal(booean)がtrueだったらactiveクラスを追加」という処理によって、モーダルの表示非表示を切り替えようと試みています。

「openModal」ボタンを押したら、モーダルの背景がフェードインしつつ、画面外下から上に向かって動きながらモーダル本体を表示したいです。

発生している問題・エラーメッセージ

「openModal」ボタンを押してもモーダルが表示されません。
具体的には下記の点が機能していません。

  • modalにactiveクラスが付いても、.modalに付けた&.activeのCSSが効いていない
  • modalにactiveクラスが付いても、子要素のdivにそれぞれ付けた.modal.active &のCSSが効いていない

あと一応機能しているので問題って程でも無いのですが、activeクラスの追加が下記のように三項演算子を使わないと「modalがtrueの時に"active"が付く、falseのときは何も付かない」という挙動にならないです。

javascript

1className={`${styles.modal} ${modal ? "active" : ""}`}

理論的に言えば三項演算子である必要は無く、下記のように書けばよいと思います。

javascript

1className={`${styles.modal} ${modal && "active"}`}

しかし、上記のコードでデベロッパツールでこのElementを確認したところ、「modalがfalseのときは"false"、trueのときは"active"が付く」という挙動になりました。
この現象も意味が分からなくて気持ち悪いので、できれば解決したいです。

該当のソースコード

javascript

1const [modal, setModal] = useState(false); 2console.log(modal); 3 4return ( 5 <> 6 <button onClick={() => setModal(true)}>openModal</button> 7 <hr /> 8 <div className={`${styles.modal} ${modal ? "active" : ""}`}> 9 <div className={styles.bg}></div> 10 <div className={styles.contents}> 11 <h2>This is Modal</h2> 12 <p>This is modal contents.</p> 13 </div> 14 </div> 15 </> 16);

scss

1.modal { 2 display: none; 3 position: fixed; 4 inset:0; 5 width: 100vw; 6 height: 100vh; 7 8 &.active { 9 display: block; 10 } 11} 12 13.bg { 14 width: 100%; 15 height: 100%; 16 background: rgba(0, 0, 0, 0.5); 17 opacity: 0; 18 transition: opacity 0.2s; 19 20 .modal.active & { 21 opacity: 1; 22 } 23} 24 25.contents { 26 position: absolute; 27 top: 50%; 28 left: 50%; 29 transform: translate(-50%, 100vh); 30 background: white; 31 padding: 1rem; 32 transition: transform 0.2s; 33 34 .modal.active & { 35 transform: translate(-50%, -50%); 36 } 37}

試したこと

activeクラスの付与やSCSSの書き方に問題があるのではなく、そもそもCSSに不備があるのかと考え、activeクラスが付与された状態に変更される各CSSをデベロッパーツールで設定してみました。

css

1.modal { 2 - display: none; 3 + display: block 4} 5 6.bg { 7 - opacity: 0; 8 + opacity: 1; 9} 10 11.contents { 12 - transform: translate(-50%, 100vh); 13 + transform: translate(-50%, -50%); 14}

上記の変更により、モーダルが表示できました。
モーダル

このことから、設定したCSSに問題はなく、activeクラスの付与の仕方やSCSSの書き方に問題があると確認できました。

SCSSの書き方は下記のページを参考にしました。

  • 連結したクラス(.modal {&.active}の部分)

セレクタの前に記述する

  • 親クラスの状態を参照する書き方(.bg {.modal.active & {}}の部分)

セレクタの後に記述する

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

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

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

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

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

guest

回答1

0

ベストアンサー

1. モーダルが表示されない問題

こないに修正するとええと思うで。

diff

1- <div className={`${styles.modal} ${modal ? "active" : ""}`}> 2+ <div className={`${styles.modal} ${modal ? styles.active : ""}`}>

2. ${modal && "active"} について

論理積 (&&)

構文
expr1 && expr2
解説
expr1 が true に変換できる場合は expr2 を返し、それ以外の場合は expr1 を返します。

上記に従えば、modal && "active" の評価結果は、

  • modal が truthy のとき "active"
  • modal が falsy のとき modalの値

になるねん。なので、modalがfalseのときのmodal && "active" の評価結果は false となる。そやから

javascript

1className={`${styles.modal} ${modal && "active"}`}

によって、className には "_src_App_module__modal false"という文字列が設定されることになるねんな。

ひとつお節介やけど

こういうときには、classnames ゆうのん使うとええでー。これ使うと、こない

javascript

1className={classNames(styles.modal, { [styles.active]: modal })}

に書けるよってな。ほんで、active がtrueんときはclassNameは、

  • "_src_App_module__modal _src_App_module__modal"

になり、falseんときは、

  • "_src_App_module__modal"

になりよる。


追記:

あ、間違うてしもた。{ styles.active: active } やなくて、{ [styles.active]: modal } やった。(※修正済み)


追記2:

forkしてclassNames使ったやつ ➡ サンプル

投稿2021/09/20 01:11

編集2021/09/20 01:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問