JavaScript 放大镜 - 放大倍率和视窗尺寸

May 17th, 2010 Add Comment

JavaScript 放大镜来说, 计算倍率必不可少.
一个完整的放大镜结构里, 与倍率扯上关系的一共有 4 个对象, 原图, 缩略图, 镜片和视窗. 镜片在缩略图上的覆盖位置, 其实就是视窗对原图的部分展示, 所以它们之间有如下关系.
倍率 = 原图/缩略图 = 视窗/镜片

javaScript,magnifier,multiple,viewport,glass,thumb

倍率一般大于等于 1, 因为原图一般都不会小于缩略图. 一旦倍率小于 1, 则将倍率设为 1.
因为缩略图和原图的尺寸是不可变的, 所以我们通过它们来获得倍率.

/**
 * 获取放大镜放大倍数
 * @param thumb		缩略图对象
 * @param glass		镜片对象
 * @return 			放大镜放大倍数
 */
function getMultiple(thumb, glass) {
	var multiple = {
		horizontal:0,
		vertical:0
	};
 
	var thumbSize = getSize(thumb);
	var imageSize = getImageSize(image);
 
	multiple.horizontal = imageSize.width / thumbSize.width;
	if(multiple.horizontal <= 1) {
		multiple.horizontal = 1;
	}
 
	multiple.vertical = imageSize.height / thumbSize.height;
	if(multiple.vertical <= 1) {
		multiple.vertical = 1;
	}
 
	return multiple;
}

原图和缩略图是固定的. 而为了统一视觉感官和防止破页, 我们一般也会指定视窗的尺寸, 所以镜片的尺寸是根据其他几个对象计算出来的.
镜片 = 缩略图x视窗/原图 = 缩略图/倍率

/**
 * 加载镜片的样式
 * @param viewportSize	视窗尺寸
 * @param multiple		倍率
 * @param glass			镜片对象
 */
function loadGlassStyle(viewportSize, multiple, glass) {
	glass.style.width = round(viewportSize.width / multiple.horizontal) + 'px';
	glass.style.height = round(viewportSize.height / multiple.vertical) + 'px';
}

如果定义的视窗的宽或高比原图还要小, 那该如何显示?
需要改变视窗的尺寸. 假设原图是 240x180, 视窗原定尺寸是 200x200. 视窗尺寸随之改变为 200x180. 此时镜片的尺寸仍须与视窗成正比.

javaScript,magnifier,multiple,viewport,glass,thumb

如果倍率小于 1, 又该如何显示?
将倍率设为 1, 镜片覆盖整个缩略图, 显示整个原图为视窗内容; 或者不作操作 (禁止放大镜效果).

javaScript,magnifier,multiple,viewport,glass,thumb

下面的代码用于获取视窗的尺寸.

/**
 * 返回视窗尺寸
 * @param multiple		倍率
 * @param image			原图对象
 * @return				视窗尺寸
 */
getViewportSize: function(multiple, image) {
	var dimension = {
		width:0,
		height:0
	};
 
	// 如果倍率小于 1 或者视窗比原图还宽, 宽度设为跟原图一致, 否则去设定宽度
	if(multiple.horizontal <= 1 || config.viewportSize[0] > image.width) {
		dimension.width = image.width;
	} else {
		dimension.width = config.viewportSize[0];
	}
 
	// 如果倍率小于 1 或者视窗比原图还高, 高度设为跟原图一致, 否则去设定高度
	if(multiple.vertical <= 1 || config.viewportSize[1] > image.height) {
		dimension.height = image.height;
	} else {
		dimension.height = config.viewportSize[1];
	}
 
	return dimension;
}

上节《JavaScript 放大镜- 移动镜片》我们实现了镜片在缩略图上的移动效果, 并留下习题:"当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?"
为了防止镜片受边框影响偏移, 可以通过为镜片对象设定与边框宽度一样的负 margin 值来消除偏移.

本节没有 DEMO, 但对后面几讲来说十分重要, 请同学们搞清楚正常和异常情况下的比例换算.
同样留个课后思考题, 本文的代码中出现了 round 方法, 这是一个四舍五入取整方法, 如果要你自己实现这个功能, 你会如何处理? (提示: 可参考计算机图形学关于线条走样的处理方法)

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: JavaScript 放大镜 - 放大倍率和视窗尺寸

  1. http://0.gravatar.com/avatar/c0a838a78ba8b16a36affd1e174764a4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    那个translate也太厉害了吧,怎么做?

  2. http://0.gravatar.com/avatar/2b8807451a7b6815c9bd49f110c29380?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    so good!收藏了。。。话说回来其中三个我不知道是啥呵呵惭愧。。。

  3. http://1.gravatar.com/avatar/14e409ffeacb1676dc1232e50d6da6c1?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错,思路清晰,顶!

  4. http://1.gravatar.com/avatar/5a57a3b239f4e8b1f0adf7b3f5a69043?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  5. http://0.gravatar.com/avatar/0cd6ce9d52938c2951d6e2a09127ab69?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错,最喜欢这种讲思路的文章~

  6. http://0.gravatar.com/avatar/ac555be5964e168cba0475c0469fd98f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,好久没来看,准备看一篇留一句

  7. http://1.gravatar.com/avatar/fb806bc515fb9e95a5da6f3a3996473d?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    very good ! Worth learning

  8. http://1.gravatar.com/avatar/f76b089be7581c8f04518e80c3ebd96a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  9. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @willerce
    图片画的是一些 free soft 的老大, 很经典的一个图, 网上找的.
    图片和放大镜的关系是我做的.

    @bolo
    不会吧, 我的注释一直很详细. 哪里看不懂, 告诉我, 我细化一下.

  10. http://0.gravatar.com/avatar/a47dbe4f3cca8ddd3873c7df22209854?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  11. http://1.gravatar.com/avatar/fdcf5ec4cad86aaf28d13245d3fb99a2?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    学了。不错。哈哈。

  12. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    注释不够详细,看得一知半解

  13. http://0.gravatar.com/avatar/8aa97fe8ca30db7b8b4c992f013736bf?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  14. http://1.gravatar.com/avatar/9bab0a1e953251ded956a26aa74bf834?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    厉害啊~~

  15. http://0.gravatar.com/avatar/8eb05daeae832f4d0d5fa7dd5ff987dd?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好效果,的确值得持续关注:)

  16. http://0.gravatar.com/avatar/6ae83ef4bfaa6f98356a5187b6f171f6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    :shock: :shock: :shock: 还算靠前 呵呵 学习学习!

  17. http://0.gravatar.com/avatar/0fcfa7ff75012253db287414bd600fea?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  18. http://0.gravatar.com/avatar/09d288a90ae2da168f11cb4c5e49199f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我对于文中的图比较感兴趣。

  19. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @underone
    是的. 不过没奖品.

  20. http://0.gravatar.com/avatar/e8f87528ed0a0eaba60009f8580df401?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    难道抢到沙发

  1. Loading...