12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CSS.escape()でCSSセレクターとして使えない文字をエスケープする

Last updated at Posted at 2023-05-14

この記事の概要

かつての自分の記事で「ReactのuseIdを使って上手いこと一意なクラス名を生成しようと思ったけど:がクラス名として使えず断念」と書いたことがありました。

しかし、この事象自体はCSS.escape()を用いれば簡単に解消できることが分かったので備忘録として記事にしました。

CSSのセレクターのルール

以下に記載があります。

今回関係あるものをざっくり説明するなら「クラス名は[_a-z0-9-]かエスケープした文字を使う」が該当します。
厳密に言えばもっと色々ありますが、ひとまず上記のように理解しておけばこの記事の話としては間違いないはずです。

useIdの仕組み

記事の本旨とは関係ありませんが、この問題に行き着いた経緯を記載します。
冒頭に貼った記事にあるように、ReactにおいてuseIdを使うと:からはじまり:から終わる一意なidが生成されます(例 :r0:)。

困っていたこと

CSSセレクターのルールから、:はそのままではクラス名として使えないためエスケープする必要があります。
しかし、先ほど例で:r0:と挙げましたが、公式ドキュメントで明確な書式が提示されているわけではありません。1
:だけにエスケープをかけるので十分なのかなど、微妙に迷いがありました。

CSS.escape()の仕組み

以下の書式で使用します。
strはエスケープしたい対象です。

escapedStr = CSS.escape(str);

先ほどのuseIdで生成したidに適用すると、以下のようになります。

const id = useId()

CSS.escape(id) // => \:r0\:

つまり、最初の記事の内容で言えば、このように指定することで問題なくCSSの指定ができます。

<style>
  {`
    .class-${CSS.escape(id)} {
      color: red;
    }
  `}
</style>

だからとて記事に書いたやりたいことは上手く実現できないのですが、1つ引っかかりが取れました。

参考


最後まで読んでくださってありがとうございます!
Twitterでも情報を発信しているので、良かったらフォローお願いします!

Devトークでお話してくださる方も募集中です!

  1. 古い方のドキュメントでは、:を含むということだけは言及されていますが、新しい方にはその記載も見当たらないように思えます。

12
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?