最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript淘寶主圖放大鏡功能

 更新時間:2016年10月20日 08:41:40   作者:張飛翔  
這篇文章主要為大家詳細(xì)介紹了javascript淘寶主圖放大鏡功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

工欲善其事,必先利其器。想要實(shí)現(xiàn)某一種效果,我們必須要先了解其中的原理。
放大鏡的功能就是通過獲取鼠標(biāo)在小圖中的位置,然后根據(jù)大小圖的尺寸比例換算出大圖需要顯示的部分,然后使用定位讓大圖要顯示的部分出現(xiàn)在右邊的邊框內(nèi)。
然后看代碼,根據(jù)代碼看講解會更容易理解。

html部分

<!DOCTYPE html> 
<html lang="en"> 
<head> 
 <meta charset="UTF-8"> 
 <title>放大鏡效果</title> 
 <link rel="stylesheet" href="magnifier.css"> 
</head> 
<body> 
 <div id="wrapper"> 
 <!--小圖--> 
  <div id="img_min"> 
  <!--圖片--> 
  <img src="test.jpg" alt="min"> 
  <!--跟隨鼠標(biāo)的白塊--> 
  <p id="mousebg"></p> 
  </div> 
  <!--大圖--> 
  <div id="img_max"><img id="img2_img" src="test.jpg" alt="max"></div> 
 </div> 
 <script type="text/javascript" src="magnifier.js"></script> 
</body> 
</html> 

css部分

*{ 
 margin: 0; 
 padding: 0; 
} 
div{ 
 position: relative; 
} 
div>div{ 
 width: 300px; 
 height: 300px; 
 float: left; 
 margin: 100px; 
 overflow: hidden; 
} 
#img_min>img{ 
 /*display: block;*/ 
 width: 300px; 
} 
#img_max{ 
 display: none; 
  
} 
#img_max>img{ 
 position: absolute; 
 top: 0; 
 left: 0; 
 display: block; 
 width: 1500px; 
} 
#mousebg{ 
 display: none; 
 position: absolute; 
 width: 60px; 
 height: 60px; 
 background-color: rgba(255,255,255,.7); 
 top: 0; 
 left: 0; 
} 

最重要的javascript部分

window.onload = function () { 
 var img1 = document.getElementById('img_min');//小圖盒子 
 var img2 = document.getElementById('img_max');//大圖盒子 
 var img2_img = document.getElementById('img2_img');//大圖圖片 
 var wrap = document.getElementById('wrapper'); 
 var mousebg = document.getElementById('mousebg');//鼠標(biāo)白塊 
 var mul = 5; 
 //當(dāng)某一個模塊dispaly:none的時候不能使用offsetWidth獲取它的寬高 
 img1.onmouseover = function () { 
  //鼠標(biāo)進(jìn)入 
  img2.style.display = 'block'; 
  mousebg.style.display = 'block'; 
   
 } 
 img1.onmouseout = function () { 
  //鼠標(biāo)離開 
  img2.style.display = 'none'; 
  mousebg.style.display = 'none'; 
 } 
 img1.onmousemove = function (event) { 
  var _event = event||window.event;//兼容性處理 
  var mouseX = _event.clientX - wrap.offsetLeft - img1.offsetLeft; 
  //計(jì)算鼠標(biāo)相對與小圖的位置 
  var mouseY = _event.clientY - wrap.offsetTop - img1.offsetTop; 
 
  //特殊情況處理,分別靠近四條邊的時候 
  if(mouseX<mousebg.offsetWidth/2){ 
   mouseX = mousebg.offsetWidth/2; 
  } 
  if(mouseX>img1.offsetWidth-mousebg.offsetWidth/2){ 
   mouseX = img1.offsetWidth-mousebg.offsetWidth/2; 
  } 
  if(mouseY<mousebg.offsetHeight/2){ 
   mouseY = mousebg.offsetHeight/2; 
  } 
  if(mouseY>img1.offsetHeight-mousebg.offsetHeight/2){ 
   mouseY = img1.offsetHeight-mousebg.offsetHeight/2; 
  } 
  //計(jì)算大圖的顯示范圍 
  img2_img.style.left = -mul*mouseX+img2.offsetWidth/2+"px"; 
  img2_img.style.top = -mul*mouseY+img2.offsetHeight/2+"px"; 
  //使鼠標(biāo)在白塊的中間 
  mousebg.style.left = mouseX-mousebg.offsetWidth/2+"px"; 
  mousebg.style.top = mouseY-mousebg.offsetHeight/2+"px"; 
   
 } 
} 

