在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 object-fit属性
Jul 27 HTML / CSS
纯css3实现效果超级炫的checkbox复选框和radio单选框
Sep 01 HTML / CSS
CSS3中使用RGBa来调节透明度的教程
May 09 HTML / CSS
纯CSS3大转盘抽奖示例代码(响应式、可配置)
Jan 13 HTML / CSS
你不知道的5个HTML5新功能
Jun 28 HTML / CSS
基于HTML5的WebSocket的实例代码
Aug 15 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
May 14 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
Jun 23 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
boostrap modal 闪现问题的解决方法
Sep 01 HTML / CSS
CSS基础详解
Oct 16 HTML / CSS
CSS3实现指纹特效代码
Mar 17 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中inlcude()性能对比详解
2012/09/16 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
python正则表达式re模块详细介绍
2014/05/29 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python sorted函数的小练习及解答
2019/09/18 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
铭万公司.net面试题笔试题
2014/07/20 面试题
南京某公司笔试题
2013/01/27 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2014年底个人工作总结
2015/03/10 职场文书
银行资信证明
2015/06/17 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
二年级作文之动物作文
2019/11/13 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
把77A收信机改造成收音机
2022/04/05 无线电
Win11快速关闭所有广告推荐
2022/04/19 数码科技