项目要求需要用js实现同时放大多张图片相对位置不变,就和同事去一家国外网站的js文件中跟踪扒取了这一算法,

庆幸的是算法抠出来了并整理了出来,但遗憾的只知计算过程却弄不明白算法原理:

大体上是核心运算将图片的中心点和画布(外层div)中心点的差和放大倍数针对矩阵[1.0000000000000002,-0,-0,1.0000000000000002]

(这个矩阵是由[1,0,01]经过一系列计算得出的一个固定矩阵)做了两次运算:(如果大家懂得其中计算原理,希望能分享一下)

/// <reference path="Scripts/jquery-1.4.1.min.js" />

//参数:canvas画布的id,img图片外层div的class值)

function ZoomBig(canvasId,imgDivClass) {

Canvas.zoom(canvasId,imgDivClass,1.25);

}

function ZoomSmall(canvasId, imgDivClass) {

Canvas.zoom(canvasId,imgDivClass,0.8);

}

//--

function Canvas() {

}

//--入口函数:

Canvas.zoom = function (canvasId,imgDivClass,c) {

//初始化

//canvas

cvW = TranNum($("#" + canvasId).css("width"));

cvH = TranNum($("#"+ canvasId).css("height"));

//Canvas

_items = $("#" + canvasId).find("[class='"+imgDivClass+"']");

//计算

if (c == 1) {

return

}

var b = this.getCanvasSize();

var a = new Point(b.w / 2, b.h / 2);

var d = new Point(c, c);

$.each(_items, function (f) {

//pro

proW = TranNum($(this).css("width"));

proH = TranNum($(this).css("height"));

proT = TranNum($(this).css("top"));

proL = TranNum($(this).css("left"));

//pro中心点到pro四条边的距离left,bottom,right,top

x1 = -1 * proW / 2;

x2 = proW / 2;

y1 = -1 * proH / 2;

y2 = proH / 2;

//中心点到画布的top.left值:

translation = new Point(x2 + proL, y2 + proT);

//

setScale(d, a)//放大倍数坐标,画布中间点

$(this).css({ "left": round(x1 + translation.x, 0.001).toString() + "px", "top": round(y1 + translation.y, 0.001).toString() + "px" });

$(this).css({ "width": Math.abs((x1 * 2)).toString() + "px", "height": Math.abs((y1 * 2)).toString() + "px" });

$(this).find("img").css({ "width": Math.abs((x1 * 2)).toString() + "px", "height": Math.abs((y1 * 2)).toString() + "px" });

});

};

//--Tool

function TranNum(a) {

return parseFloat(a.replace("px", ""));

}

//

function Point(a, b) {

this.x = a;

this.y = b

}

//

Canvas.getCanvasSize = function () {

return new Dim(parseInt(cvW, 10), parseInt(cvH, 10))

};

//

function Dim(a, b) {

this.w = Math.abs(a);

this.h = Math.abs(b);

this.aspect = b / a

}

//--

setScale = function (c, a) {//,倍数, 画布中心点

beginResize();

scale(c, a); //,倍数.画布中心点

// return endResize()

};

//

beginResize = function () {

this.rectStart = clone();

this.translationStart = new Point(translation.x, translation.y);

};

//

clone = function () {

return new Rect(x1,y1,x2,y2)

};

//

function Rect(b, d, a, c) {

this.x1 = b || 0;

this.y1 = d || 0;

this.x2 = a || 0;

this.y2 = c || 0

}

//

scale = function (c, a, d, b) {

this._scale(c, a, b);

};

//

_scale = function (c, a, f) {////,倍数,画布中心点

if (f === undefined) {

f = true;

}

this.rect = clone();

x1 *= c.x;

y1 *= c.y;

x2 *= c.x;

y2 *= c.y;

if (a) {

_values=[1.0000000000000002,-0,-0,1.0000000000000002];//对[1,0,0,1]做了些计算得出的;

var b = transform(a.x -translationStart.x, a.y -translationStart.y);

var d =transform(c.x * -b.x, c.y * -b.y);

translation.x = d.x + a.x;

translation.y = d.y + a.y

} else {

translation.x = translationStart.x * c.x;

translation.y = translationStart.y * c.y

}

};

//

