滚轮事件
在 Web 开发中监听鼠标滚轮事件时,不同浏览器存在差异。下面是对 onmousewheel、DOMMouseScroll 和标准 wheel 事件的完整说明和兼容写法。
🌀 onmousewheel 事件概览
onmousewheel 是早期浏览器(如 IE 和 Chrome)支持的鼠标滚轮事件。- Firefox 不支持
onmousewheel,而是使用 DOMMouseScroll。
element.onmousewheel = function(e) {console.log('滚轮滚动:', e.wheelDelta);
};
🦊 Firefox 中使用 DOMMouseScroll
DOMMouseScroll 是 Firefox 早期版本支持的事件,只能使用 addEventListener 绑定:
element.addEventListener('DOMMouseScroll', function(e) {console.log('Firefox 滚轮滚动:', e.detail);
});
✅ 推荐使用现代标准事件 wheel
element.addEventListener('wheel', function(e) {console.log('标准滚动事件:', e.deltaY);
});
e.deltaY > 0 表示向下滚,< 0 表示向上滚
🧩 跨浏览器统一写法
function addMouseWheel(element, handler) {if ('onwheel' in document) {element.addEventListener('wheel', handler);} else if ('onmousewheel' in document) {element.addEventListener('mousewheel', handler);} else {element.addEventListener('DOMMouseScroll', handler);}
}addMouseWheel(document, function(e) {e = e || window.event;const delta = e.wheelDelta || -e.detail || -e.deltaY;if (delta > 0) {console.log('🟢 向上滚');} else {console.log('🔻 向下滚');}e.preventDefault ? e.preventDefault() : (e.returnValue = false);
});
✅ 注意点
- wheelDelta 表现向上/下滚动的数值,但在火狐中需要使用detail
- 当滚轮滚动时,若浏览器有滚动条,滚动条会随之滚动,若不希望发生,则使用return false 取消
- 使用addEventListener()方法绑定响应函数,取消默认行为时不能使用return false,需要使用event.preventDefault()
- IE8 中,event.preventDefault()不能使用
✅ 总结对比表格
| 事件名 | 支持浏览器 | 是否标准 | 如何绑定 |
|---|
onmousewheel | Chrome、IE | ❌ 非标准 | onmousewheel 或 addEventListener |
DOMMouseScroll | Firefox | ❌ 非标准 | 只能用 addEventListener |
wheel | 所有现代浏览器 | ✅ 推荐使用 | 推荐使用 addEventListener |
键盘事件
在 Web 开发中,键盘事件是用户交互中非常常见的一类。主要有三个核心事件:
keydown:键盘按下时触发(持续触发)keypress:按下字符键时触发(已废弃)keyup:键盘释放时触发
1️⃣ keydown
- 事件在按键被按下时触发。
- 适用于所有键(包括功能键如 Ctrl、Shift、Arrow 等)。
- 可以持续触发(长按)。
document.addEventListener('keydown', function(e) {console.log('按下:', e.key, e.code);
});
2️⃣ keypress(⚠️ 已废弃)
- 只对字符键有效(如 a-z、0-9、空格等)。
- 功能键(如 Shift、Enter、Esc)不会触发该事件。
- 在现代浏览器中已经被弃用,不推荐使用。
document.addEventListener('keypress', function(e) {console.log('keypress:', e.key);
});
⚠️ 建议改用 keydown 代替。
3️⃣ keyup
- 在键盘释放时触发。
- 常用于输入完成后的处理,例如表单提交、命令执行等。
document.addEventListener('keyup', function(e) {console.log('松开:', e.key);
});
🔑 常用属性说明
| 属性 | 说明 |
|---|
e.key | 按下的键的值(如 “a”, “Enter”) |
e.code | 实体键的编码(如 “KeyA”, “Enter”) |
e.keyCode | 旧标准中的键码(已废弃,仍可用) |
e.ctrlKey | 是否按住了 Ctrl 键 |
e.shiftKey | 是否按住了 Shift 键 |
e.altKey | 是否按住了 Alt 键 |
🔄 键值举例(e.key)
| 键 | e.key 值 | e.code 值 |
|---|
| A | “a” / “A” | “KeyA” |
| Enter | “Enter” | “Enter” |
| 空格 | " " | “Space” |
| Shift | “Shift” | “ShiftLeft” / “ShiftRight” |
| ↑(上箭头) | “ArrowUp” | “ArrowUp” |
🧩 实战示例:检测组合键 Ctrl + S
document.addEventListener('keydown', function(e) {if (e.ctrlKey && e.key.toLowerCase() === 's') {e.preventDefault(); alert('已触发 Ctrl + S');}
});
✅ 总结对比表
| 事件名 | 触发时机 | 是否支持所有键 | 是否被废弃 |
|---|
keydown | 键按下时 | ✅ 是 | ❌ 否 |
keypress | 字符键按下时 | ❌ 仅字符键 | ⚠️ 是 |
keyup | 键释放时 | ✅ 是 | ❌ 否 |
📌 小贴士
- 开发中推荐使用
keydown + keyup,不要再使用 keypress。 - 若需判断组合键(如 Ctrl + S、Alt + F4),可配合
e.ctrlKey、e.altKey 使用。 e.keyCode 虽然仍可用,但已被标准废弃,应改用 e.key 和 e.code。
利用左右上下,让页面中的方块移动
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style>.circle {width: 100px;height: 100px;background-color: red;position: absolute;}</style></head><body><div class="circle" id="box1"></div></body><script type="text/javascript">let box1 = document.getElementById("box1");document.onkeydown = function(event) {event = event || window.event;if (event.keyCode == 37) {box1.style.left = box1.offsetLeft- 10 +"px";console.log(box1.style.left)}if (event.keyCode == 39) {box1.style.left = box1.offsetLeft+10 +"px";console.log(box1.style.left)}if (event.keyCode ==38) {box1.style.top = box1.offsetTop-10 +"px";console.log(box1.style.top)}if (event.keyCode ==40) {box1.style.top = box1.offsetTop+10 +"px";console.log(box1.style.top)}return false}</script>
</html>