项目要求需要用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. 【git学习五】git基础之git分支

    1.背景                最早用github的时候,我傻傻的问舍友大神,git里面的branch是干什么的,他用了非常直白的解释,我至今还记得."branch就是你能够自己建立 ...

  2. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. 【电视桌面CSWUI】电视桌面(launcher)截图欣赏

    网络播放器是最重要的电视桌面.cswui,我们公司做了一个非常大的人力,物力搞一个电视柜.后来一一介绍,简言之发送屏幕截图.给大家看. watermark/2/text/aHR0cDovL2Jsb2c ...

  4. 解决 TortoiseGit 诡异的 Bad file number 问题(转)

    问题描述 昨天,以及今天(2014-11-29),使用 TortoiseGit 时碰到了一个诡异的问题. 卸载,清理注册表,重装,重启,各种折腾以后,还是不能解决. 但是23.45分一过,突然灵光一闪 ...

  5. DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

    原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...

  6. java 获取系统变量(环境变量和环境变量)

    前言 环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说. 环境变量的处理可能会 ...

  7. Oracle内存管理(五)

    [深度分析--eygle]学习笔记 1.4. 2其他内存组件 Large Pool-大池是SGA的一个可选组件,通经常使用于共享server模式(MTS). 并行计算或 RMAN的备份恢复等操作. J ...

  8. CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...

  9. TempData,ViewData和ViewBag的比较

    TempData,ViewData和ViewBag的比较 学习ASP.NET有大约一个月了,一直都是半生不熟的,因为之前的很长时间都是在做java开发,没有时间静下来心来学习,加上ASP.NET的框架 ...

  10. ASP.NET学习笔记2--自己写代码绑定Gridview

    像以前一样,先写好自己的样式布局, 第二步,在数据库建立一个商品表 代码如下: CREATE TABLE [SHANGPING_INFO] ( [Shangping_Id] INT PRIMARY K ...