transform = function (b, d, a) {//两中心x差,两中心y差

if (a) {

b -= a.x;

d -= a.y;

}

var c = new Point(_values[0] * b + _values[1] * d, _values[2] * b + _values[3] * d);

if (a) {

c.x += a.x;

c.y += a.y

}

return c

};

function round(b, a) {

a = a || 1;

if (a > 1) {

return Math.round(b / a) * a

} else {

a = 1 / a;

return Math.round(b * a) / a

}

}

js实现多张图片同时放大缩小相对位置不变的更多相关文章

  1. JS的className,字体放大缩小

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. java:JQuery(声明,JQ和JS对象的区别,prop,attr,addClass,offset,trigger,dblclick和change事件,hide,show,toggle,slideUp,slideDown,slideToggle,三种选择器,标签的获取,三张图片的放大与缩小)

    1.JQuery: jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计 的宗旨是“ ...

  3. scrollview里面多张图片,每张都能放大缩小

    http://blog.sina.com.cn/s/blog_5d68044001018s1n.html scrollview里面多张图片,每张都能放大缩小 - (void)viewDidLoad{  ...

  4. js判断页面放大缩小

    项目中,经常会碰到页面被放大或者缩小,导致页面显示错误,js可以判断页面放大缩小. // 若返回100则为默认无缩放,如果大于100则是放大,否则缩小 function detectZoom (){ ...

  5. JS中图片的放大缩小没反应

    这段代码无反应: 代码如下: <script type="text/javascript"> onload = function () { document.getEl ...

  6. js监听页面放大缩小

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>d ...

  7. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  8. JS微信网页使用图片预览(放大缩小)

    前言 需求在微信网页中客户点击图片可进行预览放大缩小功能,网上找了各种js方式实现, 唯一的麻烦就是不兼容或者和项目框架不兼容 次函数只只用于部分客户端,否则会出现 WeixinJSBridge is ...

  9. JS控制图片拖动 放大 缩小 旋转 支持滚轮放大缩小 IE有效

    <html> <head>     <title>图片拖动,放大,缩小,转向</title> <script type="text/ja ...

随机推荐

  1. HTML基金会2----联系,像, 第,对齐

    ios讨论组1团:135718460 在web开发中.排版,布局非常重要,因此我们要把基础的东西打坚固,大家不要 慌,慢慢来. 直接把代码拿过去,直接就能够执行的. 1.标题 2.段落 3.HTML ...

  2. java多线程学习(一)

    一.操作系统线程和进程的概念 线程是指进程中的一个运行单元,这个过程中也可调度实体. 线程与进程的差别: (1)地址空间:线程为进程内的一个运行单元.进程至少有一个线程(进程的主线程):进程的全部线程 ...

  3. 关于接收POST请求 $GLOBALS['HTTP_RAW_POST_DATA']

    总是产生变量包含有原始的 POST 数据.否则,此变量仅在碰到未识别 MIME 类型的数据时产生.不过,访问原始 POST 数据的更好方法是 php://input.$HTTP_RAW_POST_DA ...

  4. Cocos2d-X字体

    Cocos2d-X顺便文本显示在以下三个: CCLabelTTF: 使用系统字体.每一个字符串会生成一个纹理.显示效率比較低下,适合不变化的文字 CCLabelAtlas: 使用NodeAtlas优化 ...

  5. EXCEL Pivot table manipulate

    Add filter For the Demo time,I would like to filter out the products which not in Red and Black colo ...

  6. thinkphp学习笔记5—模块化设计

    原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...

  7. SQL Server的备份

    原文:SQL Server的备份 0.参考文献 1.恢复模式 SQL Server 备份和还原操作发生在数据库的恢复模式的上下文中. 恢复模式旨在控制事务日志维护. “恢复模式”是一种数据库属性,它控 ...

  8. listener.ora中PLSExtPro 和ExtProc的作用(转)

    默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会 ...

  9. Java变量参数

    Java1.5添加新功能:可变参数:它适用于参数不确定性的数量,判断形势的类型.java变量参数数组操作. 特点: 1.今天的参数列表只能持续. 2.省略号(...)位于变量类型和变量名之间,前后有无 ...

  10. 怪异php 语法, 求解!

    查找php馍用来推断是否串串返回值和方法 strpos很奇怪. 请看下面的语句: echo "A1: ".(strpos("csd","c" ...