在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实现垂直下拉动画菜单示例
Apr 22 HTML / CSS
CSS3 中的@keyframes介绍
Sep 02 HTML / CSS
浅析与CSS3的loading动画加载相关的transition优化
May 18 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
May 30 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
Jul 11 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
Jan 31 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
Aug 02 HTML / CSS
Html5 滚动穿透的方法
May 13 HTML / CSS
css animation配合SVG制作能量流动效果
Mar 24 HTML / CSS
纯CSS实现酷炫的霓虹灯效果
Apr 13 HTML / CSS
HTML5中 rem适配方案与 viewport 适配问题详解
Apr 27 HTML / CSS
Li list-style-image 图片垂直居中实现方法
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之对抗Web扫描器的脚本技巧
2008/10/01 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
stripos函数知识点实例分享
2019/02/11 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
python决策树之C4.5算法详解
2017/12/20 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
python实现批量注册网站用户的示例
2019/02/22 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python实现图像全景拼接
2020/03/27 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
三好学生个人先进事迹材料
2014/05/17 职场文书
领导班子整改措施
2014/10/24 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android