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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?