MENU

CSSモジュールを使ってみよう

さて、前回は「CSSモジュールを使うのね」と言うところで力尽きてしまった訳ですが、気を取り直して再チャレンジ。と言っても、そもそも今迄 CSSモジュールを使わないで書いているので、今一度見てみましょう。CSSモジュールのリポジトリREADME.md を見てみます。

CSS Module is a CSS file in which all class names and animation names are scoped locally by default. 

https://github.com/css-modules/css-modules

…なになに「CSSモジュールは、すべてのクラス名とアニメーション名がデフォルトでローカルにスコープされているCSSファイルです。」うーん。何やら分かったようなわからないような…。
「すべてのURL(url(…))と@importsはモジュールリクエスト形式です(./xxxと../xxxは相対を意味し、xxxとxxx / yyyはモジュールフォルダー内、つまりnode_modules内を意味します)」ふんふん。それで?
「CSSモジュールは、ICSSまたは相互運用可能なCSSと呼ばれる低レベルの交換形式にコンパイルされますが、通常のCSSファイルのように記述されます」うーむ。成る程わからん。
こう言う時は実装例を見ないとピンと来ないので、探してみます。

Gatsby の公式サイトに載っていたコードをじーっと見てみます。

import React from "react"
import containerStyles from "./container.module.css"

export default function Container({ children }) {
  return <div className={containerStyles.container}>{children}</div>
}

うーん。元々 CSS ってグローバルスコープだけど、それをローカルスコープが使える様になると。まあ確かに上でそう書いてるものね。でも実際はどうなってんの?と思ったのだけど、取り敢えず手を動かさないと、全く理解出来ないタイプなので、以前に作った index.js と second.js で実験してみることにする。

import React from "react"
import styles from "../styles/index.module.css"
import "typeface-fira-sans-extra-condensed"

export default function Home() {
  return (
    <div className={styles.mainconteiner}>
      <h1 className={styles.maintitle}>Hello world! </h1>
      <h3 className={styles.nexttitle}>I am inohide.</h3>
    </div>
  )
}

サンプルコードを真似て修正したのが上のモノ。ついでに CSS も一緒に修正。

mainconteiner {                                                                                                                                                                                             
  width: 100%;
  height: 100vh;
  background-color: teal;
  padding: 30px;
  font-weight: 600;
  text-align: left;
}

.maintitle {
  font-size: 3rem;
  color: #fff;
}
.nexttitle {
  font-size: 1.6rem;
  color: #fff;
}

で、出来たのがこちら。

まぁ、前と一緒だよね。ほんじゃ次。

import React from "react"
import styles from "../styles/second.module.css"
import "typeface-fira-sans-extra-condensed"

export default function Second() {
  return (
    <div className={styles.mainconteiner}>
      <h1 className={styles.maintitle}>This page is second page</h1>
      <h3 className={styles.nexttitle}>Well, how about?.</h3>
    </div>
  )
}

今回は実験なので、クラス名も一緒にしてみた(ローカルスコープなら、問題ないはずだよね?)
CSS はバックグラウンドカラーと文字色を変更。

.mainconteiner {                                                                                                                                                                                             
  width: 100%;                                                                                                                                                                                               
  height: 100vh;                                                                                                                                                                                             
  background-color: lightslategray;                                                                                                                                                                          
  padding: 30px;                                                                                                                                                                                             
  font-weight: 600;                                                                                                                                                                                          
  text-align: left;                                                                                                                                                                                          
  color: #fffacd;                                                                                                                                                                                            
}                                                                                                                                                                                                            
                                                                                                                                                                                                             
.maintitle {                                                                                                                                                                                                 
  font-family: 'Fira Sans Extra Condensed';                                                                                                                                                                  
  font-size: 3rem;                                                                                                                                                                                           
}                                                                                                                                                                                                            
.nexttitle {                                                                                                                                                                                                 
  font-family: 'Fira Sans Extra Condensed';                                                                                                                                                                  
  padding-top: 20px;                                                                                                                                                                                         
  font-size: 1.6rem;                                                                                                                                                                                         
}     

では、結果は?

おぉー良いねー。でももうちょっと見てみよう。Chromeの開発者ツールで見てみます。

second-module--mainconteiner--1BvYm

ああ成程、import したモジュール名がクラスの最初に着くんだね。xxx.module.css の様にしてインポートするのはこの為の様です。 あれっ?クラス名の後ろにも何か追加されてる? 「–1BvYm」とは一体? ここでもう一度、公式ページを見てみましょう。

これらは、CSSモジュールが生成するクラス名です。それらはあなたのサイト全体でユニークであることが保証されています。

自動で付けられていて、この仕組みがローカルスコープを可能にしていると言うことなのですね。どれ違うページの同じクラス名はどうなっているかな?

index-module--maintitle--3alxr

うんうん。ようやっと納得しました。これでやっと Gatsby で何か作れるかな? でも折角なのでもう少し調べてみることにします。私は Vue.js のシングルファイルコンポーネント がいたく気に入っているのですが、Gatsby にも同様のものがあるのでしょうか? 次回はもう少し Gatsby のスタイリングについて見てみることにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次