代码之家  ›  专栏  ›  技术社区  ›  JD Isaacks

jquery rotate重置大小和位置?

  •  0
  • JD Isaacks  · 技术社区  · 15 年前

    jquery rotate plugin .

    img 具有特定宽度和高度的元素( 不是源图像的实际宽度和高度 。旋转被精确应用,但是它重置宽度和高度以匹配源图像。另外,如果图像被定位,它将移除其定位并将其设置为内联。

    有没有办法防止这种情况?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Elte Hupkes    15 年前

    这不起作用的原因是插件从源图像创建了一个新图像,但是没有考虑到当前的宽度和高度。请注意,它实际上已经在Internet Explorer中正常工作,因为它使用一些仅限Microsoft的矩阵转换机制旋转原始图像。如果您查看第27行和以下内容,其中应用了“良好的浏览器逻辑”:

        } else {
        var canvas = document.createElement('canvas');
        if (!p.oImage) {
            canvas.oImage = new Image();
            canvas.oImage.src = p.src;
        } else {
            canvas.oImage = p.oImage;
        }
    

    现在,如果在这里包括宽度和高度,那么它也可以在Firefox中工作:

        } else {
        var canvas = document.createElement('canvas');
        if (!p.oImage) {
            canvas.oImage = new Image();
            canvas.oImage.width = p.width; // ADDED
            canvas.oImage.height = p.height; // ADDED
            canvas.oImage.src = p.src;
        } else {
            canvas.oImage = p.oImage;
        }
    
        2
  •  1
  •   Hugo Migneron    15 年前

    您需要先获取对象的大小,然后在插件的开头设置希望与以下内容一起使用的宽度和高度:

    var imageHeight = $(yourImageContainer).height();
    var imageWidth = $(yourImageContainer).width();
    

    一旦设置了变量,就可以在插件中重新绘制图像时使用它们。 将创建一个新的img元素,并在其上绘制图像。不要使用图像的大小,而是使用变量的大小(参见代码中的注释)

    jQuery.fn.rotate = function(angle,whence) {
        var imageHeight = $(yourImageContainer).height();
        var imageWidth = $(yourImageContainer).width();
    
    
        var p = this.get(0);
    
        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.cos(rotation);
        var sintheta = Math.sin(rotation);
    
        if (document.all && !window.opera) {
            var canvas = document.createElement('img');
    
    
                //The size of the object is set here. MODIFY IT HERE
            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);
    }
    

    您可能应该将大小作为这个插件的一个选项,而不是使用硬编码选择器。再利用起来要简单得多:

    jQuery.fn.rotate = function(angle,whence, imageWidth, imageHeight) { ... }