zoukankan      html  css  js  c++  java
  • 总结----关于图片旋转

    本文据下址理得http://www.zhangxinxu.com/wordpress/?p=552

    css3:(有兼容限制)

    -webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);
    
    transform:rotate(-90deg);

    ie滤镜:

    filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
    

    “rotation=3”,这里的参数可以是0,1,2,3,但没有4,5....这里的数值*π/2=选转的度数,也就是乘以90度。但是只能局限于90度的倍数,如果要突破这种局限,可以采用如下矩阵变换的方式得到旋转60度,ie8下要使用-ms-filter代替filter

    filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.5,M12=-0.866,M21=0.866,M22=0.5,SizingMethod='auto expand');
    

    也就是如下公式,这里的rotation表示角度,如60,

    filter:progid:DXImageTransform.Microsoft.Matrix(M11=cos(roation),M12=-sin(roation),M21=sin(roation),M22=cos(roation),SizingMethod='auto expand');
    

    对比

    css3旋转不会改变占位大小可能覆盖别的元素,ie滤镜会改变挤开别的元素

    不考虑opera,<firfox2,就很容易实现旋转,否则就使用canvas实现:

      canvas是html元素,没有行为,但提供api给js绘图到一个画布;

    ie下实现:

    <!- -[if IE]><script type="text/javascript" src="http://www.zhangxinxu.com/style/js/excanvas.js"></script><![endif]- ->(这里为了防止注释冲突,双连线用空格隔开了,然后作者也推广了自己)
    

    其中的链接是使ie大部分支持canvas的js插件  

    jQuery的旋转插件(ie滤镜+其他浏览器使用canvas)(见附录)

    使用方法:$("选择器").rotateLeft(); 与 $("选择器").rotateRight();但如果不做任何特别的处理的话,此插件只支持一次的图片旋转效果,因为分析插件可知,当运行一次canvas旋转后,canvas标签会将原来的图片标签代替掉,使得图片的连续旋转遇到麻烦,需要每次旋转后重新输入图片相关的HTML代码。

    param.right.click(function(){
    	if(!$("img#rotImg").length){
    		param.box.html('<img id="rotImg" src="http://image.zhangxinxu.com/image/study/s/s512/mm1.jpg" />');
    	}
    	fun.right(); //执行向右旋转
    	return false;
    });
    

      

    更强大的jq旋转插件如 jQueryRotate.js

    附录:

    jq旋转插件:

    jQuery.fn.rotate = function(angle,whence) {
    	var p = this.get(0);
    
    	// we store the angle inside the image tag for persistence
    	if (!whence) {
    		p.angle = ((p.angle==undefined?0:p.angle) + angle) % 360;
    	} else {
    		p.angle = angle;
    	}
    
    	if (p.angle >= 0) {
    		var rotation = Math.PI * p.angle / 180;
    	} else {
    		var rotation = Math.PI * (360+p.angle) / 180;
    	}
    	var costheta = Math.round(Math.cos(rotation) * 1000) / 1000;
    	var sintheta = Math.round(Math.sin(rotation) * 1000) / 1000;
    	//alert(costheta+","+sintheta);
     
    	if (document.all && !window.opera) {
    		var canvas = document.createElement('img');
    
    		canvas.src = p.src;
    		canvas.height = p.height;
    		canvas.width = p.width;
    
    		canvas.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+costheta+",M12="+(-sintheta)+",M21="+sintheta+",M22="+costheta+",SizingMethod='auto expand')";
    	} else {
    		var canvas = document.createElement('canvas');
    		if (!p.oImage) {
    			canvas.oImage = new Image();
    			canvas.oImage.src = p.src;
    		} else {
    			canvas.oImage = p.oImage;
    		}
    
    		canvas.style.width = canvas.width = Math.abs(costheta*canvas.oImage.width) + Math.abs(sintheta*canvas.oImage.height);
    		canvas.style.height = canvas.height = Math.abs(costheta*canvas.oImage.height) + Math.abs(sintheta*canvas.oImage.width);
    
    		var context = canvas.getContext('2d');
    		context.save();
    		if (rotation <= Math.PI/2) {
    			context.translate(sintheta*canvas.oImage.height,0);
    		} else if (rotation <= Math.PI) {
    			context.translate(canvas.width,-costheta*canvas.oImage.height);
    		} else if (rotation <= 1.5*Math.PI) {
    			context.translate(-costheta*canvas.oImage.width,canvas.height);
    		} else {
    			context.translate(0,-sintheta*canvas.oImage.width);
    		}
    		context.rotate(rotation);
    		context.drawImage(canvas.oImage, 0, 0, canvas.oImage.width, canvas.oImage.height);
    		context.restore();
    	}
    	canvas.id = p.id;
    	canvas.angle = p.angle;
    	p.parentNode.replaceChild(canvas, p);
    }
    
    jQuery.fn.rotateRight = function(angle) {
    	this.rotate(angle==undefined?90:angle);
    }
    
    jQuery.fn.rotateLeft = function(angle) {
    	this.rotate(angle==undefined?-90:-angle);
    }

      

    
    
  • 相关阅读:
    eclipse新 java 文件时自动生成注释
    int占几个字节
    eclipse常用插件
    Asp.net中IsPostBack的实现原理
    Github的入门简介
    Hypertable
    VA01/VA02行项目物料搜索帮助新增页签
    rich_text
    js之Math
    js function参数
  • 原文地址:https://www.cnblogs.com/webkey-wzy/p/4663560.html
Copyright © 2011-2022 走看看