DRIVE YOUR BUSINESS
TOTAL WEB PRODUCTION FROM NARA

Next.jsでclassNameがブラウザに反映されない場合の対処方法

こんにちは。

あれー?コードエディタではclassNameをつけてるのにclassNameがブラウザに反映されないぞ?なんでだろう

本日はこちらの解決方法をお伝えします

Next.jsの基本的な部分になりますが、初心者の方は意外とぶつかりやすい内容かと思いますので参考になれば幸いです。

結論

ではまず結論からですが、「CSSファイルに該当のclassNameを記載していない」事が原因となります。

 <section className={styles.hero}>
 </section>

例えば上記のように書けば、通常のHTMLの感覚であれば以下のように出力されることを期待しますよね。

 <section class="hero">
</section>

Next.jsの場合、CSSにちゃんと.heroの記述をしてあげないとブラウザに反映されない仕様になっています。

なぜこのような仕様になっているか?

Next.js(特にCSS Modules)の設計思想によるものです。

Next.jsでは、

import styles from './xxx.module.css' 

のようにCSS Moduleを使ってスタイルを読み込む場合、クラス名はローカルスコープに変換されて適用される仕組みになっています。

これにより、グローバルでクラス名が競合してスタイルが崩れることを防ぐことができます。

たとえば、以下のようにCSS Modulesを記述した場合

/* styles.module.css */
.hero {
  background-color: #f0f0f0;
  padding: 2rem;
}

そしてコンポーネント側で以下のように使うと

import styles from './styles.module.css';

export default function Home() {
  return <section className={styles.hero}></section>;
}

実際にブラウザに出力される HTML は以下のようになります。

<section class="styles_hero__1a2b3">
</section>

このように自動的にユニークなクラス名(styles_hero__1a2b3 のような)に変換されており、CSS に該当のクラスが定義されていなければそもそも出力されないというのが仕様です。

よくある間違いについて

className={styles.hero} と書いたのに styles.module.css.hero {}が定義されていない

この場合、クラスが空とみなされ、ブラウザには何も出力されない形となります。

className="hero" のように 文字列として 書いてしまう

この場合、CSS Modulesを使っていない時の書き方なので、読み込んだ stylesとは関係なくなってしまいます。

③CSSファイルをそもそもimportし忘れている

まとめ

Next.js(特にCSS Modules)では、該当クラスが CSS に存在していないとclassNameとして反映されないという仕様になっています。

この仕組みはスタイルのスコープを保ち、他のコンポーネントとの干渉を避けるために導入されているんです。

もし classNameが反映されない場合は、以下の3点をチェックしてみましょう!

①CSS Module ファイルに .hero {} のような定義があるか

import styles from './xxx.module.css'で正しく読み込まれているか

③JSX 側で className={styles.hero} と記述しているか

というわけで本日の記事は以上となります!

著者画像

執筆者:aoyama

still.代表。 奈良市出身奈良市在住。 SEOはじめ、マーケティング成果を出せるWEB制作を得意としています。ディレクションから制作まで一気通貫でご対応。 クライアント様にとってスムーズで気持ちの良いコミュニケーションを常日頃から心がけております。 これまでコーポレイトサイト、サービスサイト、ランディングページ、ECサイトなど多数のサイト、プロジェクトに携わらせていただき、サイトを作成させて頂いております。 その他サーバーの構築、メールのトラブルの対応、コンテンツマーケティングなど幅広くご対応しておりますのでまずはお気軽にご相談ください。

Contact
お問い合わせ