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高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
js网页右下角提示框实例
Oct 14 Javascript
javascript实现类似java中getClass()得到对象类名的方法
Jul 27 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
May 30 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
AngularJS基础 ng-switch 指令简单示例
Aug 03 Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
JavaScript异步加载问题总结
Feb 17 Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 Javascript
Axios取消重复请求的方法实例详解
Jun 15 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实现图片添加水印功能
2014/02/13 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP中phar包的使用教程
2017/06/14 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
Python中的引用和拷贝浅析
2014/11/22 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python中join函数简单代码示例
2018/01/09 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
日语专业推荐信
2013/11/12 职场文书
九年级物理教学反思
2014/01/29 职场文书
投资合作协议书范本
2014/04/17 职场文书
本科生就业推荐信
2014/05/19 职场文书
小学生安全责任书
2014/07/25 职场文书
比赛主持人开场白
2015/05/29 职场文书
发票退票证明
2015/06/24 职场文书
小学生教师节广播稿
2015/08/19 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android