JavaScript 放大鏡 移動(dòng)鏡片效果代碼
本次我們先了解如何在縮略圖上移動(dòng)鏡片. (這是 DEMO)
縮略圖和鏡片組成的 DOM 結(jié)構(gòu)如下.
<a id="thumb" href="#">
<img src="http://img.alibaba.com/photo/291909368/Free-Shipping-Popular-ladies-shoes-Tote-shoes-paypal-accept-201001.jpg" alt="Thumbnail" />
<span id="glass"></span>
</a>
我在縮略圖容器中放置圖片和鏡片節(jié)點(diǎn), 以縮略圖容器作為相對(duì)位置參考, 在觸發(fā) mousemove 事件時(shí)修改鏡片的位置. 換個(gè)說(shuō)法, 我們要解決的問(wèn)題是, 算出鏡片左上角的在縮略圖容器中的位置. 計(jì)算鏡片位移的 JavaScript 代碼如下.
/**
* 獲取鏡片在放大目標(biāo)元素上的位置
* @param ev 觸發(fā)的事件
* @param thumb 縮略圖對(duì)象
* @param glass 鏡片對(duì)象
* @return x:鏡片在放大目標(biāo)元素上的橫向位置, y:鏡片在放大目標(biāo)元素上的縱向位置
*/
function getGlassOffset(ev, thumb, glass) {
var offset = {
left:0,
top:0
};
// 偏移量
var thumbOffset = getCumulativeOffset(thumb);
// 鼠標(biāo)在頁(yè)面上的位置
var mousePoint = getMousePoint(ev);
// 鏡片實(shí)際尺寸
var glassSize = getSize(glass);
// 簡(jiǎn)縮圖實(shí)際尺寸
var thumbSize = getSize(thumb);
// 光標(biāo)橫向位置
var cursorX = mousePoint.x - thumbOffset.left;
// 鏡片橫向偏移量
offset.left = cursorX - glassSize.width / 2;
if(offset.left < 0) {
offset.left = 0;
} else if(offset.left > thumbSize.width - glassSize.width) {
offset.left = thumbSize.width - glassSize.width;
}
// 光標(biāo)縱向位置
var cursorY = mousePoint.y - thumbOffset.top;
// 鏡片縱向偏移量
offset.top = cursorY - glassSize.height / 2;
if(offset.top < 0) {
offset.top = 0;
} else if(offset.top > thumbSize.height - glassSize.height) {
offset.top = thumbSize.height - glassSize.height;
}
return offset;
}
鏡片左上角在縮略圖容器中的位置 = 鼠標(biāo)位置 - 縮略圖左上角位置 - 鏡片尺寸的一半
當(dāng)鏡片在容器外, 將鏡片靠邊. 全部代碼請(qǐng)窺視 DEMO. (知道我為何上一篇寫通過(guò) JS 獲取鼠標(biāo)位置了吧?)
留個(gè)課后思考題, 當(dāng)鏡片帶邊框時(shí), 如何保證邊框不影響鏡片移動(dòng)時(shí)的精確度?
相關(guān)文章
解決typescript?提示?Object?is?possibly'null'的N種方案
這篇文章主要介紹了typescript?提示?Object?is?possibly?‘null‘?的N種解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03用js實(shí)現(xiàn)每隔一秒刷新時(shí)間的實(shí)例(含年月日時(shí)分秒)
下面小編就為大家?guī)?lái)一篇用js實(shí)現(xiàn)每隔一秒刷新時(shí)間的實(shí)例(含年月日時(shí)分秒)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10js獲取當(dāng)前日期昨天、今天、明天日期的不同方法總結(jié)
JS中處理日期時(shí)間常用Date對(duì)象,下面這篇文章主要給大家介紹了關(guān)于利用js獲取當(dāng)前日期昨天、今天、明天日期的不同方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11基于js實(shí)現(xiàn)復(fù)制內(nèi)容到操作系統(tǒng)粘貼板過(guò)程解析
這篇文章主要介紹了基于js實(shí)現(xiàn)復(fù)制內(nèi)容到操作系統(tǒng)粘貼板過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10TypeScript調(diào)整數(shù)組元素順序算法
數(shù)組類型在TS中可以使用多種方式,比較靈活,下面這篇文章主要給大家介紹了關(guān)于TypeScript調(diào)整數(shù)組元素順序算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測(cè)詳解
這篇文章主要給大家介紹了關(guān)于Three.js利用Detector.js插件如何實(shí)現(xiàn)兼容性檢測(cè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09解析ScrollPic在ie8下只滾動(dòng)一遍,然后變?yōu)榭瞻?ie6,ie7,chrome,firefox正常
解析ScrollPic在ie8下只滾動(dòng)一遍,然后變?yōu)榭瞻?ie6,ie7,chrome,firefox都正常)2013-06-06有關(guān)div頁(yè)面拖動(dòng)、縮放、關(guān)閉、遮罩效果代碼
有關(guān)div頁(yè)面拖動(dòng)、縮放、關(guān)閉、遮罩效果代碼,比較不錯(cuò),適合學(xué)習(xí)用。2009-08-08js實(shí)現(xiàn)當(dāng)鼠標(biāo)移到表格上時(shí)顯示這一格全部?jī)?nèi)容的代碼
下面小編就為大家?guī)?lái)一篇js實(shí)現(xiàn)當(dāng)鼠標(biāo)移到表格上時(shí)顯示這一格全部?jī)?nèi)容的代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06