首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在拉斐尔的文件坐标中得到一个事件?

如何在拉斐尔的文件坐标中得到一个事件?
EN

Stack Overflow用户
提问于 2013-03-06 20:12:51
回答 3查看 2.9K关注 0票数 0

我想在拉斐尔的文件坐标中得到鼠标事件的坐标。我希望这些都是准确的,即使我已经使用了setViewBox。

请参阅http://jsfiddle.net/CEnBN/

下面创建一个10x10绿色的盒子,然后放大-该框的中心在视图的起源。

代码语言:javascript
复制
var paper = Raphael(10, 50, 320, 200);

var rect = paper.rect(0, 0, 10, 10);
rect.attr('fill', 'green');

rect.mousedown(function (event, a, b) {
    $('#here').text([a, b]);
    console.log(event);
});

paper.setViewBox(5, 5, 10, 10);

我想收到的点击坐标,反映他们的位置在盒子里。即。其范围应从(5-10,5-10)不等。

注意:很久以后,我迁移到了D3.js --这通常会让我更快乐。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-12 12:55:06

编辑:使用clientX/Y的鼠标事件简化-删除需要获取元素偏移量

这是我想出来的。基本上,通过使用文件的客户端重排和鼠标事件的clientX/Y,将鼠标位置更正为相对于纸张。然后将校正后的位置与客户的宽度/高度进行比较,然后根据原始纸张的尺寸计算结果:

代码语言:javascript
复制
var paper = Raphael(10, 50, 320, 200);

var rect = paper.rect(0, 0, 10, 10);
rect.attr('fill', 'green');

rect.mousedown(function (event, a, b) {
    // get bounding rect of the paper
    var bnds = event.target.getBoundingClientRect();

    // adjust mouse x/y
    var mx = event.clientX - bnds.left;
    var my = event.clientY - bnds.top;

    // divide x/y by the bounding w/h to get location %s and apply factor by actual paper w/h
    var fx = mx/bnds.width * rect.attrs.width
    var fy = my/bnds.height * rect.attrs.height

    // cleanup output
    fx = Number(fx).toPrecision(3);
    fy = Number(fy).toPrecision(3);

    $('#here').text('x: ' + fx + ', y: ' + fy);
});

paper.setViewBox(5, 5, 10, 10);

更新的小提琴链接如下:http://jsfiddle.net/CEnBN/3/

更紧凑的鼠标下功能版本:

代码语言:javascript
复制
rect.mousedown(function (event, a, b) {
    var bnds = event.target.getBoundingClientRect();
    var fx = (event.clientX - bnds.left)/bnds.width * rect.attrs.width
    var fy = (event.clientY - bnds.top)/bnds.height * rect.attrs.height

    $('#here').text('x: ' + fx + ', y: ' + fy);
});
票数 1
EN

Stack Overflow用户

发布于 2013-03-07 04:01:02

您需要抵消结果,如下所示:

代码语言:javascript
复制
var posx, posy;

var paper = Raphael("canvas", 320, 200);

var rect = paper.rect(0, 0, 10, 10);
rect.attr('fill', 'green');

rect.mousedown(function (e, a, b) {
    posx = e.pageX - $(document).scrollLeft() - $('#canvas').offset().left;
    posy = e.pageY - $(document).scrollTop() - $('#canvas').offset().top;
    $('#here').text([posx, posy]);
    console.log(e);
});

paper.setViewBox(5, 5, 10, 10);

我为Raphaeljs添加了一个目标元素,看看这是你的小提琴手的更新

票数 0
EN

Stack Overflow用户

发布于 2014-02-12 11:00:20

gthmb的答案很好,但遗漏了一个细节--纸上矩形的位置。只有当矩形位于位置(0,0)时,此版本才能工作。为了支持翻译的情况,将矩形的位置添加到结果中:

代码语言:javascript
复制
function mouseEvent_handler(e) {
    var bnds = event.target.getBoundingClientRect();
    var bbox = this.getBBox();
    var fx = (event.clientX - bnds.left)/bnds.width * rect.attrs.width + bbox.x;
    var fy = (event.clientY - bnds.top)/bnds.height * rect.attrs.height + bbox.y;

    $('#here').text('x: ' + fx + ', y: ' + fy);
}

这里是小提琴的修改版本:http://jsfiddle.net/zJu8b/1/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15257059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档