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 相关文章推荐
jquery怎样实现ajax联动框(一)
Mar 08 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
Dec 25 Javascript
Bootstrap每天必学之标签页(Tab)插件
Aug 09 Javascript
浅析JavaScript中的对象类型Object
May 26 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
node.js使用express框架进行文件上传详解
Mar 03 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 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学习 运算符与运算符优先级
2008/06/15 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
javascript实现的listview效果
2007/04/28 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
js实现放大镜特效
2017/05/18 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
Python使用minidom读写xml的方法
2015/06/03 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
python实现两张图片的像素融合
2019/02/23 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Python中请不要再用re.compile了
2019/06/30 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
C#中的验证控件有几种
2014/03/08 面试题
高中数学教学反思
2014/01/30 职场文书
找工作求职信
2014/07/07 职场文书
学习十八大的心得体会
2014/09/12 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