键盘码值表

按键 keyCode code key 分类

按键检测器

等待按键…
按下的键会实时显示各项码值,可用于排查快捷键冲突
—
—
—
—
收录 152 个按键的 keyCode、code、key 三者映射,支持搜索排序,并内置在线按键检测器实时显示按键信息。

键盘事件里的三个关键属性

在浏览器中处理键盘输入时,事件对象上有三个属性经常被混用,理解它们的区别是写好键盘交互的前提:

属性含义示例值特点
key按键的字符值"a"、"Enter"、"中"受输入法与 Shift 影响,推荐优先使用
code按键的物理位置"KeyA"、"Enter"、"Numpad1"与键盘布局无关,适合做游戏控制
keyCode已废弃的数字编码65、13、97各浏览器实现不一致,仅为兼容而保留

本表收录了 152 个按键的完整映射关系,涵盖字母键、数字键、符号键、功能键、编辑控制键、小键盘、多媒体键等 12 个类别。


为什么 key 和 code 要分开

假设用户在中文输入法下按了字母 A 键:

  • e.key 可能是 "a"(英文状态)或 "Process"(输入法正在组字);
  • e.code 始终是 "KeyA"。

再假设用户用的是 AZERTY 键盘(法国布局),左上角第一个字母键物理位置和 QWERTY 的 Q 相同:

  • e.code 是 "KeyQ";
  • e.key 是 "a"。

结论:需要判断「按了哪个功能」时用 key,需要判断「按了哪个物理键位」时用 code。做 WASD 移动时用 code 才能保证不同键盘布局下手感一致。


关于 keyCode 的现状

keyCode 属于早期的 DOM 事件规范,从未被标准化,且存在明显的跨浏览器差异:

  • 同为字母键,keydown 里返回大写字母的码值(A = 65),keypress 里返回小写(a = 97);
  • 小键盘与主键盘的数字键在不同浏览器下可能返回不同的值;
  • 部分新按键(如多媒体键、Copilot 键)根本没有分配 keyCode,返回 0。

因此新项目不应再依赖 keyCode。本表保留它,主要是为了读懂历史代码、兼容旧系统,以及在排障时对照现象。


那些「没有 keyCode」的按键

表中有几个按键的 keyCode 显示为「无」,这是正常现象。这类按键大多是后期新增的:

按键code说明
睡眠 / 唤醒 / 电源Sleep / WakeUp / PowerACPI 电源管理键,由操作系统接管
亮度减小 / 增大BrightnessDown / BrightnessUp笔记本功能键,常被厂商驱动拦截
ComposeComposeLinux 下的组合键,Windows 无对应实现

遇到这些键时,应该改用 e.code 或 e.key 判断。


使用方式

  1. 查表:在搜索框输入按键名、码值或 code,如 F5、13、ArrowUp;
  2. 排序:点击「按 keyCode 排序」按钮,可以把所有按键按码值从小到大排列,便于对照历史代码;
  3. 检测:在页面下方的「按键检测器」里点击输入框,然后按下键盘上的任意键,即可实时看到该键的 key、code、keyCode 与修饰键状态——这是排查键盘问题最直接的方法。

实用小技巧

判断是否按下了修饰键组合:不要用 e.key === 'Control' 判断,应该读 e.ctrlKey、e.shiftKey、e.altKey、e.metaKey 这四个布尔值。

阻止默认行为要小心:e.preventDefault() 会连带阻止浏览器的快捷键,例如在 keydown 中无条件阻止 Ctrl 组合键,会让用户无法使用 Ctrl+C 复制。

注意输入法的 composition 阶段:在中文、日文输入法组字过程中,keydown 会被触发但 e.key 为 "Process"。需要配合 compositionstart 与 compositionend 事件判断,否则会出现「打字过程中误触发快捷键」的问题。

常见问题 FAQ

数据可以直接用在生产代码里吗?

可以。表中的 code 与 key 取值遵循 W3C UI Events 规范,可直接用于键盘事件的判断逻辑。

表里的按键是怎么分类的?

分为字母键、数字键、符号键、功能键、编辑控制键、方向键、修饰键、小键盘、多媒体键、浏览器与系统键、输入法相关、其他功能键 12 类。

preventDefault 会有什么副作用?

它会连带阻止浏览器默认快捷键。例如在 keydown 中无条件阻止 Ctrl 组合键,用户将无法使用 Ctrl+C 复制、Ctrl+F 查找。

中文输入法下按键事件有什么特殊之处?

组字过程中 keydown 会触发但 e.key 为 Process。需要配合 compositionstart 与 compositionend 事件判断,避免误触发快捷键。

页面上的按键检测器怎么用?

点击检测器里的输入框,然后按下键盘上任意键,页面会实时显示该键的 key、code、keyCode 与当前修饰键状态。

小键盘数字键和主键盘数字键的码值一样吗?

keyCode 相同,但 code 不同。小键盘是 Numpad1 到 Numpad9,主键盘是 Digit1 到 Digit9,需要区分时用 code。

怎么判断用户是否按下了 Ctrl 组合键?

不要判断 e.key 是否为 Control,应该读 e.ctrlKey、e.shiftKey、e.altKey、e.metaKey 这四个布尔值。

同一按键在 keydown 和 keypress 中的 keyCode 不同,正常吗?

正常。keydown 中字母键返回大写码值(A=65),keypress 中返回小写(a=97),这是早期规范的遗留问题。

为什么有些按键的 keyCode 显示为「无」?

睡眠、唤醒、电源、亮度调节、Compose 等后期新增按键没有分配 keyCode,返回 0。这类键应改用 code 或 key 判断。

为什么做游戏控制要用 code 而不是 key?

因为 code 表示物理键位,与键盘布局无关。AZERTY 键盘上用 code 判断 WASD 才能保证手感与 QWERTY 一致,用 key 会导致按键错位。

keyCode 已经被废弃了吗?

是的。keyCode 从未被标准化,存在明显的跨浏览器差异,新项目应使用 key 或 code,保留 keyCode 仅为兼容历史代码。

key、code、keyCode 有什么区别?

key 是按键的字符值(受输入法与 Shift 影响),code 是物理键位(与键盘布局无关),keyCode 是已废弃的数字编码,各浏览器实现不一致。