前提・実現したいこと
Next.jsを使っています。
ライブラリが提供するコンポーネントのcssを、できるだけ無駄が無いように書きかつcssファイルを読み込みたいです。
また、ライブラリが提供するコンポーネントは複数のhtml要素で構成され、それぞれにクラス名が割り当てられているため、クラス名を指定してcssを上書きしたいです。
問題点
cssファイルの読み込みの無駄を省くため、グローバルなコンポーネントでグローバルなcssを読まず、ひとまずcss modulesでcssの上書きを試みました。
しかし、css modulesだと子html要素のクラス名を指定してもcssが効きませんでした。
該当のソースコード
tsx
1// Hoge.jsx 2import Library from "library"; 3import "library/css"; 4import {styles} from "styles/hoge.module.scss"; 5 6const Hoge = () => { 7 return ( 8 <div className={styles.wrap}> 9 <Library /> {/* LibraryコンポーネントはclassName属性を受け付けない */} 10 </div> 11 ) 12}
scss
1// hoge.module.scss 2.wrap { 3 // この階層に書くcssは効きます。 4 .library { // この階層ならびにこの階層以下のCSSが効きません。 5 .input { 6 padding: 1rem; 7 } 8 .leftBtn { 9 padding: 1rem; 10 } 11 } 12}
デベロッパーツールで確認できる、Library
コンポーネントのhtml構造
html
1<div class="library"> 2 <input class="input" type="text" /> 3 <button class="leftBtn">Left</button> 4 <button class="rightBtn">Right</button> 5 ...省略 6</div>
試したこと
- css modulesではなく
hoge.css
としてインポートすればスタイルを設定できそうですが、Next.jsでは_app.tsx
でしかファイルのインポートは許されていません。 _app.tsx
でhoge.css
としてインポートしたところLibrary
コンポーネントにcssを適用できました。
ただし、Library
コンポーネントはHoge
コンポーネントでしか使わないため、他ページでhoge.css
を読むのは無駄になります。
- css modulesで下記のようにクラス名ではなくhtml要素を指定すればスタイルを適用できそうですが、手間が掛かるのと可読性を損なうので、この手法は避けたいです。
scss
1// hoge.module.scss 2.wrap { 3 > div { 4 > input { 5 padding: 1rem; 6 } 7 > input:nth-of-type(1) { 8 padding: 1rem; 9 } 10 } 11}
css modulesのファイルで子html要素にクラス名を指定してする書き方や、next.jsの設定や書き方で_app.tsx
以外のコンポーネントでcssファイルをインポートできる方法を調べましたが、見つけられませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。