如果你看完代碼和注釋已經(jīng)理解了,用李云龍的一句話說:“哎呀,你小子tnd還真是個天才”。那么下面的解析部分你快速的瀏覽完就OK了。

解析部分:

html和css部分都是簡單的布局代碼,不再講解,js部分代碼也比較簡單,我們直接講解鼠標(biāo)移動事件部分的代碼。
首先用一張圖來解釋一下獲取鼠標(biāo)相對與小圖位置的原理:

可以看到通過代碼中的運(yùn)算,我們所獲取的值就是鼠標(biāo)相對于img1左上角的值。
理解了這一步之后,其實(shí)可以說我們的工作已經(jīng)完成了一半了。
然后,我們先跳過特殊情況的處理,直接進(jìn)行右邊圖片定位的基本運(yùn)算。
因?yàn)橛杏玫給ffsetWidth、offsetHeight、style.width、style.height屬性,其中style.width、style.height和offsetWidth、offsetHeight的范圍是相同的,其他不同我會在另一篇博客中詳細(xì)描述。我們先用一張圖了解下這幾個屬性,同時和上面的幾個屬性進(jìn)行對比(圖片來自互聯(lián)網(wǎng),侵刪)

然后我們講解代碼:

右邊大圖框中的圖片使用style.left定位在大圖框中的位置,負(fù)號是因?yàn)槲覀兪髽?biāo)的運(yùn)動方向剛好是和我們大圖框中的圖片運(yùn)動的方向相反,mul則是根據(jù)大圖和小圖的尺寸計(jì)算出來的比例,-mul*mouseX計(jì)算出來的其實(shí)就是圖片在大圖框中的相對位置,但是此時你會發(fā)現(xiàn)你鼠標(biāo)所在的位置在右邊是在圖框的左上角的,所以我們要加上一個 img2.offsetWidth/2 來讓圖片居中顯示。同樣我們在縱坐標(biāo)進(jìn)行相同的處理就好了。

//計(jì)算大圖的顯示范圍 
  img2_img.style.left = -mul*mouseX+img2.offsetWidth/2+"px"; 
  img2_img.style.top = -mul*mouseY+img2.offsetHeight/2+"px"; 

下面我們就要進(jìn)行特殊情況的處理了,做到上一步的時候你會發(fā)現(xiàn),在鼠標(biāo)移動到邊緣的時候,鼠標(biāo)那個小白塊有時候會跑出圖片的范圍,所以我們就要進(jìn)行處理將它限制在圖片的范圍內(nèi),因?yàn)槭髽?biāo)是在白色透明塊的中間,所以我們就是將鼠標(biāo)限制在距離圖片邊框上下左右二分之一白塊長/寬的位置即可。

//特殊情況處理,分別靠近四條邊的時候 
  if(mouseX<mousebg.offsetWidth/2){ 
   mouseX = mousebg.offsetWidth/2; 
  } 
  if(mouseX>img1.offsetWidth-mousebg.offsetWidth/2){ 
   mouseX = img1.offsetWidth-mousebg.offsetWidth/2; 
  } 
  if(mouseY<mousebg.offsetHeight/2){ 
   mouseY = mousebg.offsetHeight/2; 
  } 
  if(mouseY>img1.offsetHeight-mousebg.offsetHeight/2){ 
   mouseY = img1.offsetHeight-mousebg.offsetHeight/2; 
  } 

