在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 相关文章推荐
表单button的outline在firefox浏览器下的问题
Dec 24 HTML / CSS
详解CSS3中强大的filter(滤镜)属性
Jun 29 HTML / CSS
X/HTML5 和 XHTML2
Oct 17 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
Jun 30 HTML / CSS
html5的websockets全双工通信详解学习示例
Feb 26 HTML / CSS
让IE下支持Html5的placeholder属性的插件
Sep 02 HTML / CSS
HTML5中drawImage用法分析
Dec 01 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
Dec 09 HTML / CSS
html5.2 dialog简介详解
Feb 27 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
Aug 27 HTML / CSS
html+css合并表格边框的示例代码
Mar 31 HTML / CSS
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
Apr 22 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python做文本按行去重的实现方法
2016/10/19 Python
Python数据操作方法封装类实例
2017/06/23 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
施工人员岗位职责
2013/12/12 职场文书
在校生自我鉴定
2014/01/23 职场文书
校园标语大全
2014/06/19 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
我的收音机情缘
2022/04/05 无线电
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技