- HOME >
- Jamstack用語集 >
- CSS Modules
CSS Modules
シーエスエスモジュール
CSS Modules を分かりやすく
CSS Modules は、CSS ファイル内のスタイルをクラス名に紐付ける手法です。これにより、スタイルの名前衝突を回避することができます。 CSS をコンポーネントごとに分割し、それぞれにユニークな名前をつけることで、スタイルの競合や名前空間の汚染を回避するための仕組みです。
Next.js では、CSS Modules をサポートしており、コンポーネントごとに独立したスコープをもたせることができます。 CSS Modules は、規約に従ったファイル名をつけることで有効化できます。
例えば、以下のような CSS ファイルを考えます。
/* styles.module.css */
.button {
background-color: blue;
color: white;
}
.button:hover {
background-color: lightblue;
}
この CSS ファイルを使用する場合、次のように記述します。
import styles from './styles.module.css'
function Button() {
return <button className={styles.button}>Click me!</button>
}
このように、CSS ファイルをインポートし、スタイルをクラス名として利用することができます。
CSS Modules のメリット
CSS Modules を使用することによって、以下のようなメリットがあります。
- スタイルの名前衝突を回避できる
- クラス名が一意になるため、再利用性が高くなる
- スタイルの変更に強い
また、Next.js では、CSS Modules をサポートしており、.module.css
という拡張子を使用することで、自動的に CSS Modules として扱われます。
import styles from './styles.module.css'
function MyComponent() {
return (
<div className={styles.container}>
<h1 className={styles.title}>Hello World!</h1>
<p className={styles.text}>Lorem ipsum dolor sit amet.</p>
</div>
)
}
CSS Modules の記述方法は、通常の CSS と同じであり、.module.css
を使うことで CSS Modules として扱われます。そして、インポートしたクラス名をclassName
に指定することで、スタイルを適用することができます。
CSS Modules を使ってみる
以下は、Next.js で CSS Modules を使うための簡単な例です。
// components/Button.tsx
import styles from './Button.module.css'
interface ButtonProps {
children: React.ReactNode;
}
export default function Button({ children }: ButtonProps) {
return <button className={styles.button}>{children}</button>
}
/* components/Button.module.css */
.button {
color: white;
background-color: blue;
padding: 8px 16px;
border-radius: 4px;
border: none;
}
上記の例では、Button コンポーネントでスタイルを定義するために、Button.module.css
というファイルを作成しています。このファイルには、.button
という CSS クラスが定義されています。このクラスは、Button コンポーネントの className
属性にセットされます。className
属性は、React で HTML 要素に CSS クラスを付与するために使用されます。
TypeScript との組み合わせ
CSS Modules を TypeScript と組み合わせる場合、スタイルがオブジェクトとしてエクスポートされるため、import styles from './styles.module.css'
のようにインポートすると、TypeScript が styles
変数の型を自動的に解決することができます。
// components/Title.tsx
import styles from './Title.module.css'
interface TitleProps {
children: React.ReactNode
}
export default function Title({ children }: TitleProps) {
return <h1 className={styles.title}>{children}</h1>
}