こんにちは!

今回は、Blocksの更新がうまくいかない原因として非常に多い「CSSセレクタの不一致」について、ウェブサイトのちょっとした変更にも負けない、壊れにくいセレクタを確実に入手する方法をご紹介します。

1. そもそもCSSセレクタって何?

CSSセレクタとは、HTMLという「家」の中にある 「特定のモノ」を指し示すための「住所」や「名前」 だと考えると分かりやすいです。Blocksやブラウザは、この「住所」を使って目的の要素を見つけ出します。

🔑 例え話で理解するセレクタの種類

HTMLの要素を「学校の生徒」に例えてみましょう。

null

セレクタの種類 例え話(生徒の探し方) 特徴
タイプ(要素)セレクタ 「3年A組の生徒全員」 のように、種類で指定する divp など、タグ名で指定します。
クラスセレクタ 「サッカー部に所属している生徒」 のように、共通のグループ名で指定する .soccer_club のように、複数の要素が同じ属性を持ちます。
IDセレクタ 「学籍番号が『12345』の生徒」 のように、一人だけの固有の番号で指定する #main-header のように、HTML文書内で唯一無二の要素を特定します。
属性セレクタ 「赤いメガネをかけている生徒」 のように、持っているアイテムや特徴で指定する <button type="text"> のように特定の属性を持つ要素を選択します。

Blocksでは、「この ボタン(#submit-button) を書き換えたい」と操作対象を正確に伝えるために、このセレクタが必要になります。

2. 「nth」が引き起こすセレクタの不一致

実際によくあるエラーが、セレクタにnth-childnth-of-typeといった 「nth」 が含まれてしまうケースです。

例えば、以下のようなHTMLがあります。

HTML

<div class="product-list">
<div class="item">商品A</div>
<div class="item">商品B</div>
<div class="item">商品C</div>
</div>

この中の「商品B」のセレクタを取得すると以下のようにnthが含まれてしまいます。

.product-list > .item:nth-child(2)

このnthセレクタの最大の落とし穴は、 「要素の中身ではなく、その位置で要素を特定している」 という点です。

疑問:なぜnthで不一致が起きるの?

ウェブサイトのHTML構造は流動的です。サイト開発者が「ちょっとキャンペーンバナーを一番上に追加しよう」としただけで、Blocks側では「2番目だった要素が、知らない間に3番目に移動してしまった!」という事態が起こります。

  • 例①:セレクタに合致する要素が見つからなくなるパターン

先ほどのHTMLに対し、親要素(div.product-list)の先頭に広告が2つ追加されたとします。

<div class="product-list">
    <div class="ad-banner">広告1</div>
    <div class="ad-banner">広告2</div>
    <div class="item">商品A</div>
    <div class="item">商品B</div>
</div>

以前は「2番目の子要素」が商品だったのに、今は「2番目の子要素」が広告になり、セレクタの後半の条件(.itemクラス)に合致しなくなります。

<学校で例えるなら?>

null

先生が「一番目の席」の人を指名したのに、雨漏りで「一番目の席」自体が撤去されてしまった状態です。

  • 例②:セレクタに合致する要素がズレるパターン

    今度は「商品A」の上に「おすすめ」バナーが1つ追加されたとします。

      <div class="product-list">
         <div class="ad-banner">おすすめ!</div> 
         <div class="item">商品A</div>
         <div class="item">商品B</div>
         <div class="item">商品C</div>
      </div>

    nth-child(2)が指す要素は、当初取得したかった「商品B」ではなく、新しい「商品A」に変わってしまいます。この場合、不一致エラーは出ませんが、意図しない要素が書き換えられてしまいます。

<学校で例えるなら?>

null

先生が「一番目の席」の人を指名したけど、席替えがあり「一番目の席」に座っている人が変わってしまった状態です。

3. 解決方法:IDを設定して「名前」で呼び出す

サイト更新に影響されない 鉄壁のセレクタ を作るための結論は、対象のHTML要素に 「一意な名前」を付ける(ID属性) ことです。

①要素に一意なidを設定するHTML

開発チームと連携し、ターゲットにしたい要素(例:「商品B」)に、他の要素と絶対に重複しないidを付与してもらいます。

安定したHTMLの例

    <div class="product-list">
        <div class="item">商品A</div>
        <div class="item" id="**product-item-b-name**">商品B</div>
        <div class="item">商品C</div>
    </div>

②セレクタをidセレクタ(#)に置き換える

複雑なnthセレクタを、シンプルで強力なIDセレクタに置き換えます。

不安定なセレクタ 安定したセレクタ
.product-list > .item:nth-child(2) #product-item-b-name

理解のポイント:idは「唯一無二のマイナンバー」

null

  • class属性「〇〇会社の社員」 のように、複数の人が同じ属性を持つことができます。
  • id属性「マイナンバー」「学籍番号」 のように、HTML文書内に一つだけが持つ、唯一無二の番号です。

この「唯一無二」のIDを極力利用することが、セレクタの不一致というエラーから解放されるための最重要ポイントとなります。すべての要素が難しくても、Blocksの対象となる重要な要素だけでもIDを付与してもらうよう、開発チームに依頼してみましょう!

あとがき

サポートチームへのお問い合わせは 管理画面グローバルナビゲーション > [?] サポートガイド > より可能です!

null

お問い合わせをお待ちしています!