• CSSのpointer-events: noneは重ねた飾りをクリック対象から外すときに使う

CSSのpointer-events: noneは重ねた飾りをクリック対象から外すときに使う

公開日: 執筆:佐藤

写真や見出しの上に半透明の色、線、アイコンを重ねると、下にあるリンクやボタンを押せなくなることがある。飾りそのものを操作させないなら、飾りへ pointer-events: none を指定する。画面の前面に置くことと、クリックを受け取ることは別の役割である。

pointer-events は、要素がポインタ操作の対象になる条件を決めるプロパティである。none を指定した要素は表示されたまま、クリックの対象から外れる。前面の飾りを通して、下にあるリンクを押せるようにしたい場面で使う。

クリックを妨げるのは見えている部品とは限らない

リンクの文字を直接押しても反応しないとき、リンク先の指定やスクリプトだけを疑うと遠回りになる。絶対配置した要素や疑似要素が、リンクの上を覆っていることがある。透明度を下げた飾りでも、ポインタを受け取る範囲は残る。

たとえば、写真全体を会社案内へのリンクにして、その上へ暗い色を重ねる場合を考える。

<a class="company-link" href="/company/">
  <img src="company.jpg" alt="会社案内">
  <span class="company-link__shade"></span>
  <span class="company-link__title">会社案内</span>
</a>
.company-link {
  position: relative;
  display: block;
}

.company-link__shade {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: rgba(0, 0, 0, .35);
  pointer-events: none;
}

この span は写真を暗く見せるためだけの部品である。読者が色の層を押して何かを行うわけではない。そこでポインタの対象から外すと、見た目を保ったまま親のリンクを押せる。display: none のように飾りを消す指定ではないため、重なり順や色の濃さを変える必要もない。

指定する要素は役割で決める

クリックできない場所を直すため、重なっている要素へ一律に none を指定してはいけない。閉じるボタン、画像を切り替える矢印、入力欄の説明を開く部品まで対象から外せば、見た目は残っても操作できなくなる。

重ねた要素 操作の役割 判断
写真の上の色、模様、罫線 ない pointer-events: none を指定する候補
飾りのためのアイコン ない 指定する候補
画像を閉じる印 ある 指定しない
次の写真へ進む矢印 ある 指定しない
リンク内の文字 親のリンクを押すためにある 親子の構造を確認して決める
フォームの送信ボタン ある 指定しない

判断は単純である。その部分を読者が押したとき、独自の動作を返すなら対象から外さない。見えるだけで、下のリンクやボタンへ操作を渡すために置いているなら、対象から外す。

重なり順を下げる修正とは目的が違う

前面の飾りが邪魔なら、z-index を下げる方法もある。ただし、飾りを写真や本文の後ろへ回すと、意図した色や線が見えなくなる場合がある。重なり順は表示の順序を決め、pointer-events は操作の受け方を決める。二つを同じ修正として扱わない。

写真の上に薄い格子を見せたいが、リンクは写真のどこを押しても開きたいなら、格子は前面に残してよい。格子へ pointer-events: none を指定する。反対に、前面の部品を押すと詳細を開く設計なら、その部品はリンクと別の操作を持つ。見た目だけの層ではないため、指定してはならない。

疑似要素 :before や :after で飾りを作っている場合も、同じ順で見る。リンク本体の上に疑似要素が広がり、クリックを受け取っていないかを確かめる。親要素の z-index だけを大きくして直ったように見えても、あとで別の層を足したときに同じ問題が戻る。

修正前に操作の範囲を紙へ書き出す

画面を見ながら手当たりしだいに指定を足すより、どこを押せるようにするかを先に決めた方が早い。次のように、画面上の部品を二つに分ける。

区分 例 確認すること
表示だけの部品 背景の色、飾り線、写真の覆い、影 下にある操作を妨げないか
操作する部品 リンク、ボタン、開閉する見出し、入力欄 押したときの動作と押せる範囲が一致しているか

これを決めてから、表示だけの部品に限って pointer-events: none を試す。リンクの一部だけが押せない場合は、文字の周囲、画像の端、飾りの上を順に押す。反応しない場所の形が、重ねた要素の幅や高さと一致するなら、その要素が原因である可能性が高い。

CSSを修正したあとは、リンク先へ移動できるかだけで終わらせない。写真の上、文字の上、ボタンの端をそれぞれ押し、意図していない場所が動かないかを見る。クリックを受けない飾りに :hover の見せ方を付けていたなら、それも必要かを見直す。読者に押してほしい場所と、画面が反応する場所をそろえることが目的である。

対応するブラウザは公開前に実機で確かめる

pointer-events はSVGで使われてきた指定をHTMLへ広げる提案としても整理されている。HTMLで使う場合は、制作対象にしているブラウザで、実際にリンクとボタンを操作して確認する。CSSを読めることと、公開画面で期待どおりに押せることは同じではない。

スマートフォン向けのページでは、マウスで押せたからといって確認を終えない。指で押す位置は広くなり、写真の上に置いた飾りや説明文が意図せず操作を遮ることがある。公開前に、写真の中央、端、文字の上を押し、設計したリンク先へ進むかを見る。問題を見つけたら、まず前面の要素に操作の役割があるかを確かめる。その役割がなければ、pointer-events: none を指定する。

戻る