在canvas上实现元素图片镜像翻转动画效果的方法


Posted in HTML / CSS onMarch 20, 2018

一、Canvas图片水平镜像翻转效果预览

您可以狠狠的点击这里:canvas图片水平镜像翻转动画demo

demo页面中点击图片动画效果可见。

二、Canvas上实现图片镜像翻转的实现

CSS中要想实现元素的翻转效果,比较简单,例如我们希望某一张图片水平镜像翻转,只需要一行CSS就可以了:

img {
    transform: scaleX(-1);
}

或者:

img {
    transform: scale(-1, 1);
}

但是在canvas中,则要麻烦一些,麻烦的并不是无法翻转,而是坐标系的定位。

在Canvas中,如下代码可以实现资源的水平镜像翻转(假设 context 是Canvas的 2d 上下文):

context.scale(-1, 1);

或者使用 setTransform API直接矩阵变换:

context.setTransform(-1, 0, 0, 1, 0, 0);

然而,翻转虽然实现了,但是Canvas中元素定位就出了很大的问题。这是因为Canvas的坐标变换系和CSS不一样,因此,如果我们想实现居中翻转效果,需要在翻转之前将目标元素的中心点移动到变换轴上。

拿水平翻转距离,在 scale 之前先 translate 位移变换后的水平偏移,然后就能看到一直居中翻转的效果了。

语言苍白,拿图示意一下。

canvas默认的变化坐标系是左上角。

因此,如果水平 scale 为 1 , 0.5 , 0 , -0.5 , -1 时候的最终位置如下图示意:

在canvas上实现元素图片镜像翻转动画效果的方法

于是可以得到应当偏移的水平距离公式:

distance = (canvas.width – image.width * scale) / 2;

于是,最终镜像绘制图片的关键代码变成这样(假设水平缩放大小是 scale ):

// 坐标参考调整
context.translate((canvas.width - image.width * scale) / 2, 0);
context.scale(scale, 1);
context.drawImage(image, 0, 0);
// 坐标参考还原
context.setTransform(1, 0, 0, 1, 0, 0);

如何增加动画效果呢?

我们可以借助Tween.js , https://github.com/zhangxinxu/tween

里面有各种缓动算法,借助方便调用的 Math.animation() 方法,就能轻松实现我们想要的效果啦!

Math.animation(form, to, duration, easing, callback);

动画JS如下:

var canvas = document.querySelector('canvas');
var context = canvas.getContext('2d');
// 动画进行
Math.animation(1, -1, 600, 'Quad.easeInOut', function (value, isEnding) {
    // 清除画布内容
    context.clearRect(0, 0, canvas.width, canvas.height);
    // 调整坐标
    context.translate((canvas.width - canvas.width * value) / 2, 0);
    // 调整缩放
    context.scale(value, 1);
    // 绘制此时图片
    context.drawImage(eleImg, 0, 0);
    // 坐标参考还原
    context.setTransform(1, 0, 0, 1, 0, 0);
});

三、结束语

又是一篇冷文,canvas这东西,玩的前端并不多,受众有限,不比流行技术。然,古语有云,不以善小而不为,希望以后有小伙伴搜索到相关问题的时候可以提供帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3轻松实现清新 Loading 效果的简单实例
Jun 06 HTML / CSS
css3中的calc函数浅析
Jul 10 HTML / CSS
Css3+Js制作漂亮时钟(附源码)
Apr 24 HTML / CSS
实例教程 纯CSS3打造非常炫的加载动画效果
Nov 05 HTML / CSS
分享CSS3制作卡片式图片的方法
Jul 08 HTML / CSS
HTML5的语法变化介绍
Aug 13 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
Sep 06 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
Jul 29 HTML / CSS
详解盒子端CSS动画性能提升
May 24 HTML / CSS
CSS极坐标的实例代码
Jun 03 HTML / CSS
td 内容自动换行 table表格td设置宽度后文字太多自动换行
Dec 24 HTML / CSS
box-shadow单边阴影的实现
May 21 HTML / CSS
HTML5 新表单类型示例代码
Mar 20 #HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
Mar 19 #HTML / CSS
基于HTML5 WebGL的3D机房的示例
Mar 16 #HTML / CSS
Html5 APP中监听返回事件处理的方法示例
Mar 15 #HTML / CSS
html5实现多图片预览上传及点击可拖拽控件
Mar 15 #HTML / CSS
微信html5页面调用第三方位置导航的示例
Mar 14 #HTML / CSS
微信端html5页面调用分享接口示例
Mar 14 #HTML / CSS
You might like
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
javascript定时器完整实例
2015/02/10 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
python自动化之Ansible的安装教程
2019/06/13 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
九年级数学教学反思
2014/02/02 职场文书
学校门卫岗位职责
2014/03/16 职场文书
论文评语大全
2014/04/29 职场文书
2015年教师节感言
2015/08/03 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
为什么node.js不适合大型项目
2021/04/28 Javascript