pointer-events lets you switch whether an element can be targeted by mouse/touch/pointer actions, so overlays or decorations don’t block clicks and the element behind can still be interacted with.
pointer-events は「この要素は“クリック(タップ)対象になれる?それとも、触れない存在にする?”を切り替えるCSS」です。見た目はそのまま残しつつ、操作だけを通したり止めたりできるので、オーバーレイや装飾レイヤーが邪魔になる場面で特に効きます。
ブラウザはクリックされた座標に対して「どの要素がクリック対象か」を判断し、その要素をイベントのターゲットにします。この“ターゲット選び”の段階で、pointer-events は効きます。
pointer-events: auto;pointer-events: none;「透明にする(opacity: 0)」や「隠す(display: none)」と違い、pointer-events は 見た目を残したまま操作だけ切る のが得意です。
いちばん多いのはこれです。「上に乗せた飾り(疑似要素や半透明の膜)が、下のリンクのクリックを吸ってしまう」問題。
HTML
<div class="demoCard">
<a href="#">カードのリンク(クリックできる想定)</a>
<div class="demoOverlay" aria-hidden="true"></div>
</div>
CSS
.demoCard {
position: relative;
}
.demoOverlay {
position: absolute;
inset: 0;
/* 見た目はあるけど、触れない飾りにする */
pointer-events: none;
}
ここで覚えるコツ
pointer-events: none が相性抜群aria-hidden="true" もセットにすると安全寄りHTML要素で実用上まず覚えるのは、auto と none の2つが中心です。
CSS
.decoration {
pointer-events: none;
}
これだけで「見た目は残したまま、クリックは下へ通す」が作れます。
“膜”は触れないけど、膜の上にあるボタンだけ押せる、という構成ができます。
背後の操作は通したいけど、ここだけ押せる…みたいな場面を想像してください。
HTML
<div class="tutor">
<button class="tutorButton" type="button">ここだけ押せる</button>
<div class="tutorOverlay" aria-hidden="true"></div>
</div>
CSS
.tutor {
position: relative;
}
.tutorOverlay {
position: absolute;
inset: 0;
/* 基本は全部“触れない膜” */
pointer-events: none;
}
.tutorButton {
/* この要素だけ“触れる” */
pointer-events: auto;
}
ただし注意(実務メモ)
クリック問題のデバッグで迷子になりやすいので、ここは先に整理しておくと強いです。
opacity: 0visibility: hiddendisplay: nonez-indexpointer-events のほうが素直なことが多いです。pointer-events は、あくまでポインター入力(マウス・タッチ・ペン)に関する“当たり判定”です。なので、次のことが起きえます。
「本当に無効化したい」のか、「クリックだけ止めたい」のかで、対策が変わります。
disabled が第一候補HTML
<button type="button" disabled>
処理中…
</button>
aria-disabled="true" は “無効っぽい” を伝えるための属性(動作は自動で止まりません)tabindex="-1" も検討つまり、pointer-events は「クリック停止の部品」。無効化の完成形にするには、周辺の設計も一緒に整えるのが実務です。
CSS
.button::before {
content: "";
position: absolute;
inset: 0;
/* 飾りは触らせない */
pointer-events: none;
}
CSS
.isDragging {
pointer-events: none;
}
JSでドラッグ開始時に isDragging を付け、終了で外す…のように使います。ドラッグ中の誤クリックを減らすのに効きます。
CSS
.isDisabledLike {
pointer-events: none;
opacity: 0.55;
cursor: not-allowed;
}
pointer-events は「イベントがDOMツリーをどう伝わるか(バブリング/キャプチャ)」を変えるというより、ターゲットに選ばれるかどうか を変えます。ここを押さえると、原因切り分けが速くなります。
デバッグのコツ
pointer-events を確認opacity / position / z-index)を疑う::before/::after)は普通にクリックを吸うので、最初に疑う価値ありevent.target)も確認HTML要素では auto / none が主役ですが、SVGでは「塗り(fill)だけ当たり判定」「線(stroke)だけ当たり判定」など、より細かい制御が必要になることがあります。
実務メモ(深入りしすぎない版)
pointer-events を調べどきですauto/none を使いこなしてからでも遅くありませんpointer-events: none; にすると何が起きますか?opacity: 0)なのにクリックを邪魔するのはなぜ?pointer-events: none を検討します。none を付けたら、子も全部押せなくなりますか?pointer-events: auto を付けて「子だけ押せる」にできるケースがあります(オーバーレイ+ボタンなど)。disabled、それ以外は aria-disabled とJSガードも検討してください。touch-action 側の影響も受けます。opacity: 0 の要素が上に残っている可能性。不要なら消す、消せないなら pointer-events: none を付けてクリックを通します。::before/::after に当たり判定があることが多いです。疑似要素側に pointer-events: none を付けます。pointer-events はクリック系だけ。disabled / aria-disabled / tabindex / JSガードを検討します。