- CSS
CSS cursor一覧とpointer-events:noneでクリック無効
cursorは「要素の上でマウスカーソルをどの形にするか」を決めるプロパティ、pointer-eventsは「その要素がマウスやタッチの対象になるかどうか」を決めるプロパティです。 cursor: pointer でクリックできることを伝え、pointer-events: none でクリックを受け付けなくする、という形でセットで使われます。
この記事では、cursor のキーワード全36値を用途別の一覧表にし、ブラウザで開いてマウスを当てれば形を確かめられるコピペ用のHTMLを載せました。さらに、pointer-events: none と cursor: not-allowed を同じ要素に書くとカーソルが変わらない現象を実際に確かめ、親子に分けて解決するコードを示します。pointer-events: none は Tab キーと Enter キーでは押せてしまうため、disabled・inert・aria-disabled との違いも比較表にまとめています。
cursorとpointer-eventsの早見表
よく使う cursor の値
| 値 | 形(一般的な表示) | 使いどころ |
|---|---|---|
auto |
状況に応じてブラウザが決める(初期値) | 指定を元に戻す |
default |
矢印 | 文字の上でも矢印のままにしたい |
pointer |
指さしの手 | リンク、クリックできる要素 |
text |
I字 | 文字を選択・入力できる場所 |
not-allowed |
丸に斜線 | いまは操作できないことを示す |
wait |
砂時計など | 処理中で操作できない |
progress |
矢印+処理中の印 | 処理中だが操作はできる |
grab / grabbing |
開いた手 / つかんだ手 | ドラッグできる / ドラッグ中 |
move |
十字の矢印 | 移動できる |
help |
矢印+疑問符 | ヘルプや補足がある |
zoom-in / zoom-out |
虫眼鏡 | 拡大 / 縮小 |
col-resize / row-resize |
左右 / 上下の矢印と区切り線 | 列幅 / 行の高さを変える |
none |
表示しない | 動画の全画面表示など |
pointer-events の値
| 値 | 意味 |
|---|---|
auto |
通常どおりマウスやタッチの対象になる(初期値) |
none |
対象にならない。クリックやホバーは下にある要素へ届く |
クリックを無効にする4つの方法
| 方法 | マウスのクリック | Tab で移動 | Enter で実行 | 向いている対象 |
|---|---|---|---|---|
pointer-events: none |
止まる | できる | 実行される | 装飾の重なり、見た目上の無効化 |
disabled 属性 |
止まる | できない | 実行されない | button・input などフォーム部品 |
inert 属性 |
止まる | できない | 実行されない | モーダルの背面など、領域まるごと |
aria-disabled="true" |
止まらない | できる | 実行される | 無効であることを伝えつつフォーカスは残したい(JavaScript で止める) |
この記事で確かめた環境
動作の確認は、Playwright 1.56.0 から起動した Chromium 141.0.7390.37(Linux、画面なしのヘッドレス実行)で行いました。確かめた内容は次のとおりです。
- cursor の36個のキーワードが有効な値として受け付けられること(
CSS.supportsで判定) - マウスの位置でどの要素が対象になるか(
document.elementFromPoint)と、その要素の cursor の計算値 - マウスのクリック、キーボードの Tab と Enter、JavaScript の
click()とfocus()でイベントが起きるかどうか
ヘッドレス実行のため、カーソルの絵そのものは目で見ていません。形の説明は MDN の cursor のページ(今回開いて確認)の記述に基づいています。Firefox と Safari、Windows や macOS での表示は未実行です。
cursor の全値一覧(36個)
MDN の cursor のページに載っているキーワードは次の36個です。Chromium 141 では36個すべてが有効な値として受け付けられました。形は OS やブラウザによって少し異なるため、表の「形」は一般的な表示です。
基本
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
auto |
状況による | ブラウザが内容に応じて決める。文字の上では text と同じになる |
default |
矢印 | その環境の標準のカーソル |
none |
なし | カーソルを表示しない |
リンクと状態
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
context-menu |
矢印+メニュー | コンテキストメニューが使える |
help |
矢印+疑問符 | ヘルプ情報がある |
pointer |
指さしの手 | リンクであることを示す |
progress |
矢印+処理中の印 | 裏で処理中。操作は続けられる |
wait |
砂時計・時計 | 処理中。操作はできない |
選択
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
cell |
太い十字 | 表のセルを選択できる |
crosshair |
細い十字 | 画像上の範囲選択など |
text |
I字 | 文字を選択できる |
vertical-text |
横向きのI字 | 縦書きの文字を選択できる |
ドラッグ&ドロップ
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
alias |
矢印+曲がった矢印 | ショートカットやエイリアスを作る |
copy |
矢印+プラス | コピーする |
move |
十字の矢印 | 移動する |
no-drop |
手や矢印+丸に斜線 | ここにはドロップできない |
not-allowed |
丸に斜線 | 要求された操作は実行されない |
grab |
開いた手 | つかんで動かせる |
grabbing |
握った手 | つかんで動かしている最中 |
サイズ変更とスクロール
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
all-scroll |
四方向の矢印 | どの方向にもスクロール(パン)できる |
col-resize |
左右の矢印と縦線 | 列の幅を変えられる |
row-resize |
上下の矢印と横線 | 行の高さを変えられる |
n-resize |
上向きの矢印 | 上の辺を動かす |
e-resize |
右向きの矢印 | 右の辺を動かす |
s-resize |
下向きの矢印 | 下の辺を動かす |
w-resize |
左向きの矢印 | 左の辺を動かす |
ne-resize |
右上向きの矢印 | 右上の角を動かす |
nw-resize |
左上向きの矢印 | 左上の角を動かす |
se-resize |
右下向きの矢印 | 右下の角を動かす |
sw-resize |
左下向きの矢印 | 左下の角を動かす |
ew-resize |
左右の両矢印 | 左右どちらにも動かせる |
ns-resize |
上下の両矢印 | 上下どちらにも動かせる |
nesw-resize |
右上と左下の両矢印 | 斜め方向に動かせる |
nwse-resize |
左上と右下の両矢印 | 斜め方向に動かせる |
n・e・s・w は北・東・南・西の頭文字で、画面の上・右・下・左に対応します。環境によっては n-resize と ns-resize が同じ両矢印で表示されることがあります。
拡大と縮小
| 値 | 形(一般的な表示) | 意味 |
|---|---|---|
zoom-in |
虫眼鏡+プラス | 拡大できる |
zoom-out |
虫眼鏡+マイナス | 縮小できる |
コピペで確かめる:cursor 一覧のHTML
次のHTMLを cursors.html という名前で保存してブラウザで開くと、36個のマスが並びます。マスにマウスを当てると、その値のカーソルに変わるので、手元の OS とブラウザでの形をそのまま確かめられます。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>cursor 一覧</title>
<style>
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; }
.grid div { padding: 16px 8px; border: 1px solid #ccc; border-radius: 6px; text-align: center; font: 14px/1.2 monospace; }
.grid div:hover { background: #eef6ff; }
</style>
</head>
<body>
<h1>cursor 一覧(マウスを当てて確認)</h1>
<div class="grid" id="grid"></div>
<script>
const values = [
"auto", "default", "none",
"context-menu", "help", "pointer", "progress", "wait",
"cell", "crosshair", "text", "vertical-text",
"alias", "copy", "move", "no-drop", "not-allowed", "grab", "grabbing",
"all-scroll", "col-resize", "row-resize",
"n-resize", "e-resize", "s-resize", "w-resize",
"ne-resize", "nw-resize", "se-resize", "sw-resize",
"ew-resize", "ns-resize", "nesw-resize", "nwse-resize",
"zoom-in", "zoom-out"
];
const grid = document.getElementById("grid");
for (const v of values) {
const cell = document.createElement("div");
cell.textContent = v;
cell.style.cursor = v;
grid.append(cell);
}
</script>
</body>
</html>
このファイルを Chromium 141 で開き、36個のマスが作られ、それぞれの cursor の計算値がマスの文字と一致することを確認しました。
cursor の使い方と書き方
要素ごとの初期状態
cursor を指定していないとき、要素ごとにどの値になるかを Chromium 141 で調べました。
| 要素 | cursor の計算値 |
|---|---|
a(href あり) |
pointer |
button |
default |
input(テキスト) |
text |
label |
default |
select |
default |
summary |
default |
button(disabled) |
default |
リンクは最初から pointer ですが、button は default(矢印)のままです。ボタンにも指さしの手を出したいときは、自分で指定します。
button,
[role="button"],
summary,
label[for] {
cursor: pointer;
}
button:disabled {
cursor: not-allowed;
}
disabled のボタンに cursor: not-allowed を指定した場合、マウスを当てた位置の対象はそのボタン自身で、計算値も not-allowed になることを確認しました。disabled は pointer-events: none と違い、カーソルの指定がそのまま効きます。
画像をカーソルにする(url)
.stamp-area {
cursor: url("stamp.png") 4 12, crosshair;
}
url() の後ろの2つの数字は、画像の左上を 0 0 としたときの「クリック位置(ホットスポット)」です。最後にキーワードを1つ書くことが必須で、画像が読み込めないときはそのキーワードが使われます。Chromium 141 での判定は次のとおりでした。
| 書き方 | 有効な値か |
|---|---|
cursor: url(a.png) 4 12, auto |
有効 |
cursor: url(a.png)(キーワードなし) |
無効(宣言ごと無視される) |
cursor: hand |
無効(pointer を使う) |
カンマで区切って複数の画像を並べると、左から順に使えるものが選ばれます。
状態に合わせて切り替える
.card { cursor: grab; }
.card:active { cursor: grabbing; }
.is-loading { cursor: progress; }
.is-busy { cursor: wait; }
| 伝えたいこと | 選ぶ値 |
|---|---|
| 押せる | pointer |
| いまは押せない | not-allowed |
| 処理中だが他の操作はできる | progress |
| 処理が終わるまで待ってほしい | wait |
| つかんで動かせる | grab → 押している間は grabbing |
| 幅や高さを変えられる | col-resize、row-resize、ew-resize、ns-resize |
| 補足説明がある | help |
cursor は見た目だけを変えるプロパティで、クリックできるかどうかには影響しません。cursor: not-allowed だけを指定したリンクは、クリックすると通常どおり移動しました。操作を止めるには、次に説明する pointer-events や属性を使います。
pointer-events の使い方
基本の動作
.no-click {
pointer-events: none;
}
HTML の要素で使う値は auto(初期値)と none の2つです。MDN の pointer-events のページ(今回開いて確認)には、これ以外に visiblePainted・fill・stroke などの値が載っていますが、それらは SVG 用です。
pointer-events: none を指定したリンクとボタンについて、Chromium 141 で確かめた結果です。
| 操作 | 結果 |
|---|---|
| マウスでクリック | click イベントは起きない。リンクも移動しない |
| マウスを当てる | :hover にならない |
| Tab キー | フォーカスが移る |
| フォーカスした状態で Enter | click イベントが起き、リンクは移動する |
JavaScript の element.click() |
click イベントが起きる |
JavaScript の element.focus() |
フォーカスできる |
止まるのはマウスやタッチなどポインターによる操作だけです。キーボードと JavaScript からの操作はそのまま通ります。MDN にも、pointer-events: none の要素は Tab キーによる順送りのフォーカスを受け取る、と書かれています。
クリックは下の要素に届く
none を指定した要素は対象から外れるので、その下に重なっている要素がクリックやホバーの対象になります。これを利用すると、上に重ねた装飾を「すり抜け」させられます。
<button id="under">下のボタン</button>
<div class="overlay"></div>
#under { position: absolute; top: 0; left: 0; width: 200px; height: 40px; cursor: pointer; }
.overlay { position: absolute; top: 0; left: 0; width: 200px; height: 40px;
background: rgba(0, 0, 0, .2); pointer-events: none; }
重なった位置でマウスの対象を調べると下のボタンが返り、クリックすると下のボタンの click イベントが起きました。グラデーションの重ね、画像の上の飾り枠、透かし文字など、見せるだけの要素に向いた使い方です。
子に継承される。子だけ auto に戻せる
pointer-events は継承されるプロパティです。親に none を指定すると、子もまとめて対象から外れます。子に auto を指定すれば、その子だけ対象に戻せます。
<div class="layer">
<div class="toast">通知メッセージ(ここだけ押せる)</div>
</div>
<button class="behind">背面のボタン</button>
.layer { position: fixed; inset: 0; pointer-events: none; }
.toast { position: absolute; right: 16px; bottom: 16px; pointer-events: auto; cursor: pointer; }
.behind { position: fixed; left: 16px; bottom: 16px; }
画面全体を覆う .layer があっても、背面のボタンはクリックでき(click イベントが1回起きることを確認)、.toast の上では対象が .toast になり cursor も pointer でした。通知やフローティングの部品を、背面の操作を妨げずに重ねたいときの定番の形です。
なお、子を auto に戻した場合、子で起きたクリックは親へ伝わっていきます。親に付けたイベントリスナーは、子がクリックされると呼ばれました。「親に none を付けたから親のリスナーは絶対に動かない」わけではない点を覚えておくと、調査のときに役立ちます。
pointer-events:none と cursor:not-allowed を同じ要素に書くとカーソルが変わらない
「押せないことをカーソルでも伝えたい」と考えて、次のように書くことがあります。
/* 直す前:同じ要素に両方を書く */
.link-off {
pointer-events: none;
cursor: not-allowed;
opacity: .5;
}
この指定では、マウスを当ててもカーソルは not-allowed になりません。Chromium 141 で確かめた結果です。
| 調べたこと | 結果 |
|---|---|
| 要素自身の cursor の計算値 | not-allowed(指定は入っている) |
| その位置でマウスの対象になる要素 | 下にある別の要素(今回は外側の要素) |
| 対象になった要素の cursor | auto |
カーソルの形は「マウスの対象になっている要素」の cursor で決まります。pointer-events: none の要素は対象にならないので、その要素に書いた cursor は使われず、下にある要素の cursor が表示される、という仕組みです。指定が打ち消されたのではなく、出番がなくなっています。
解決:親に cursor、子に pointer-events
外側に1つ要素を足し、役割を分けます。
<span class="off-wrap">
<a href="/next" tabindex="-1" aria-disabled="true">次へ</a>
</span>
/* 直した後:親に cursor、子に pointer-events */
.off-wrap {
display: inline-block;
cursor: not-allowed;
}
.off-wrap > a {
pointer-events: none;
opacity: .5;
}
| 調べたこと | 直す前 | 直した後 |
|---|---|---|
| マウスの対象になる要素 | 外側の別の要素 | .off-wrap(親) |
| 表示に使われる cursor | auto |
not-allowed |
| クリックでの移動 | しない | しない |
| Tab キーで止まるか | 止まる | 止まらない(tabindex="-1" のため) |
子のリンクは対象から外れ、マウスは親の .off-wrap に当たるので、親の cursor: not-allowed が表示に使われます。あわせて tabindex="-1" で Tab キーの移動先から外し、aria-disabled="true" で読み上げソフトにも無効であることを伝えています。
フォーム部品であれば、disabled 属性を使うほうが簡単です。disabled の要素はマウスの対象のままなので、button:disabled { cursor: not-allowed; } の1行でカーソルが変わります。
disabled・inert・aria-disabled との違い
「クリックを無効にする」方法は4つあり、止まる範囲が違います。同じページにボタンを並べ、Chromium 141 で1つずつ確かめました。
| 確かめたこと | pointer-events: none |
disabled |
inert |
aria-disabled="true" |
|---|---|---|---|---|
| マウスのクリックで click が起きる | 起きない | 起きない | 起きない | 起きる |
| Tab キーで止まる | 止まる | 止まらない | 止まらない | 止まる |
focus() でフォーカスできる |
できる | できない | できない | できる |
| フォーカス中の Enter で click が起きる | 起きる | (フォーカスできない) | (フォーカスできない) | 起きる |
element.click() で click が起きる |
起きる | 起きない | 起きる | 起きる |
:disabled に一致する |
しない | する | しない | しない |
マウスを当てると :hover になる |
ならない | なる | ならない | (未確認) |
| その要素の cursor 指定が使われる | 使われない | 使われる | 使われない | 使われる |
| 使える要素 | すべて | フォーム部品と fieldset |
すべて | すべて |
表から読み取れるポイントは次のとおりです。
- キーボードでも確実に止めたいなら
disabledかinert。pointer-events: noneとaria-disabledは、どちらも Enter キーで実行されます。 disabledは JavaScript のclick()も止める唯一の方法でした。inertはマウスとフォーカスを止めますが、click()を直接呼ぶと click イベントは起きました。aria-disabledは「伝えるだけ」で、動作は何も止めません。止める処理は JavaScript で書きます。fieldsetにdisabledを付けると、中のボタンや入力欄がまとめて無効になります。中のボタンは:disabledに一致し、クリックもfocus()も受け付けませんでした。
どれを選ぶかの判断表
| やりたいこと | 選ぶ方法 |
|---|---|
| フォームのボタンや入力欄を無効にする | disabled 属性 |
| 入力欄のグループをまとめて無効にする | fieldset に disabled |
| モーダルを開いている間、背面の領域全体を操作させない | 背面の要素に inert |
リンク(a 要素)を一時的に無効に見せる |
href を外すのが基本。残すなら pointer-events: none+tabindex="-1"+aria-disabled="true" |
| 無効な理由をフォーカス時に伝えたい | aria-disabled="true"+JavaScript で処理を止める |
| 上に重ねた装飾を無視して下を押させたい | 装飾に pointer-events: none |
| 送信中の二重クリックを止めたい | ボタンに disabled(送信処理の先頭で付ける) |
a 要素には disabled 属性がありません。リンクを無効にしたいときは、href 属性を外すとリンクとして扱われなくなり、クリックも Tab キーでの移動も起きなくなります。Chromium 141 でも、href のない a 要素は focus() でフォーカスできず、cursor の計算値も auto で、リンク用の疑似クラス :any-link に一致しないことを確認しました。
aria-disabled と JavaScript で「押せるが実行しない」ボタンを作る
disabled のボタンはフォーカスできないため、キーボードや読み上げソフトの利用者が「ボタンがあること」「なぜ押せないか」に気づきにくい場合があります。フォーカスを残したいときは aria-disabled を使い、処理を JavaScript で止めます。
<button id="save" type="button" aria-disabled="true">保存</button>
<span id="msg" role="status"></span>
[aria-disabled="true"] {
cursor: not-allowed;
opacity: .5;
}
const save = document.getElementById("save");
save.addEventListener("click", (e) => {
if (save.getAttribute("aria-disabled") === "true") {
e.preventDefault();
document.getElementById("msg").textContent = "必須項目を入力すると保存できます";
return;
}
document.getElementById("msg").textContent = "保存しました";
});
Chromium 141 で、aria-disabled="true" のままフォーカスして Enter を押すと「必須項目を入力すると保存できます」が表示され、属性を false に変えてクリックすると「保存しました」が表示されることを確認しました。この方法では pointer-events: none を使っていないので、cursor: not-allowed もそのまま効きます。
モーダルの背面を inert でまとめて止める
<main id="page" inert>
<a href="/list">一覧へ</a>
<button type="button">編集</button>
</main>
<div role="dialog" aria-modal="true" aria-label="確認">
<p>保存しますか?</p>
<button type="button">保存する</button>
</div>
inert を付けた要素の中は、マウスの対象にならず、focus() でもフォーカスできず、Tab キーでも止まりませんでした。モーダルを閉じるときに inert 属性を外せば元に戻ります。inert の中にあるリンクに cursor: pointer を指定しても、マウスの対象が外側の要素になるため、pointer-events: none と同じくカーソルは変わりませんでした。
目的別のコピペ用コード
現在のページのリンクを押せなくする
<nav>
<a href="/">ホーム</a>
<a href="/articles" aria-current="page">記事</a>
<a href="/about">会社情報</a>
</nav>
nav a[aria-current="page"] {
pointer-events: none;
font-weight: bold;
text-decoration: none;
}
クリックしてもページの移動が起きないことを確認しました。現在地のリンクは、押しても同じページが開くだけなので、Tab キーで到達できても支障がありません。こうした「止まらなくても困らない」場面が、pointer-events: none の得意な使いどころです。
送信中のボタンを無効にする
<form id="f">
<input name="title" required>
<button id="submit" type="submit">登録する</button>
</form>
#submit:disabled {
cursor: progress;
opacity: .6;
}
const form = document.getElementById("f");
const button = document.getElementById("submit");
form.addEventListener("submit", () => {
button.disabled = true;
button.textContent = "送信中…";
});
二重送信を防ぐ目的では、キーボードの Enter も止まる disabled を使います。Chromium 141 で、ボタンをクリックした直後に Enter キーとクリックをもう一度ずつ送っても、submit イベントは1回だけで、ボタンの文字が「送信中…」に変わることを確認しました(確認用に、ページ移動を止める処理を足しています)。通信が終わったら button.disabled = false で元に戻します。
アイコンがクリックを横取りしないようにする
ボタンの中に SVG のアイコンを入れると、クリックしたときの event.target がアイコンになることがあります。アイコン側を対象から外すと、常にボタンが対象になります。
button > svg,
button > img {
pointer-events: none;
}
この指定を入れた状態で SVG の上をクリックすると、event.target がボタンになることを確認しました。event.target を見て処理を分けているコードや、data- 属性をボタンから読み取っているコードが安定します。
入力欄の上に置いたアイコンをすり抜けさせる
.search { position: relative; }
.search .icon {
position: absolute; left: 8px; top: 50%; transform: translateY(-50%);
pointer-events: none; /* アイコンの上をクリックしても入力欄にフォーカスが入る */
}
.search input { padding-left: 32px; }
アイコンの位置をクリックすると、下にある入力欄にフォーカスが入ることを確認しました。アイコンを label 要素で作って入力欄と結び付ける方法もありますが、飾りとして置くだけならこの1行で足ります。
文字を選択させたくないときは user-select
pointer-events: none を付けると、その要素の文字はマウスでなぞって選択することもできなくなります。「クリックは通したいが、文字の選択だけ止めたい」という場合は、別のプロパティである user-select: none を使います(今回は未実行です)。
.label-only {
user-select: none;
}
| 目的 | 使うプロパティ |
|---|---|
| クリックやホバーの対象から外す | pointer-events: none |
| 文字の選択だけを止める | user-select: none |
| カーソルの形だけを変える | cursor |
うまく効かないときのチェックリスト
| 症状 | 確かめること | 対処 |
|---|---|---|
cursor: not-allowed にならない |
同じ要素に pointer-events: none がないか |
親に cursor、子に pointer-events を分ける |
cursor: pointer にならない |
上に別の要素が重なっていないか(開発者ツールで要素を選択) | 重なっている要素に pointer-events: none |
cursor: url(...) が効かない |
最後にキーワードがあるか | , auto などを末尾に書く |
pointer-events: none なのに押せる |
キーボードの Enter で実行されていないか | disabled か tabindex="-1" を併用 |
pointer-events: none なのに click が起きる |
JavaScript から click() を呼んでいないか、子が auto になっていないか |
処理側で状態を確かめる |
ツールチップや :hover が出なくなった |
対象に pointer-events: none を付けていないか |
親要素でホバーを受ける |
| 子まで押せなくなった | 親の pointer-events: none が継承されている |
子に pointer-events: auto |
| クリックが思わぬ要素に届く | none の要素の下に別の要素がある |
重なり順と配置を見直す |
pointer-events: none の要素では :hover も title 属性のツールチップも働きません。無効なボタンに説明を出したいときは、外側の要素でホバーを受けるか、aria-disabled の方法に切り替えます。
よくある質問
Q. cursor: pointer は、すべてのボタンに付けるべきですか?
A. 決まりはありません。ブラウザの初期状態ではリンクだけが pointer で、ボタンは default です。押せる要素に pointer を付けて統一するサイトも多く、どちらの方針でも、サイト内でそろっていることが大切です。
Q. pointer-events: none を付ければ、ボタンを無効にしたことになりますか?
A. マウスとタッチでは押せなくなりますが、Tab キーでフォーカスして Enter を押すと実行されます。フォームの送信や削除など、実行されると困る操作には disabled を使い、サーバー側でも状態を確かめるのが確実です。
Q. スマートフォンでも cursor は関係ありますか? A. タッチ操作ではカーソルが表示されないため、cursor の指定は見た目に影響しません。一方、pointer-events はタッチにも適用されます(タッチ端末での動作は今回未実行です)。押せない状態は、色や透明度、文言でも伝えるようにします。
Q. pointer-events: none の要素に付けたイベントリスナーは、絶対に呼ばれませんか?
A. マウスで直接その要素を対象にすることはできませんが、キーボードの Enter、JavaScript の click()、auto に戻した子からの伝播では呼ばれます。今回の確認でも、この3つのいずれでもリスナーが動きました。
まとめ
- cursor のキーワードは36個。 よく使うのは
pointer・not-allowed・wait・progress・grab・textで、掲載した HTML を開けば手元の環境での形を確かめられます。 - リンクの初期状態は
pointer、ボタンはdefault。 ボタンに手のカーソルを出すなら自分で指定します。 pointer-events: noneはマウスとタッチだけを止めます。 Tab と Enter、JavaScript のclick()では実行されます。pointer-events: noneとcursorを同じ要素に書くと、cursor は使われません。 親にcursor: not-allowed、子にpointer-events: noneと分けると表示されます。- キーボードも止めるなら
disabledかinert。disabledはフォーム部品用、inertは領域まるごと用です。 aria-disabledは状態を伝えるだけなので、JavaScript で処理を止めます。フォーカスを残して理由を伝えたいときに向いています。- 重ねた装飾をすり抜けさせる用途が、
pointer-events: noneの最も得意な場面です。
参考・出典
- MDN Web Docs「cursor」(今回開いて、キーワードの一覧と url の書き方を確認)
- MDN Web Docs「pointer-events」(今回開いて、値・継承・Tab キーでのフォーカスに関する記述を確認)
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。