zoukankan      html  css  js  c++  java
  • 利用filter进行图片的旋转

    在高级浏览器里面可以利用css3实现图片的旋转,可是对于IE来讲,需要利用filter属性。。

    利用filter进行旋转:

    (1)如果只用旋转90度,那么可以直接用BasicImage(rotation=参数)来实现,其中参数为:

            0:不旋转;1:90 ;2:180度;3:270

            例子,旋转-90度,那么代码如下:

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

            支持CSS3的:-webkit-transform:rotate(-90deg); -moz-transform:rotate(-90deg); -o-transform:rotate(-90deg);

    (2)如果旋转的角度任意,那么需要利用Matrix,设置其中的M11,M12,M21,M22四个值,他们分别表示水平旋转和垂直旋转的值。按照图片旋转的算法原理,

       M11 = cos(度数) ,M12 = -sin(度数),M13= sin(度数),M14=cos(度数)

             <script>

              var deg2radians = Math.PI / 180; //(度数与弧度的转化)
              var rad = deg * deg2radians; //deg是需要旋转的度数
              var sin = Math.sin(rad);
              var cos = Math.cos(rad);

              //设置css属性

             

              obj.css({
                    'filter':[
            'progid:DXImageTransform.Microsoft.Matrix(M11="',
                  cos,
                '", M12="',
                  -sin,
                '", M21="',
                  sin,
                '", M22="',
                  cos,
                '", sizingMethod="auto expand")'
            ].join(''),
         'left': l+(w-h)/2+'px',
         'top':t-(w-h)/2+'px'
        });

             </script>

    其中红色的两行是针对IE浏览器做的对图片的调整(ie6,7,8,9通过测试),由于filter在做图片旋转的时候,坐标取的是图片坐标系,即为图片的左上角,而CSS3的rotate进行了转换,最后看到的图片是按数学坐标系,即图片的中心位置进行的旋转。所以为了保证在所有浏览器中的效果一直,需要在IE中,进行图片的移动。

    l:对象的left值(相对于父元素)

    t:对象的top值(相对于父元素)

    w:对象的宽度

    h:对象的高度

    由于利用了left,top来进行图片的移动,所以进行旋转的图片需要设置position:absolute属性。这样才能使得left值和top值有效。

    最后script代码中的css的设置方法利用了QWrap提供的接口。

    ps:

    图片在窗口边缘时,旋转会导致图片溢出窗口,例如

     

     旋转后:

     

     PS:

    在ie 中,每旋转一次,得到的图片宽度和高度都会随着图片的旋转而变化。如果需要连续的旋转,就需要考虑到这点。

    例如,一个正常的图片宽:500px,高:400px。在ff,chrom浏览器中,用css3旋转,不管旋转多少度,得到的图片的宽度依然是500px,高度是400px

    而在ie中,旋转90度以后,重新获得图片的高度为500px,宽度为400px。这就造成上面介绍的在filter中重新设置图片的l,t值出现误差,最后的解决方法是

    /*比较原始图片的宽度和高度值得大小,从而设置不同的left和top值*/

    var w = img.w;//每次旋转重新得到图片的宽度

    var h = img.h;//每次旋转重新得到图片的高度

    var ll = W > H ? l+(w-h)/2+'px': l-Math.abs((w-h)/2)+'px';//W:图片的原始宽度,H图片的原始高度

    var tt = W > H ? t-Math.abs((w-h)/2)+'px': t-(w-h)/2+'px';

     'left': ll,

    'top': tt,
    'filter':[
      'progid:DXImageTransform.Microsoft.Matrix(M11="',
      cos,
        '", M12="',
      -sin,
        '", M21="',
      sin,
        '", M22="',
      cos,
        '", sizingMethod="auto expand")'
      ].join('')

  • 相关阅读:
    phpexcel 导入超过26列、处理时间格式
    PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers
    关于微信支付服务器证书更换的提醒
    PHP微信开发之模板消息回复
    js---用对象来放置变量和方法
    electron---更改安装图标
    css---【vw,vh】进行自适应布局单位
    vue---父子组件之间的通信【props,$refs、$emit】
    vue---props进行双向数据绑定报错
    ES6----拓展运算符 三个点【...】
  • 原文地址:https://www.cnblogs.com/lilyimage/p/2359545.html
Copyright © 2011-2022 走看看