Fabric.js - 解决IE下鼠标拖动画布功能失效问题(无法取到movementX、movementY)
1,问题描述
2,问题原因
问题在于下面的“mouse:move”事件响应代码,IE 下获取不到 e.e.movementX 和 e.e.movementY 的值(返回都是 undefined),从而造成画布无法移动。
//鼠标移动
canvas.on('mouse:move', function (e) {
if (panning && e && e.e) {
var delta = new fabric.Point(e.e.movementX, e.e.movementY);
canvas.relativePan(delta);
}
});
3,解决办法
这里对“mouse:move”事件响应代码稍作修改:在取不到 movementX 和 movementY 的情况下,通过计算两次鼠标事件的 screenX 和 screenY 的差值得到移动距离,从而支持 IE 浏览器。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
canvas {
border: 1px dashed black;
}
</style>
<script src="fabric.js"></script>
<script src="jquery-3.1.1.js"></script>
<script src="jquery.mousewheel.js"></script>
<script>
var canvas;
//是否拖动
var panning = false;
//前一个鼠标移动事件
var previousEvent;
window.onload = function() {
canvas = new fabric.Canvas('canvas');
var rect1 = new fabric.Rect({top: 50, left: 50, width: 70, height: 70, fill: 'red'});
canvas.add(rect1);
var rect2 = new fabric.Rect({top: 50, left: 150, width: 70, height: 70, fill: 'red'});
canvas.add(rect2);
var rect3 = new fabric.Rect({top: 50, left: 250, width: 70, height: 70, fill: 'red'});
canvas.add(rect3);
//鼠标按下
canvas.on('mouse:down', function (e) {
//按住alt键才可拖动画布
//if(e.e.altKey) {
panning = true;
canvas.selection = false;
//}
});
//鼠标抬起
canvas.on('mouse:up', function (e) {
panning = false;
canvas.selection = true;
});
//鼠标移动
canvas.on('mouse:move', function (e) {
if (panning && e && e.e) {
var x = e.e.movementX;
var y = e.e.movementY;
if(!x) {
x = e.e.screenX - previousEvent.e.screenX;
y = e.e.screenY - previousEvent.e.screenY;
}
var delta = new fabric.Point(x, y);
canvas.relativePan(delta);
}
previousEvent = e;
});
//鼠标滚轮监听
$(".upper-canvas").mousewheel(function(event) {
var zoom = (event.deltaY > 0 ? 0.1 : -0.1) + canvas.getZoom();
zoom = Math.max(0.1,zoom); //最小为原来的1/10
zoom = Math.min(3,zoom); //最大是原来的3倍
var zoomPoint = new fabric.Point(event.pageX, event.pageY);
canvas.zoomToPoint(zoomPoint, zoom);
});
}
</script>
</head>
<body>
<canvas id="canvas" width="600" height="160"></canvas>
</body>
</html>
