`
caibinghong
  • 浏览: 142833 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

处理元素的旋转

阅读更多

-webkit-transform: rotate(45deg);transform: rotate(45deg);

 

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

 

 

——————————————————————————————————————————

E矩阵滤镜Matrix旋转与缩放及结合transform的拓展

by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=1505

一、前面的点唠叨

IE浏览器下Matrix滤镜可以实现旋转效果早在去年1月份在“图片旋转效果的一些研究、jQuery插件及实例” 一文中就有过还算详细的介绍。//zxx:其中还提及BasicImage滤镜-亦可旋转与翻转
之前旋转文章截图 张鑫旭-鑫空间-鑫生活

这里之所以要重新嚼以前嚼过的烂叶子是因为我之前以为IE Matrix矩阵滤镜只能实现元素的旋转与拉伸,但是就在前几天发现Matrix滤镜还有元素比例缩放的功能,类似于zoom属性的功能。于是花时间折腾了一下,决定立文备忘下。

由于现代浏览器中CSS3的transform属性可以轻松实现元素的旋转以及比例改变,所以如果搞定IE的这个旋转与缩放,那么我们在实际项目中实现元素的任意角度的旋转,任意大小比例的缩放都是很有可能的。所以个人觉得关于IE Matrix的些知识的了解还是有必要的,个人不喜欢IE的滤镜功能,所以这里我是不会像解释CSS3的属性一样详细全面,只介绍些需要知道的内容。

二、Matrix滤镜简介

基本语法如下:

filter: progid:DXImageTransform.Microsoft.Matrix( enabled= bEnabled , SizingMethod= sMethod , FilterType= sType , Dx= fDx , Dy= fDy , M11= fM11 , M12= fM12 , M21= fM21 , M22= fM22 )

其中参数多多,而且名称稀奇古怪的,很容易吓着新手。所以我干脆直接简化了下,把与实现旋转与缩放功能不相关的不需要关系的参数全部一脚踹掉,于是有:

filter: progid:DXImageTransform.Microsoft.Matrix( SizingMethod= sMethod ,  M11= fM11 , M12= fM12 , M21= fM21 , M22= fM22 )

其中SizingMethod这里死活就是"auto expand"了,也就是说我们要实现元素的旋转与缩放只要关心M11, M12, M21, M22,这几个参数就是2×2矩阵中的的四个数值。虽然大学中学过线性代数还考了90多分,但是几年不碰都已经还给老师了,所以这几个参数如何实现拉伸我也是不清楚的。但是,幸好实现旋转以及缩放效果我们不需要知道的太多,我们只需要套用下面的格式就可以了。

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

只要把你需要旋转的角度将上面的roation值代替并计算出来就可以了,这个在“图片旋转效果的一些研究、jQuery插件及实例” 一文中已经有过介绍了,这里就不赘述了。现在来看看如何实现比例的缩放。

如同变魔术般,一旦知道了原理就觉得很一般。同样的这里实现比例的改变也非常简单。就是将M11, M12, M21, M22的每个值分别乘以你希望缩放的比例就可以了。
例如,您想要把一个元素只是单纯的旋转135度的话直接就是(cos(135) = -0.707):

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

但是,同时你希望元素还放大两倍,那该怎么办呢,很简单,M11, M12, M21, M22同时乘以2就可以了,也就是:

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

很简单吧。这就是IE矩阵滤镜Matrix下旋转与缩放的实现。

三、与CSS3 transform的结合

CSS3 transform中有旋转(ratate)和缩放(scale)属性,详细可参见“CSS3 Transitions, Transforms和Animation使用简介与应用展示”一文。

例如实现上面所说的旋转135度,同时放大2倍的效果代码应该是:

transform:rotate(135deg) scale(2);

于是,我们将IE的Matrix滤镜和CSS3的transform属性结合旧可以实现绝大多数浏览器的元素旋转与缩放效果了。现在有个问题是Matrix滤镜的使用与计算,你说我要是旋转个75度,难道还要打开计算器去计算吗,而且filter后面长得很深奥的字符语法让人不容易记住,很折腾人的。这个问题已经有人想到了,在American,有两位前端开发者Zoltan Hawryluk 和Zoe Mickley Gillenwater就这个问题写了个工具,专门讲CSS3中简单易懂的transform属性值转换成IE的Matrix滤镜表示形式,此工具地址是:http://www.useragentman.com/IETransformsTranslator/。直接点击页面上“Translate to IE Matrix”这个按钮就好了,如下图:
transform转换为IE滤镜CSS表示的页面截图 张鑫旭-鑫空间-鑫生活

结果就会生成对应的IE Matrix滤镜相关的CSS代码:
transform转换结果截图 张鑫旭-鑫空间-鑫生活

上面的工具虽然使用比较方便。但是,其功用只针对CSS,如果我们希望通过JavaScript控制图片的旋转以及缩放,那就是出拳打在棉花上——不给力。所以,我抽了点时间写了个可用使用JS非常简单的控制元素旋转以及缩放的方法。完整JavaScript代码如下:

var fnRotateScale = function(dom, angle, scale) {
    if (dom && dom.nodeType === 1) {
        angle = parseFloat(angle) || 0;
        scale = parseFloat(scale) || 1;
        if (typeof(angle) === "number") {
            //IE
            var rad = angle * (Math.PI / 180);
            var m11 = Math.cos(rad) * scale, m12 = -1 * Math.sin(rad) * scale, m21 = Math.sin(rad) * scale, m22 = m11;
            if (!dom.style.Transform) {
                dom.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+ m11 +",M12="+ m12 +",M21="+ m21 +",M22="+ m22 +",SizingMethod='auto expand')";
            }
            //Modern
            dom.style.MozTransform = "rotate("+ angle +"deg) scale("+ scale +")";
            dom.style.WebkitTransform = "rotate("+ angle +"deg) scale("+ scale +")";
            dom.style.OTransform = "rotate("+ angle +"deg) scale("+ scale +")";
            dom.style.Transform = "rotate("+ angle +"deg) scale("+ scale +")";
        }
    }
};

方法名是fnRotateScale,有三个参数。第一个就是dom元素啦;第二个参数就是旋转的角度,例如旋转45度就是45,;第三个参数scale就是你希望缩放的比例了,例如希望放大两倍显示就是2就可以了。使用也是相当简单的。

举个例子,例如现在页面上有张id为testImage的图片,我们希望这张图片旋转45度同时尺寸变成原来的两倍,该怎么办,很简单,直接套用上面的方法就可以了,JS代码如下:

fnRotateScale(document.getElementById("testImage"), 45, 2);

就搞定了。无论你手上是什么浏览器,您可以狠狠地点击这里:Matrix+transform下元素旋转缩放JS测试demo

此demo实现的就是上面的旋转45度同时元素尺寸放大2倍的效果,例如IE8浏览器,将会看到如下截图所示的效果:
IE8浏览器下的效果截图 张鑫旭-鑫空间-鑫生活

一些说明
1. 系统原因(XP),没能在IE9下测过效果,希望有IE9的同行可以告知下效果如何,以便改进。
2. 现代浏览器下CSS3的transform旋转与缩放不会改变原先元素占据的空间,但是Matrix旋转与缩放却是会改变容器的尺寸的,且不是以元素中心为原点进行旋转与缩放的,所以位置与transform是有差别的,且貌似IE8的定位于IE6/7也不一样。这些不兼容的问题可以用CSS进行修复(如demo页面),但这是治标不治本的方法。更好的方法应该是对fnRotateScale方法进行进一步的提升,例如克隆元素绝对定位等,时间精力等原因,我这里就不折腾兼容性定位的问题了。

四、结尾的点唠叨

纵使IE滤镜有长得丑,性能遭等不足,但是,有时候我们为了兼顾IE浏览器,同时实现某些不得已的功能或是效果,还是不得不使用它的,正所谓“人生不如意事常八九”。做技术的偏执狂的比例还是比较高的,应该有人就是死活不使用IE的滤镜功能的,所以本文对其而言意义就不大了,但是,不管怎样,对于拓展些眼界,开阔些思维还是应该有些帮助的。

已经零点了,时间不早了,肚子也饿了,今儿还要起早去钓鱼,所以其他一些场面的话就不多说了。有错误有疑问评论或是邮件联系。

感谢阅读。

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=1505

分享到:
评论

相关推荐

    image-editor:使用画布缩放,旋转,裁剪和处理图像

    图像编辑器演示版用法使用画布缩放,旋转,裁剪和处理图像执行加载脚本[removed][removed]实例化var imageEditorInstance = new ImageEditor({ elt: (DOM Element), ... optional settings ...});选项(对象)埃尔特...

    C++中求旋转数组中的最小数字(经典面试题)

    面试题:旋转数组的最小数字 ...(1)当输入的旋转数组非法时:处理! (2)当输入的旋转数组正常时,index1 = 0;index2=length-1:  a:如果arry[index1] <arry>= arry[index2]时,middle = (index1+inde

    二叉排序树和平衡二叉树的实现(vc++)

    3 在BT上插入元素x,当BT失衡时,考虑如下四种平衡旋转处理: (a)单向右旋平衡处理(LL型); (b)单向左旋平衡处理(RR型) ; (c)先左后右双向右旋转(LR型) ; (d)先右后左双向右旋转(RL型)。 4 分别给出四...

    SmoothingFilters.cpp

    相关是滤波器模板移过图像并计算计算每个位置乘积之和的处理,卷积的机理相似,但滤波器首先要旋转180度 相关的计算步骤: (1)移动相关核的中心元素,使它位于输入图像待处理像素的正上方 (2)将输入图像的像素值...

    二叉树排序树建立及平衡处理

    对以指针T所指结点为根的平衡二叉排序树作左平衡旋转处理, 本算法结束时,指针T指向新的根结点 RightBalance(BSTree *T) 对以指针T所指结点为根的平衡二叉排序树作右平衡旋转处理, 本算法结束时,指针T指向新...

    three-vr-orbitcontrols:Three.js Oribit控件处理多个元素

    这是对three.js OrbitControls的修改,以在一个实例中处理两个可拖动元素。 这是必需的,因为很多OO结构都保留在内部,包括事件处理程序。 关键控件也已修改为旋转而不是平移,因为视频纹理需要旋转而不是平移。 ...

    Android动画之Tween动画实现

    Android 平台提供了两类...本例子主要实现了Tweene动画,实现了页面等待、开门、元素旋转平移缩放渐变等功能,并且使用了在Activity界面直接操作动画、重写View处理动画、利用XML处理动画等技术,是非常不错的资源。

    数字图像处理实验源代码(中值滤波,灰度拉伸,图像平滑模板...)

    用C语言实现数字图像处理中的多种操作:如实现图像的灰度变换,图像的中值滤波,线性变换,缩放,平移,旋转,灰度直方图,开运算,闭运算,,膨胀/腐蚀元素的设定等等功能。

    matlab6.5图形图像处理源程序

    16.1.1 结构元素矩阵 16.1.2 膨胀运算 16.1.3 腐蚀运算 16.1.4 膨胀与腐蚀的对偶关系 16.1.5 开运算和闭运算 16.1.6 击中与击不中 16.1.7 二值图像形态学处理函数 16.1.8 其它膨胀和腐蚀的基本函数 16.2 ...

    MATLAB图形图像处理

    16.1.1 结构元素矩阵 16.1.2 膨胀运算 16.1.3 腐蚀运算 16.1.4 膨胀与腐蚀的对偶关系 16.1.5 开运算和闭运算 16.1.6 击中与击不中 16.1.7 二值图像形态学处理函数 16.1.8 其它膨胀和腐蚀的基本函数 16.2 ...

    基于旋转轴V和旋转角α的视景仿真系统中鹰眼全景视角观察器设计 (2011年)

    针对航空模拟器视景仿真系统中利用欧拉角来处理鹰眼全景观察器视角旋转不可避免的出现万向轴锁现象,提出了利用四元素法来描述旋转,即绕任意一个轴V旋转一个角度α的方法来解决这一问题,并和欧拉旋转方法进行了简单...

    二分查找的优缺点以及举例

    以及在旋转有序数组中查找某个元素等。 需要注意的是,二分查找的前提是数据必须是有序的,没有顺序的数据,二分法就失去意义。同时,二分查找在处理大规模数据时具有显著优势,可以显著减少查找的时间复杂度,提高...

    VC++ matlab图像处理

    16.1.1 结构元素矩阵 16.1.2 膨胀运算 16.1.3 腐蚀运算 16.1.4 膨胀与腐蚀的对偶关系 16.1.5 开运算和闭运算 16.1.6 击中与击不中 16.1.7 二值图像形态学处理函数 16.1.8 其它膨胀和腐蚀的基本函数 16.2 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    16.1.1 结构元素矩阵 16.1.2 膨胀运算 16.1.3 腐蚀运算 16.1.4 膨胀与腐蚀的对偶关系 16.1.5 开运算和闭运算 16.1.6 击中与击不中 16.1.7 二值图像形态学处理函数 16.1.8 其它膨胀和腐蚀的基本函数 ...

    图片C#实现操作帮助类

    4. 旋转和翻转:将图像按照指定角度进行旋转操作,并可以水平或垂直翻转图像。 5. 修改对比度和亮度:调整图像的对比度和亮度,使其更鲜明或更柔和。 6. 滤镜和特效:应用滤镜或特效来改变图像的外观,例如模糊、...

    图像处理(第二版)章毓晋

    1.0.1 为什么要处理图像?.........................................................................................1 1.0.2 什么是一幅图像?..................................................................

    基于三维集成成像相机阵列获取的元素图像校正

    通过特征点位置坐标以及相机位置平移误差和旋转误差的计算,分析了相机阵列位置平移误差和旋转误差与元素图像间的关系,以及校正算法的精度。利用光学实验对该算法进行了验证,结果表明,此方法可有效消除相机阵列...

    Justify:一款实现inline-block元素两端对齐布局的javascript插件(a javascript plug-in implementation inline-block elements full-justified layout)

    控件对最后一行对齐做了处理,使最后一行的元素能居左依次与上一行的元素垂直对齐,并支持去除部分DOCTYPE下最后一行产生的空隙。控件为移动web编写,支持移动设备旋转事件。暂不支持桌面IE浏览器低版本。效果图如下...

Global site tag (gtag.js) - Google Analytics