當(dāng)距離左邊小于二分之一寬的時候,我們就讓mouseX等于二分之一寬,這樣白塊就不會繼續(xù)移動,其他三個方向同理。
做完這一步,我們的效果也就全部完成了。
ps:抽象的地方可以通過畫圖來幫助理解。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript輸出當(dāng)前時間Unix時間戳的方法

    JavaScript輸出當(dāng)前時間Unix時間戳的方法

    這篇文章主要介紹了JavaScript輸出當(dāng)前時間Unix時間戳的方法,涉及javascript中Date及getTime等函數(shù)操作時間的使用技巧,需要的朋友可以參考下
    2015-04-04
  • javascript獲取select值的方法完整實(shí)例

    javascript獲取select值的方法完整實(shí)例

    這篇文章主要介紹了javascript獲取select值的方法,結(jié)合完整實(shí)例形式分析了javascript動態(tài)遍歷與操作頁面元素相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-06-06
  • JavaScript數(shù)組排序的六種常見算法總結(jié)

    JavaScript數(shù)組排序的六種常見算法總結(jié)

    這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組排序的六種常見算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用JavaScript數(shù)組具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 詳解Webpack實(shí)戰(zhàn)之構(gòu)建 Electron 應(yīng)用

    詳解Webpack實(shí)戰(zhàn)之構(gòu)建 Electron 應(yīng)用

    本篇文章主要介紹了Webpack實(shí)戰(zhàn)之構(gòu)建 Electron 應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解Webpack + ES6 最新環(huán)境搭建與配置

    詳解Webpack + ES6 最新環(huán)境搭建與配置

    這篇文章主要介紹了詳解Webpack + ES6 最新環(huán)境搭建與配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • javascript字符串替換及字符串分割示例代碼

    javascript字符串替換及字符串分割示例代碼

    javascript中的字符串替換及字符串分割在某些情況下還是比較實(shí)用的,下面有個不錯的示例,感興趣的朋友可以參考下
    2013-12-12
  • input 寬度自適應(yīng)

    input 寬度自適應(yīng)

    感謝網(wǎng)友“l(fā)iufabin”提出的關(guān)于不支持FF的問題,第一個在FF下經(jīng)過測試時支持的,第二個中的高度自適應(yīng)不支持,我在網(wǎng)上找了一個JQUERY的插件
    2009-05-05
  • layui table 表格上添加日期控件的兩種方法

    layui table 表格上添加日期控件的兩種方法

    今天小編就為大家分享一篇layui table 表格上添加日期控件的兩種方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScrip實(shí)現(xiàn)一個有時間限制的緩存類的方式

    JavaScrip實(shí)現(xiàn)一個有時間限制的緩存類的方式

    本文將探索 JavaScript 中一種基于自動過期機(jī)制的時間限制緩存實(shí)現(xiàn)方式,提高數(shù)據(jù)緩存策略的靈活性和效率,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 檢查JavaScript對象屬性是否存在的方法小結(jié)

    檢查JavaScript對象屬性是否存在的方法小結(jié)

    在前端開發(fā)面試,面試官提出了一個經(jīng)典的JavaScript問題:“在JavaScript中,如何檢查對象是否包含某個屬性?請你詳細(xì)介紹幾種不同的方法,并解釋它們的區(qū)別,”這個問題考驗(yàn)?zāi)銓avaScript的基礎(chǔ)掌握情況,讓我們進(jìn)入這個面試場景,需要的朋友可以參考下
    2024-09-09

最新評論

三河市| 旌德县| 法库县| 长沙市| 故城县| 洛阳市| 安吉县| 霞浦县| 德保县| 宁强县| 阿克苏市| 惠东县| 西盟| 镇沅| 大名县| 长海县| 青州市| 凤翔县| 麦盖提县| 河池市| 诸暨市| 湾仔区| 长武县| 黑河市| 平昌县| 广西| 宁化县| 仪征市| 乐都县| 无棣县| 临洮县| 邹平县| 通山县| 视频| 江西省| 精河县| 宁化县| 乐至县| 长岭县| 大邑县| 宁海县|