《TypeScript图形渲染实战:2D架构设计与实现》 —3.3.4 鼠标单击事件测试

举报
华章计算机 发表于 2019/12/12 19:31:16 2019/12/12
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第3章,第3.3.4节,作者是步磊峰。

3.3.4  鼠标单击事件测试

  如图3.12所示,分别在canvas元素的左上角和右下角单击两次,输出了两次单击后的结果,通过输出结果可以了解以下几点:

* 在左上角处使用一个方块标记出原点,该原点就是viewport的原点。canvas . getBounding Rect ( )方法和evt . ClientX / ClientY都是相对该原点的偏移量。

* canvas . getBoundingRect ( )方法调用后,获得canvas相对viewport的偏移量为[8 , 31],其尺寸是[300 , 300]。而当前鼠标指针相对viewport的偏移量是[9 , 32],因此转换到相对canvas坐标系中表示为[1 , 1]([9 - 8 , 32 - 31]),这是正确的。

* 在3.2.2节中,在CSS中明确地规定了canvas的margin为0px,但是我们会发现在Chrome浏览器中canvas仍旧与viewport之间有[8 , 8]个像素的偏移(如果去掉<div>元素及两个<button>子元素,y轴也是偏移8个像素)。

 从上面最后一条内容,又可以引申出两个问题,如下所述。

  (1)为什么明确地设置了canvas的margin为0px,却仍然与viewport有8个像素的偏移?

  关于这个问题,首先要说明的一点是,笔者在Chrome、Firefox、Opera、Safari、Edge,以及IE 11中测试了一下,发现canvas与viewport之间都是[8 , 8]像素的偏移。

  其次在测试过程中发现,Microsoft公司的Edge和IE 11中MouseEvent . clientX / clientY返回的是浮点数,而其他浏览器都是整数。笔者查阅了MDN关于MouseEvent ClientXs属性的文档(https ://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX),里面有相关说明:Originally, this property was defined as a long integer. The CSSOM View Module redefined it as a double float.(原本,ClientX这个属性被定义为长整型,而在CSSOM View Module中被重新定义为双精度浮点数),而Microsoft公司的实现显然是使用了双精度浮点数。

  最后如果想取消canvas和viewport之间8个像素的偏移,可以输入如下代码:

  

body {

    background : #eeeeee ;

    margin : 0px ;

}

  

  这也是笔者经过测试后找到的解决方案(笔者的CSS水平有限),不是canvas和viewport之间有8个像素的margin,而是body元素与viewport之间有8个像素的margin。当然还可以*选择器,选择所有的元素,使其margin都为0px,代码如下:

  

*  {

    margin : 0px ;

 }

  

  (2)margin、border和padding等这些CSS盒模型属性对application的坐标变换私有方法_viewportToCanvasCoordinate是否有影响?

  这个问题稍微有点复杂,使用已经实现的一个Demo来更好地理解盒模型与变换之间的关系,具体请看下一节的内容。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。