JavaScript 放大鏡 放大倍率和視窗尺寸
一個(gè)完整的放大鏡結(jié)構(gòu)里, 與倍率扯上關(guān)系的一共有 4 個(gè)對(duì)象, 原圖, 縮略圖, 鏡片和視窗. 鏡片在縮略圖上的覆蓋位置, 其實(shí)就是視窗對(duì)原圖的部分展示, 所以它們之間有如下關(guān)系.
倍率 = 原圖/縮略圖 = 視窗/鏡片

倍率一般大于等于 1, 因?yàn)樵瓐D一般都不會(huì)小于縮略圖. 一旦倍率小于 1, 則將倍率設(shè)為 1.
因?yàn)榭s略圖和原圖的尺寸是不可變的, 所以我們通過它們來獲得倍率.
/**
* 獲取放大鏡放大倍數(shù)
* @param thumb 縮略圖對(duì)象
* @param glass 鏡片對(duì)象
* @return 放大鏡放大倍數(shù)
*/
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;
}
原圖和縮略圖是固定的. 而為了統(tǒng)一視覺感官和防止破頁, 我們一般也會(huì)指定視窗的尺寸, 所以鏡片的尺寸是根據(jù)其他幾個(gè)對(duì)象計(jì)算出來的.
鏡片 = 縮略圖x視窗/原圖 = 縮略圖/倍率
/**
* 加載鏡片的樣式
* @param viewportSize 視窗尺寸
* @param multiple 倍率
* @param glass 鏡片對(duì)象
*/
function loadGlassStyle(viewportSize, multiple, glass) {
glass.style.width = round(viewportSize.width / multiple.horizontal) + 'px';
glass.style.height = round(viewportSize.height / multiple.vertical) + 'px';
}
如果定義的視窗的寬或高比原圖還要小, 那該如何顯示?
需要改變視窗的尺寸. 假設(shè)原圖是 240x180, 視窗原定尺寸是 200x200. 視窗尺寸隨之改變?yōu)?200x180. 此時(shí)鏡片的尺寸仍須與視窗成正比.
如果倍率小于 1, 又該如何顯示?
將倍率設(shè)為 1, 鏡片覆蓋整個(gè)縮略圖, 顯示整個(gè)原圖為視窗內(nèi)容; 或者不作操作 (禁止放大鏡效果).
下面的代碼用于獲取視窗的尺寸.
/**
* 返回視窗尺寸
* @param multiple 倍率
* @param image 原圖對(duì)象
* @return 視窗尺寸
*/
getViewportSize: function(multiple, image) {
var dimension = {
width:0,
height:0
};
// 如果倍率小于 1 或者視窗比原圖還寬, 寬度設(shè)為跟原圖一致, 否則去設(shè)定寬度
if(multiple.horizontal <= 1 || config.viewportSize[0] > image.width) {
dimension.width = image.width;
} else {
dimension.width = config.viewportSize[0];
}
// 如果倍率小于 1 或者視窗比原圖還高, 高度設(shè)為跟原圖一致, 否則去設(shè)定高度
if(multiple.vertical <= 1 || config.viewportSize[1] > image.height) {
dimension.height = image.height;
} else {
dimension.height = config.viewportSize[1];
}
return dimension;
}
上節(jié)《JavaScript 放大鏡- 移動(dòng)鏡片》我們實(shí)現(xiàn)了鏡片在縮略圖上的移動(dòng)效果, 并留下習(xí)題:"當(dāng)鏡片帶邊框時(shí), 如何保證邊框不影響鏡片移動(dòng)時(shí)的精確度?"
為了防止鏡片受邊框影響偏移, 可以通過為鏡片對(duì)象設(shè)定與邊框?qū)挾纫粯拥呢?fù) margin 值來消除偏移.
本節(jié)沒有 DEMO, 但對(duì)后面幾講來說十分重要, 請(qǐng)同學(xué)們搞清楚正常和異常情況下的比例換算.
同樣留個(gè)課后思考題, 本文的代碼中出現(xiàn)了 round 方法, 這是一個(gè)四舍五入取整方法, 如果要你自己實(shí)現(xiàn)這個(gè)功能, 你會(huì)如何處理? (提示: 可參考計(jì)算機(jī)圖形學(xué)關(guān)于線條走樣的處理方法)
- 基于angularjs實(shí)現(xiàn)圖片放大鏡效果
- 用js實(shí)現(xiàn)放大鏡的效果的簡(jiǎn)單實(shí)例
- JS實(shí)現(xiàn)圖片放大鏡效果的方法
- 圖片放大鏡jquery.jqzoom.js使用實(shí)例附放大鏡圖標(biāo)
- 原生js寫的放大鏡效果
- 電子商務(wù)網(wǎng)站上的常用的js放大鏡效果
- JavaScript圖片放大鏡效果代碼[代碼比較簡(jiǎn)單]
- javascript 放大鏡效果js組件 qsoft.PopBigImage.v0.35 加入了chrome支持
- JavaScript 圖片切割效果(放大鏡)
- 原生JS實(shí)現(xiàn)的放大鏡效果實(shí)例代碼
相關(guān)文章
基于aotu.js實(shí)現(xiàn)微信自動(dòng)添加通訊錄中的聯(lián)系人功能
這篇文章主要介紹了利用aotu.js實(shí)現(xiàn)微信自動(dòng)添加通訊錄中的聯(lián)系人,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
js調(diào)用父框架函數(shù)與彈窗調(diào)用父頁面函數(shù)的簡(jiǎn)單方法
下面小編就為大家?guī)硪黄猨s調(diào)用父框架函數(shù)與彈窗調(diào)用父頁面函數(shù)的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
如何使用TypeScript實(shí)現(xiàn)一個(gè)瀏覽器事件的集中管理
這篇文章主要介紹了使用TypeScript實(shí)現(xiàn)一個(gè)瀏覽器事件的集中管理,瀏覽器事件模型的主要優(yōu)點(diǎn)是它可以使開發(fā)人員更加靈活地處理用戶交互,并且可以通過事件委托等技術(shù)來提高性能,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06
ES6擴(kuò)展運(yùn)算符的用途實(shí)例詳解
這篇文章主要介紹了ES6擴(kuò)展運(yùn)算符的用途 ,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08
關(guān)于微信上網(wǎng)頁圖片點(diǎn)擊全屏放大效果
這篇文章主要介紹了關(guān)于微信上網(wǎng)頁圖片點(diǎn)擊全屏放大效果的相關(guān)資料,需要的朋友可以參考下2016-12-12
微信小程序?qū)崿F(xiàn)藍(lán)牙設(shè)備搜索及連接功能示例詳解
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)藍(lán)牙設(shè)備搜索及連接功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
微信小程序判斷用戶是否需要再次授權(quán)獲取個(gè)人信息
這篇文章主要介紹了微信小程序判斷用戶是否需要再次授權(quán)獲取個(gè)人信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
禁用JavaScript控制臺(tái)調(diào)試的方法
這篇文章主要介紹了禁用JavaScript控制臺(tái)調(diào)試的方法,需要的朋友可以參考下2014-03-03

