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

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

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

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

CSS

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

React.js

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

Q&A

解決済

1回答

2520閲覧

ライブラリが提供するコンポーネントのcssを、できるだけ無駄が無い書き方かつファイルの読み込み方で上書きしたい。

erajera

総合スコア22

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

CSS

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

React.js

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

0グッド

0クリップ

投稿2021/10/16 00:27

編集2021/10/16 00:30

前提・実現したいこと

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.tsxhoge.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ファイルをインポートできる方法を調べましたが、見つけられませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

:globalを使うことでグローバルなクラス名を指定することができるようになります。
こんな感じになると思います〜

scss

1// hoge.module.scss 2.wrap { 3 :global { 4 // この階層に書くcssは効きます。 5 .library { // この階層ならびにこの階層以下のCSSが効きません。 6 .input { 7 padding: 1rem; 8 } 9 .leftBtn { 10 padding: 1rem; 11 } 12 } 13 } 14}

投稿2021/10/20 18:05

ukyoda

総合スコア386

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問