javascript實(shí)現(xiàn)商品圖片放大鏡
優(yōu)化原因
現(xiàn)在的電商商城項(xiàng)目解決的主要是購買商品的問題,那么購買商品主要要看清楚商品表面外形的主要特征和細(xì)節(jié),如果圖片處理過小,或者細(xì)節(jié)過于模糊,就需要做一個(gè)商品高清圖片放大局部的功能。
技術(shù)關(guān)鍵點(diǎn)
1.左側(cè)和上側(cè)距離,在一個(gè)水平位置和垂直位置中有我們可以挪動(dòng)的區(qū)域,就是原圖片區(qū)域,鼠標(biāo)挪動(dòng)位置是一個(gè)塊狀位置,他的左側(cè)和上側(cè)距離瀏覽器上側(cè)和左側(cè)分別有一個(gè)長度,我們叫它們 ClientX 和 ClientY,而左上側(cè)鼠標(biāo)沒有略過的位置實(shí)際上是一個(gè)點(diǎn),我們拖動(dòng)放大塊時(shí),它會(huì)由一個(gè)點(diǎn)變成一個(gè)方塊,這個(gè)放大鏡左上邊的點(diǎn)所控制的這一點(diǎn)距離屏幕上側(cè)和左側(cè)的 ClientY 和 ClientX 會(huì)隨著鼠標(biāo)的移動(dòng)而變大變小,那么要計(jì)算放大塊左側(cè)距離原點(diǎn)和上側(cè)原點(diǎn)就要減去原圖距離屏幕的上邊高度和左邊高度。在一個(gè)水平位置和垂直位置中有我們可以挪動(dòng)的區(qū)域,就是原圖片區(qū)域,鼠標(biāo)挪動(dòng)位置是一個(gè)塊狀位置,他的左側(cè)和上側(cè)距離瀏覽器上側(cè)和左側(cè)分別有一個(gè)長度,我們叫它們 ClientX 和 ClientY,而左上側(cè)鼠標(biāo)沒有略過的位置實(shí)際上是一個(gè)點(diǎn),我們拖動(dòng)放大塊時(shí),它會(huì)由一個(gè)點(diǎn)變成一個(gè)方塊,這個(gè)放大鏡左上邊的點(diǎn)所控制的這一點(diǎn)距離屏幕上側(cè)和左側(cè)的 ClientY 和 ClientX 會(huì)隨著鼠標(biāo)的移動(dòng)而變大變小,那么要計(jì)算放大塊左側(cè)距離原點(diǎn)和上側(cè)原點(diǎn)就要減去原圖距離屏幕的上邊高度和左邊高度。
計(jì)算方式
x = 事件對(duì)象.clientX - 外側(cè)盒子.offsetLeft;
Y = 事件對(duì)象.clientY - 外側(cè)盒子.offsetTop;
2.解決如何鼠標(biāo)在黃塊內(nèi)居中的問題,橫縱位移分別加上放大黃塊一半的長度和寬度。
計(jì)算方式
x = 事件對(duì)象.clientX - 外側(cè)盒子.offsetLeft - 小黃.offsetWidth/2;
Y = 事件對(duì)象.clientY - 外側(cè)盒子.offsetTop - 小黃.offsetHeight/2;
// 事件對(duì)象的 offsetX 和 offsetY
// 歸屬于事件對(duì)象
// 作用:關(guān)注的鼠標(biāo)的坐標(biāo)(鼠標(biāo)相對(duì)于當(dāng)前元素的坐標(biāo))
// 元素的 offsetLeft 和 offsetTop
// 歸屬于元素
// 作用:關(guān)注的元素的坐標(biāo)(相對(duì)于offsetParent的坐標(biāo))
3. 小黃塊的最大距離
4.用preventDefault阻止事件冒泡
簡易實(shí)現(xiàn)代碼
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="base.css" rel="external nofollow" /> </head> <body> <div class="w"> <div class="fdj"> <!-- 左側(cè) --> <div class="leftBox" id="_leftBox"> <!-- 小圖 --> <img src="img/m.jpg" alt=""/> <!-- 小黃盒子 --> <div class="tool" id="_tool"></div> </div> <!-- 右側(cè) --> <div class="rightBox" id="_rightBox"> <img id="_bImg" src="img/b.jpg" alt=""/> </div> </div> </div> <!-- 引入的外部js程序文件 --> <script src="index.js"></script> </body> </html>
* { margin:0; padding:0; } .w { width: 1190px; margin: 0 auto; } .fdj { margin-top: 20px; } .fdj .leftBox { width: 400px; height: 400px; border: 1px solid #ccc; float: left; position: relative; overflow: hidden; } .fdj .tool { width: 250px; height: 250px; background:gold; opacity:.5; filter:alpha(opacity=50); position: absolute; top:0; left: 0; cursor: move; /* 默認(rèn)隱藏 */ display: none; } /* 給小黃加上active 就會(huì)顯示 */ .fdj .tool.active { display: block; } .fdj .rightBox { width: 500px; height: 500px; border:1px solid #ccc; float: left; overflow: hidden; /* 隱藏 */ display: none; position: relative; } /* 加上active表示顯示 */ .fdj .rightBox.active { display: block; } .fdj .rightBox img { position: absolute; }
//【準(zhǔn)備:獲取要操作的元素】 var _leftBox = document.querySelector('#_leftBox'); // 左側(cè)盒子 var _tool = document.querySelector('#_tool'); // 小黃盒子 var _rightBox = document.querySelector('#_rightBox'); // 右側(cè)盒子 var _bImg = document.querySelector('#_bImg'); // 右側(cè)盒子中的大圖片 //【功能1:鼠標(biāo)進(jìn)入/離開左側(cè)盒子顯示/隱藏小黃和右側(cè)盒子】 // 1. 給_leftBox注冊(cè)鼠標(biāo)進(jìn)入事件 onmouseenter _leftBox.onmouseenter = function () { // 1.1 顯示小黃盒子,給小黃盒子添加類名 active _tool.className = 'tool active'; // 1.2 顯示右側(cè)盒子,給右側(cè)盒子添加類名 active _rightBox.className = 'rightBox active'; } // 2. 給_leftBox注冊(cè)鼠標(biāo)離開事件 onmouseleave _leftBox.onmouseleave = function () { // 2.1 顯示小黃盒子,給小黃盒子去除類名 active _tool.className = 'tool'; // 2.2 顯示右側(cè)盒子,給右側(cè)盒子去除類名 active _rightBox.className = 'rightBox'; } //【功能2:鼠標(biāo)在左側(cè)區(qū)域移動(dòng)時(shí),控制小黃和右側(cè)盒子中圖片的位置】 // 1. 給左側(cè)盒子注冊(cè)鼠標(biāo)移動(dòng)事件 onmosuemove _leftBox.onmousemove = function (e) { // 2. 通過事件對(duì)象獲取鼠標(biāo)相對(duì)元素的位置(x,y) var x = e.clientX - _leftBox.offsetLeft- _tool.offsetWidth/2; var y = e.clientY - _leftBox.offsetTop - _tool.offsetHeight/2; // 這里給x和y賦值時(shí),不要用事件對(duì)象的offsetX和offsetY。 // 原因:因?yàn)椤臼录芭荨?,鼠?biāo)在移動(dòng)時(shí),有時(shí)會(huì)移動(dòng)到小黃盒子上。若移動(dòng)到小黃盒子上時(shí),獲取的值不是相對(duì)于左側(cè)盒子元素,而是相對(duì)小黃盒子元素。所以當(dāng)鼠標(biāo)進(jìn)入或離開小黃時(shí),獲取的坐標(biāo)值時(shí)大時(shí)小,導(dǎo)致小黃盒子上下左右波動(dòng)。 // 解決方案:在小黃移動(dòng)事件中,停止冒泡。但是鼠標(biāo)在移動(dòng)時(shí),就沒有效果了。 // 最終解決方案:放棄使用事件對(duì)象offsetX/Y。 選擇事件對(duì)象的clienX/Y 結(jié)合左側(cè)盒子的位置計(jì)算出正確的位置。 // 2.1 對(duì)x和y限制 if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (x > _leftBox.offsetWidth - _tool.offsetWidth) { x = _leftBox.offsetWidth - _tool.offsetWidth; } if (y > _leftBox.offsetHeight - _tool.offsetHeight) { y = _leftBox.offsetHeight - _tool.offsetHeight; } // 3. 把計(jì)算好的位置 賦值給小黃 _tool.style.left = x + 'px'; _tool.style.top = y + 'px'; // 4. 設(shè)定右側(cè)大圖片的位置(設(shè)置的方向是相反的,比例關(guān)系是1:2) _bImg.style.left = -2 * x + 'px'; _bImg.style.top = -2 * y + 'px'; }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript實(shí)現(xiàn)簡單的貪吃蛇游戲
本文很簡單,給大家分享了一段使用javascript實(shí)現(xiàn)簡單的貪吃蛇游戲的代碼,算是對(duì)自己學(xué)習(xí)javascript的一次小小的總結(jié),代碼參考了網(wǎng)友的部分內(nèi)容,推薦給大家,希望對(duì)大家能夠有所幫助。2015-03-03ES6 Iterator遍歷器原理,應(yīng)用場(chǎng)景及相關(guān)常用知識(shí)拓展詳解
這篇文章主要介紹了ES6 Iterator遍歷器原理,應(yīng)用場(chǎng)景及相關(guān)常用知識(shí)拓展,結(jié)合實(shí)例形式詳細(xì)分析了ES6 Iterator遍歷器具體原理、功能、用法、應(yīng)用場(chǎng)景及知識(shí)拓展,需要的朋友可以參考下2020-02-02前端高頻面試題之JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制
本文給大家分享前端高頻面試題JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制,本文分文別類給大家介紹了棧(stack)和堆(heap)的區(qū)別基本類型和引用類型的相關(guān)知識(shí),瀏覽器垃圾回收機(jī)制包括基本概念給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10JavaScript實(shí)現(xiàn)的in_array函數(shù)
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的in_array函數(shù),用于判斷一個(gè)值是否在數(shù)組中,類似PHP的in_array函數(shù),需要的朋友可以參考下2014-08-08淺析在javascript中創(chuàng)建對(duì)象的各種模式
下面小編就為大家?guī)硪黄獪\析在javascript中創(chuàng)建對(duì)象的各種模式。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05?javascript數(shù)組中的lastIndexOf方法
這篇文章主要介紹了?javascript數(shù)組中的lastIndexOf方法,該方法可返回一個(gè)指定的字符串值最后出現(xiàn)的位置,在一個(gè)字符串中的指定位置從后向前搜索,下文詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-03-03JS實(shí)現(xiàn)textarea通過換行或者回車把多行數(shù)字分割成數(shù)組并且去掉數(shù)組中空的值
這篇文章主要介紹了JS實(shí)現(xiàn)textarea通過換行或者回車把多行數(shù)字分割成數(shù)組并且去掉數(shù)組中空的值的相關(guān)資料,需要的朋友可以參考下2018-10-10Layui數(shù)據(jù)表格 前后端json數(shù)據(jù)接收的方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格 前后端json數(shù)據(jù)接收的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09