前提・実現したいこと
以下の構成で、ボタンを押したらモーダルを開く機能を作成しています。
- 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 & {}}の部分)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。