矩阵比例/从点转换

doo*_*ook 13 javascript css math matrix

我正在尝试缩放图像并使其从原点正确转换(基本上是缩放到缩放).我试图找到一个不涉及改变的解决方案transform-origin,因为它会使查找图片的左/上边缘变得复杂,我正在使用的不只是这个问题.

这更像是一个数学问题.我无法想出一个等式来确定基于原点来翻译图像的程度.我制定的当前等式并没有正确地从一个点扩展.关于演示,当用鼠标滚动时,图像应该从鼠标指针中爆炸.

我不是在寻找解决方法或替代设计.如前所述,我无法修改transform-origin属性.

演示:https://jsfiddle.net/dook/ort0efjd/

矩阵变换功能

function transform() {
  var matrix = [dim.new_scale, 0, 0, dim.new_scale, dim.new_x, dim.new_y].join(",");

  image_center.css({
    "transform": "matrix(" + matrix + ") translate3d(0, 0, 0)",
    "-webkit-transform": "matrix(" + matrix + ") translate3d(0, 0, 0)",
    "-moz-transform": "matrix(" + matrix + ") translate3d(0, 0, 0)",
  });
}
Run Code Online (Sandbox Code Playgroud)

鼠标滚轮事件

// Determine mousewheel pointer in relation to picture origin
var offset = image_center.offset();
var originX = ev.originalEvent.pageX - offset.left;
var originY = ev.originalEvent.pageY - offset.top;

// truncated --- new_scale is modified

// Translate based on pointer origin -- This is where I need help
dim.new_x = originX + dim.height * (dim.new_scale - 1);
dim.new_y = originY + dim.height * (dim.new_scale - 1);

// truncated -- Keep image within constraints

transform(); // Applies everything in dim to CSS transform matrix
Run Code Online (Sandbox Code Playgroud)

tnt*_*rox 2

一种简单的方法是创建一个离屏对象并将其变换原点居中。将缩放应用到该对象。

然后将矩阵变换从屏幕外元素复制到屏幕上元素,您应该拥有正确的比例。

以下是一些复制矩阵的图像原型:

HTMLImageElement.prototype.getMatrix = function() {
    var st = window.getComputedStyle(this, null);
    return st.getPropertyValue("-webkit-transform") ||
        st.getPropertyValue("-moz-transform") ||
        st.getPropertyValue("-ms-transform") ||
        st.getPropertyValue("-o-transform") ||
        st.getPropertyValue("transform") ||
        'none';
};

HTMLImageElement.prototype.setMatrix = function(matrix) {
    this.style.webkitTransform = 
    this.style.msTransform = 
    this.style.MozTransform = 
    this.style.OTransform = 
    this.style.transform = 
         matrix;
  return this;
};
Run Code Online (Sandbox Code Playgroud)

getMatrix返回一个矩阵字符串。 setMatrix接受一个矩阵字符串。

targetImage.setMatrix(sourceImage.getMatrix())
Run Code Online (Sandbox Code Playgroud)

targetImage 是显示的图像,sourceImage 是离屏图像