javascript结合canvas实现图片旋转效果


Posted in Javascript onMay 03, 2015

我们在微博上可以对图片进行向左转向右转等旋转操作,让用户可以从不同的视角欣赏图片效果。本文将结合实例为您讲解如何使用Javascript结合相关技术来实现图片的旋转效果。我们使用HTML5的canvas标签可对图片进行旋转操作,对于ie6,7,8不支持HTML5的浏览器,我们使用IE特有的滤镜效果来实现图片旋转。

HTML

我们在页面中放置一张图片,在图片的上方放置两个按钮,通过onclick事件调用rotate()函数来控制图片向左向右旋转。

<div id="tool"> 
   <a href="#" id="arr_left" onclick="rotate('myimg','left')">向左</a> 
   <a href="#" id="arr_right" onclick="rotate('myimg','right')">向右</a> 
</div> 
<div id="img"> 
   <img src="demo.jpg" width="460" height="305" alt="" id="myimg" /> 
</div>

Javascript

function rotate(obj,arr){ 
  var img = document.getElementById(obj); 
  if(!img || !arr) return false; 
  var n = img.getAttribute('step'); 
  if(n== null) n=0; 
  if(arr=='left'){ 
    (n==0)? n=3:n--; 
  }else if(arr=='right'){ 
    (n==3)? n=0:n++; 
  } 
  img.setAttribute('step',n); 
  ... 
}

我们写了个自定义函数rotate(),其中参数obj表示要旋转的图片对象的id,参数arr表示旋转方向,固定两个值:left(向左)和right(向右)。我们设置变量n是为了记录上下左右四种旋转状态,点击旋转按钮时可以保证持续的旋转的状态,即每次旋转是在上次旋转操作后的基础上再次旋转。

然后,我们要根据浏览器的不同进行不同的处理,对于IE系浏览器,可以使用他们特有的滤镜来实现旋转效果,虽然我们不建议使用滤镜,但为了兼容IE老版本,我们不得不重操这把旧刀。

function rotate(obj,arr){ 
  ... 
  //对IE浏览器使用滤镜旋转 
  if(document.all) { 
    img.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ n +')'; 
  // 对现代浏览器写入HTML5的元素进行旋转: canvas 
  }else{ 
    ... 
  } 
}

代码中,我们使用document.all判断是否为IE浏览器,如果是则使用滤镜,而对于firefox和chrome这样的现代浏览器,我们使用canvas来实现旋转效果。

function rotate(obj,arr){ 
  ... 
  // 对现代浏览器写入HTML5的元素进行旋转: canvas 
  }else{ 
    var c = document.getElementById('canvas_'+obj); 
    if(c== null){ 
      img.style.visibility = 'hidden'; 
      img.style.position = 'absolute'; 
      c = document.createElement('canvas'); 
      c.setAttribute("id",'canvas_'+obj); 
      img.parentNode.appendChild(c); 
    } 
    var canvasContext = c.getContext('2d'); 
    switch(n) { 
      default : 
      case 0 : 
        c.setAttribute('width', img.width); 
        c.setAttribute('height', img.height); 
        canvasContext.rotate(0 * Math.PI / 180); 
        canvasContext.drawImage(img, 0, 0); 
        break; 
      case 1 : 
        c.setAttribute('width', img.height); 
        c.setAttribute('height', img.width); 
        canvasContext.rotate(90 * Math.PI / 180); 
        canvasContext.drawImage(img, 0, -img.height); 
        break; 
      case 2 : 
        c.setAttribute('width', img.width); 
        c.setAttribute('height', img.height); 
        canvasContext.rotate(180 * Math.PI / 180); 
        canvasContext.drawImage(img, -img.width, -img.height); 
        break; 
      case 3 : 
        c.setAttribute('width', img.height); 
        c.setAttribute('height', img.width); 
        canvasContext.rotate(270 * Math.PI / 180); 
        canvasContext.drawImage(img, -img.width, 0); 
        break; 
    }; 
  } 
}

代码中,我们创建canvas元素对象,并将图片赋予canvas对象,当变量n处于不同的状态(上下左右四个方向)时,使用canvas重新对图像进行绘制。

当然,图片的旋转效果实现还有一种解决方案,绕开html5,针对各不同的浏览器,比如firefox下面可以用-moz-transform: rotate(); webkit可以用-webkit-transform: rotate(); 但这并不如html5的canvas实现的效果好。

以上所述就是本文给大家分享的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
编写针对IE的JS代码两种编写方法
Jan 30 Javascript
jquery实现手风琴效果实例代码
Nov 15 Javascript
ie 7/8不支持trim的属性的解决方案
May 23 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
Nov 06 Javascript
js实现碰撞检测特效代码分享
Oct 16 Javascript
jquery实现表单获取短信验证码代码
Mar 13 Javascript
javascript编程实现栈的方法详解【经典数据结构】
Apr 11 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
深入理解Node module模块
Mar 26 Javascript
Vue使用虚拟dom进行渲染view的方法
Dec 26 Javascript
vue下axios拦截器token刷新机制的实例代码
Jan 17 Javascript
JavaScript实现点击自制菜单效果
Feb 02 Javascript
浅谈javascript语法和定时函数
May 03 #Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
May 03 #Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 #Javascript
jQuery中 attr() 方法使用小结
May 03 #Javascript
浅谈被jQuery抛弃的函数及替代函数
May 03 #Javascript
jQuery的几个我们必须了解的特点
May 03 #Javascript
jQuery的css() 方法使用指南
May 03 #Javascript
You might like
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
laravel安装和配置教程
2014/10/29 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
理解javascript对象继承
2016/04/17 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
Python中的字典遍历备忘
2015/01/17 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python与C互相调用的方法详解
2017/07/14 Python
Python处理中文标点符号大集合
2018/05/14 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
保卫钓鱼岛口号
2014/06/20 职场文书
2014年评职称工作总结
2014/11/20 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js