加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Html5 Canvas实现图片标志、缩放、移动和生涯汗青状态成果 (附转换公式)

发布时间:2020-03-28 23:36:22 所属栏目:编程 来源:站长网
导读:副问题#e# 哈哈哈俺又来啦,这次带来的是canvas实现一些画布成果的文章,但愿各人喜好! 媒介 由于也是大三了,最近俺也在找演习,之前有一个本身的小项目: https://github.com/zhcxk1998/School-Partners 口试官说可以往深条理思索一下,或者加一些新的功
副问题[/!--empirenews.page--]

哈哈哈俺又来啦,这次带来的是canvas实现一些画布成果的文章,但愿各人喜好!

媒介

由于也是大三了,最近俺也在找演习,之前有一个本身的小项目:

https://github.com/zhcxk1998/School-Partners

口试官说可以往深条理思索一下,或者加一些新的成果来增进项目标难度,他提了几个提议,个中一个就是 试卷在线批阅,先生可以在上面临功课举办讲明,圈圈点点等 俺当天晚上就开始研究这个东东哈哈哈,终于被我研究出来啦!

回收的是 canvas 绘制画笔,由css3的 transform 属性来举办平移与缩放,之后再具体先容先容

(但愿各人可以留下名贵的赞与star嘻嘻)

结果预览

动图是放cdn的,假如会见不了,可以登录在线实行实行:

公式推导 假如不想看公式怎样推导,可以直接跳过看后头的详细实现~ 1. 坐标转换公式 转换公式先容

着实一开始也是想在网上找一下有没有相干的资料,可是痛惜找不到,以是就本身逐步的推出来了。我就举一下横坐标的例子吧!

通用公式

这个公式是暗示,通过公式来将鼠标按下的坐标转换为画布中的相对坐标,这一点尤为重要

(transformOrigin - downX) / scale * (scale-1) + downX - translateX = pointX

参数表明

transformOrigin: transform变革的基点(通过这个属性来节制元素以那边举办变革)
downX: 鼠标按下的坐标(留意,用的时辰必要减去容器左偏移间隔,由于我们要的是相对付容器的坐标)
scale: 缩放倍数,默以为1
translateX: 平移的间隔

推导进程

这个公式的话,着实就较量通用,可以用在此外操作到 transform 属性的场景,至于怎么推导的话,我是用的笨步伐

详细的测试代码,放在文末,必要自取~

1. 先做出两个沟通的元素,然后标志上坐标,而且配置容器属性 overflow:hidden 来潜匿溢出内容

ok,此刻就有两个一样的矩阵啦,我们为他标志上一些红点,然后我们对左边的举办css3的样式变革 transform

矩形的宽高是 360px * 360px 的,我们界说一下他的变革属性,变革基点选择正中心,放大3倍

// css transform-origin: 180px 180px; transform: scale(3, 3);

获得如下功效

ok,我们此刻比拟一下上面的功效,就会发明,放大3倍的时辰,刚好是中间玄色方块占有了所有宽度。接下来我们就可以对这些点与原先没有举办变革(右边)的矩形举办比拟就可以获得他们坐标的相关啦

2. 开始对两个坐标举办比拟,然后推出公式

此刻举一个简朴的例子吧,譬喻我们算一下左上角的坐标(此刻已经标志为黄色了)

着实我们着实就可以直接默算出来坐标的相关啦

( 这里左边计较坐标的值是我们鼠标按下的坐标 )

( 这里左边计较坐标的值是我们鼠标按下的坐标 )

( 这里左边计较坐标的值是我们鼠标按下的坐标 )

由于宽高是 360px ,以是分成3等份,每份宽度是 120px

由于变革之后容器的宽高是稳固的,变革的只有矩形自己

我们可以得出左边的黄色标志坐标是 x:120 y:0 ,右边的黄色标志为 x:160 y:120 (这个着实肉眼看应该就能看出来了,其实不可可以用纸笔算一算)

这个坐标也许有点非凡,我们再换几个来计较计较(按照非凡推一样平常)

蓝色标志:左边: x:120 y:120 ,右边: x: 160 y:160 绿色标志:左边: x: 240 y:240 ,右边: x: 200: y:200

好了,我们差不多已经可以拿到坐标之间的相关了,我们可以列一个表

还认为不安心?我们可以换一下,缩放倍数与容器宽高档举办计较

不知道各人有没有感受呢,然后我们就可以逐步按照坐标推出通用的公式啦

(transformOrigin - downX) / scale * (scale-1) + down - translateX = point

虽然,我们或者尚有这个 translateX 没有实行,这个就较量简朴一点了,脑内模仿一下,就知道我们可以减去位移的间隔就ok啦。我们测试一下

我们先修改一下样式,新增一下位移的间隔

transform-origin: 180px 180px; transform: scale(3, 3) translate(-40px,-40px);

照旧我们上面的状态,ok,我们此刻蓝色跟绿色的标志照旧逐一对应的,那我们看看此刻的坐标环境

蓝色:左边: x:0 y:0 ,右边: x:160 y:160

绿色:左边: x:120 y:120 ,右边: x:200 y:200

我们别离运用公式算一下出来的坐标是怎么样的 (以下为颠末坐标换算)

蓝色:左边: x:120 y:120 ,右边: x:160 y:160 绿色:左边: x:160 y:160 ,右边: x:200 y:200

不难发明,我们着实就相差了与位移间隔 translateX/translateY 的差值,以是,我们只必要减去位移的间隔就可以美满的举办坐标转换啦

测试公式

按照上面的公式,我们可以简朴测试一下!这个公式到底能不能见效!!!

我们直接相沿上面的demo,测试一下假如元素举办了变革,我们鼠标点下的处所天生一个标志,位置是否表现正确。看起来很ok啊(手动有趣)

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读