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 cookies 设置、读取、删除实例代码
Apr 12 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
IE中鼠标经过option触发mouseout的解决方法
Jan 29 Javascript
javascript中call apply 的应用场景
Apr 16 Javascript
学JavaScript七大注意事项【必看】
May 04 Javascript
JS小数运算出现多为小数问题的解决方法
Jun 02 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
Aug 23 Javascript
探索Vue.js component内容实现
Nov 03 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
Jun 11 Javascript
Bootstrap Paginator+PageHelper实现分页效果
Dec 29 Javascript
微信小程序云开发实现云数据库读写权限
May 17 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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP中比较时间大小实例
2014/08/21 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Python 专题一 函数的基础知识
2017/03/16 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python更新所有已安装包的操作
2020/02/13 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
生物制药毕业生自荐信
2013/10/16 职场文书
初中生期末评语大全
2014/04/24 职场文书
市场开发计划书
2014/05/07 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
大学生自荐信范文
2015/03/05 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库