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 相关文章推荐
不错的一个日期输入 动态
Nov 06 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
js判断滚动条是否已到页面最底部或顶部实例
Nov 20 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
jQuery实现切换页面过渡动画效果
Oct 29 Javascript
详解vue.js全局组件和局部组件
Apr 10 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 Javascript
Element ui 下拉多选时新增一个选择所有的选项
Aug 21 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 Directory 函数的详解
2013/03/07 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
firefo xml 读写实现js代码
2009/06/11 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
浅谈Django REST Framework限速
2017/12/12 Python
python计算n的阶乘的方法代码
2019/10/25 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
女性时尚网购:Chic Me
2019/07/30 全球购物
大学同学聚会邀请函
2014/01/29 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
学校团代会开幕词
2016/03/04 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS