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 相关文章推荐
window.open的功能全解析
Oct 10 Javascript
Exitjs获取DataView中图片文件名
Nov 26 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
Js实现网页键盘控制翻页的方法
Oct 30 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
Jan 22 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
May 05 Javascript
详细分析vue表单数据的绑定
Jul 20 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
一个高ai的分页函数和一个url函数
2006/10/09 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP Session机制简介及用法
2014/08/19 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python实现人像动漫化的示例代码
2020/05/17 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
《母亲的恩情》教学反思
2014/02/13 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
周年庆典答谢词
2015/01/20 职场文书
《藏戏》教学反思
2016/02/23 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang