White Box技術部

WEB開発のあれこれ(と何か)

ReactとSassそれぞれのSP判定について

レスポンシブ対応したサイトを作成する場合、PCとSPでスタイルを切り替えたり、表示内容を変えたりすると思うのですが、 私がやっているTSX側とSCSS側の切り替え方法について記載します。

React側の準備

react-responsiveを使って、指定サイズ以下になった場合をSPとして判定します(ここでは860px)。

インストール

$ yarn add -E react-responsive
-> "react-responsive": "9.0.2

判定コード

hooks/useSp.ts

import { useMediaQuery } from 'react-responsive';

export const useSp = () => {
  return useMediaQuery({ maxWidth: 860 });
};

Sass側の準備

CSSの切り替えはSassを使うと共通化できて便利です。

インストール

$ yarn add -E sass
-> "sass": "1.64.1"

判定コード

CSSのメディアクエリーを使って、指定サイズ以下で判定されるSassのミックスインを定義します。

styles/utils.scss

@mixin sp {
  @media screen and (max-width: 860px) {
    @content;
  }
}

これでユーティリティの準備は終わりです。

利用例

上記で作成した判定コードは、以下のようにして利用することができます。

SCSS側

SampleComponent.module.scss

@use 'styles/utils';

.container {
  width: 400px;

  @include utils.sp {
    width: 100%;
  }
}

デフォルトのスタイルはPC用で定義し、SP用に変更が必要な要素だけ上書くように書きます。

TSX

SampleComponent.tsx

import { useSp } from '@/hooks/useSp';
import ss from './SampleComponent.module.scss';

export const SampleComponent = () => {
  const isSp = useSp();
  return <div className={ss.container}>{isSp ? 'SP表示' : 'PC表示'}</div>;
}

importパスの@/が使えるように、tsconfig.jsonに以下の設定を追加しています。 "baseUrl": "src", "paths": { "@/*": ["./*"] },

なんかうまくいかない場合

そもそもレスポンシブを有効にするには、htmlのheadタグにviewportのmetaタグを設定する必要があるので、 以下のような設定が入っているかを確認してください。

<head>
  <meta name='viewport' content='width=device-width, initial-scale=1' />
</head>

またuseSpはクライアントサイドでの動作になるので、レンダリング前は判定が動きません。
これらに気をつけて実装を行ってください。