JavaScript 放大鏡 放大倍率和視窗尺寸
一個完整的放大鏡結(jié)構(gòu)里, 與倍率扯上關(guān)系的一共有 4 個對象, 原圖, 縮略圖, 鏡片和視窗. 鏡片在縮略圖上的覆蓋位置, 其實就是視窗對原圖的部分展示, 所以它們之間有如下關(guān)系.
倍率 = 原圖/縮略圖 = 視窗/鏡片
倍率一般大于等于 1, 因為原圖一般都不會小于縮略圖. 一旦倍率小于 1, 則將倍率設(shè)為 1.
因為縮略圖和原圖的尺寸是不可變的, 所以我們通過它們來獲得倍率.
/**
* 獲取放大鏡放大倍數(shù)
* @param thumb 縮略圖對象
* @param glass 鏡片對象
* @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)一視覺感官和防止破頁, 我們一般也會指定視窗的尺寸, 所以鏡片的尺寸是根據(jù)其他幾個對象計算出來的.
鏡片 = 縮略圖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';
}
如果定義的視窗的寬或高比原圖還要小, 那該如何顯示?
需要改變視窗的尺寸. 假設(shè)原圖是 240x180, 視窗原定尺寸是 200x200. 視窗尺寸隨之改變?yōu)?200x180. 此時鏡片的尺寸仍須與視窗成正比.
如果倍率小于 1, 又該如何顯示?
將倍率設(shè)為 1, 鏡片覆蓋整個縮略圖, 顯示整個原圖為視窗內(nèi)容; 或者不作操作 (禁止放大鏡效果).
下面的代碼用于獲取視窗的尺寸.
/**
* 返回視窗尺寸
* @param multiple 倍率
* @param image 原圖對象
* @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 放大鏡- 移動鏡片》我們實現(xiàn)了鏡片在縮略圖上的移動效果, 并留下習(xí)題:"當鏡片帶邊框時, 如何保證邊框不影響鏡片移動時的精確度?"
為了防止鏡片受邊框影響偏移, 可以通過為鏡片對象設(shè)定與邊框?qū)挾纫粯拥呢?margin 值來消除偏移.
本節(jié)沒有 DEMO, 但對后面幾講來說十分重要, 請同學(xué)們搞清楚正常和異常情況下的比例換算.
同樣留個課后思考題, 本文的代碼中出現(xiàn)了 round 方法, 這是一個四舍五入取整方法, 如果要你自己實現(xiàn)這個功能, 你會如何處理? (提示: 可參考計算機圖形學(xué)關(guān)于線條走樣的處理方法)
相關(guān)文章
D3.js 從P元素的創(chuàng)建開始(顯示可加載數(shù)據(jù))
D3是一個基于數(shù)據(jù)操作的可視化js庫,認識d3,就從最基礎(chǔ)的顯示可加載數(shù)據(jù)談起,需要的朋友可以參考下2014-10-10TypeScript條件類型與內(nèi)置條件類型超詳細講解
我們可以使用TypeScript中的條件類型來根據(jù)邏輯定義某些類型,就像是在編寫代碼那樣。它采用的語法和我們在JavaScript中熟悉的三元運算符很像:condition ? ifConditionTrue : ifConditionFalse。我們來看看他是怎么工作的2023-03-03JavaScript數(shù)組Array對象增加和刪除元素方法總結(jié)
這篇文章主要介紹了JavaScript數(shù)組Array對象增加和刪除元素方法,實例總結(jié)了pop方法、push方法、splice方法、concat方法等的使用技巧,需要的朋友可以參考下2015-01-01js RuntimeObject() 獲取ie里面自定義函數(shù)或者屬性的集合
取得ie 里面 自定義函數(shù)或者屬性的集合 使用RuntimeObject()實現(xiàn),需要的朋友可以參考下。2010-11-11bootstrap模態(tài)框彈出和隱藏,動態(tài)改變中間內(nèi)容的實例
今天小編就為大家分享一篇bootstrap模態(tài)框彈出和隱藏,動態(tài)改變中間內(nèi)容的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08javascript實現(xiàn)避免頁面按鈕重復(fù)提交
很多時候我們都需要防止重復(fù)提交,這方面的文章也比較多,實現(xiàn)的途徑差別也很大.因為有些時候即使服務(wù)器能夠識別重復(fù)的提交,也會造成問題.比如需要很長等待時間的操作,在首次提交后,不斷重復(fù)提交,頁面可能會死掉.用腳本來控制的話可以防止這種問題.2015-01-01