📦

Next.jsでContainer Queryを使いたい!

2022/02/01に公開

そもそもContainer Queryとは

Container Queryは名前の通り、親要素の大きさに基づいてスタイルを定義できる。@media screen and (max-width: ○○px) {...Media Queryと呼ばれ、Viewportに基づく。しかしながら2022年1月現在、どのブラウザ(フラグ以外)も対応していない。

can i use 'CSS Container Queries'

詳しいContainer Queryの説明や使い方については以下の記事を見ていただきたい。

https://coliss.com/articles/build-websites/operation/css/about-css-container-queries.html

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries

Next.jsでContainer Queryを使う

まずは伝家の宝刀create-next-appでNext.jsのプロジェクトを作成する。(--tsオプションでTypeScriptをあらかじめ導入する)

npx create-next-app --ts [project name]  
# or
npm -g create-next-app
create-next-app --ts [project name]

PostCSSの導入

対応していないのならばpolyfillで解決しちゃおうということでPostCSSの出番。まず必要なモジュールをインストール。

npm i postcss postcss-nesting cqfill

postcssで様々なPostCSSのプラグインを使えるようになる。

postcss-nestingはCSSをネストさせて書くためのモジュール。()

cqfillContainer QueryのPolyfill。同様のPolyfillのなかでGoogle Chrome Labsの次にメンテナンスがされている。

touch post.config.json # post.config.jsでも良い

でPostCSSの設定用ファイルを作成。

post.config.json
{
    "plugins": ["postcss-nesting", "cqfill/postcss"],
}

cqfillを有効化させるため、pages/_app.tsxに記述を追加する。

pages/_app.tsx
// ...
import 'cqfill';
// ...

ドキュメントにも書いてある通り、Next.js側の仕様で自分でPostCSSを設定するとデフォルトのPostCSS設定が初期化される。

https://nextjs.org/docs/advanced-features/customizing-postcss-config#customizing-plugins

そのためautoprefixerなどのNext.jsがデフォルトで提供しているPostCSS設定をしたい場合は、手動での記述が必要となる。

実際にCSSで使ってみる

今回、このような場合のHTMLを考える。

index.tsx
// ...
<div className={`${styles.card} ${container.parent}`}>
    <div className={container.child}>
    <h2>Container Query</h2>
    <p>You can resize this element</p>
    </div>
</div>
// ...
Container.module.css
.parent {
    contain: layout inline-size;
}
.child {
    color: blue;

    @container (width >= 500px) {
        color: red;
    }
    /* or */
    @container (min-width: 500px) {
        color: red;
    }
}

これで親要素が500px以上であれば、子要素のcolorredになる。

副作用

何故だかposition: fixedが効かなくなる。原因究明中で、分かり次第追記しようと考えている。

動かないよ!って方へ

cqfillのVersionを最新の0.6.1から0.6.0に変えてみると良い。公式のGithubではタグが消されているがインストールでき、使用できる。

CodeSandbox

https://codesandbox.io/s/next-js-with-container-query-0xj37

Repository

https://github.com/Cookie-gg/nextjs-with-container-query

Discussion