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 相关文章推荐
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
Jan 15 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 Javascript
深入浅析JavaScript中数据共享和数据传递
Apr 25 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
基于JavaScript实现下拉列表左右移动代码
Feb 07 Javascript
Bootstrap栅格系统简单实现代码
Mar 06 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
js 显示日期时间的实例(时间过一秒加1)
Oct 25 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
vue实现简单的MVVM框架
Aug 05 Javascript
Vue实现导航栏的显示开关控制
Nov 01 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
农民C键的运用技巧
2020/03/04 星际争霸
PHP生成UTF8文件的方法
2010/05/15 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
js+csss实现的一个带复选框的下拉框
2014/09/29 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
详解vue axios中文文档
2017/09/12 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
安全承诺书范文
2014/03/26 职场文书
仲裁协议书
2014/09/26 职场文书
淘宝好评语句大全
2014/12/31 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
浅谈Python 中的复数问题
2021/05/19 Python