javascript實(shí)現(xiàn)放大鏡插件【含進(jìn)階】

[目錄](méi)

  • 【簡(jiǎn)單的實(shí)現(xiàn)放大鏡動(dòng)能】
  • 成果圖
  • 放大鏡的原理
  • 網(wǎng)頁(yè)結(jié)構(gòu)
  • 實(shí)現(xiàn)步驟
    • 第一步 獲取元素
    • 第二步 注冊(cè)鼠標(biāo)進(jìn)入離開(kāi)事件
    • 第三步 注冊(cè)鼠標(biāo)移動(dòng)事件(確定遮罩層的定位)
    • 最后一步 大圖跟著鼠標(biāo)移動(dòng)
  • 整理一下全部的js代碼
  • 【放大鏡進(jìn)階】
    • 功能分析
    • 效果圖
    • 截屏插件html2canvas
      • 注意事項(xiàng)
      • 可用參數(shù)
      • demo
    • 放大鏡的html結(jié)構(gòu)
    • 使用jquery進(jìn)行代碼實(shí)現(xiàn)
      • 第一步 獲取元素
      • 第二步 注冊(cè)按鈕點(diǎn)擊事件
      • 第三步 截屏功能
      • 第四步 注冊(cè)鼠標(biāo)移動(dòng)事件(移動(dòng)大圖)
      • 第五步 給屏幕上動(dòng)態(tài)的添加元素
    • 完整代碼
    • 補(bǔ)充

放大鏡在網(wǎng)頁(yè)中運(yùn)用廣泛经瓷,在淘寶京東上面的商品圖中就用到了扶平,還有在空間上面展示圖片的地方也有用到。現(xiàn)在這種jquery的插件也有很多孕锄,但是也要明白其中原理就可以自己做各種各樣的放大鏡效果了捏题。
現(xiàn)在就來(lái)好好分析一下放大鏡的原理和實(shí)現(xiàn)的過(guò)程:

簡(jiǎn)單的實(shí)現(xiàn)

成果圖:

圖像 1.png

放大鏡的原理

使用兩個(gè)圖片,一個(gè)是小圖——全部展現(xiàn)在頁(yè)面中的,一個(gè)是大圖——局部展示放大的效果刻肄。所以由此可以看出突破點(diǎn),就是網(wǎng)頁(yè)中一共有兩張圖融欧,根據(jù)他們的移動(dòng)的距離敏弃,可以實(shí)現(xiàn)放大鏡的效果。

網(wǎng)頁(yè)結(jié)構(gòu)

下面就來(lái)寫(xiě)以下網(wǎng)頁(yè)的結(jié)構(gòu)

<!--css樣式-->
  <style>
       * {
           margin: 0;
           padding: 0;
       }
       /*放大鏡的大盒子*/
       .box {
           width: 350px;
           height: 350px;
           margin: 100px;
           border: 1px solid #ccc;
           position: relative;
       }
       /*大圖片外面的盒子*/
       .big {
           width: 400px;
           height: 400px;
           position: absolute;
           top: 0;
           left: 360px;
           border: 1px solid #ccc;
           overflow: hidden;
           display: none;
       }
       /*遮擋層*/
       .mask {
           width: 175px;
           height: 175px;
           background: rgba(255, 255, 0, 0.4);
           position: absolute;
           top: 0px;
           left: 0px;
           cursor: move;
           display: none;
       }
       /*小圖片外面的大盒子*/
       .small {
           position: relative;
       }
   </style>



<!--html結(jié)構(gòu)-->
<body>

 <!--放大鏡的整體-->
 <div class="box" id="box">
     <!--小圖的模塊-->
     <div class="small">
         <!--小圖-->
         ![](images/small.png)
         <!--遮擋層-->
         <div class="mask"></div>
     </div>

     <!--大圖的模塊-->
     <div class="big">
          <!--大圖-->
         ![](images/big.jpg)
     </div>
 </div>
</body>

如果上面的骨架搭好了噪馏,下面就來(lái)分析以下放大鏡的功能步驟:
1.鼠標(biāo)移動(dòng)的時(shí)候遮罩層中的框也跟著一起移動(dòng)
2.在遮罩層移動(dòng)的時(shí)候右邊的大圖也一起移動(dòng)
3.遮罩層的移動(dòng)和大圖的移動(dòng)是相反的麦到,也是按照一定比例進(jìn)行移動(dòng)的
4.遮罩層是不能離開(kāi)小圖的框的

實(shí)現(xiàn)步驟

下面上步驟:

第一步 獲取元素

因?yàn)檫@里面的元素都有可能用到

     //獲取最外面的div
    var box = document.getElementById("box");
    //獲取顯示小圖的div
    var small = box.children[0];
    //獲取小圖中的遮擋的div
    var mask = small.children[1];
    //獲取顯示大圖的div
    var big = box.children[1];
    //獲取大div中的大圖
    var imgObj = big.children[0];

第二步 注冊(cè)鼠標(biāo)進(jìn)入離開(kāi)事件

在鼠標(biāo)進(jìn)入的時(shí)候,顯示遮擋層和大圖的圖層
在鼠標(biāo)離開(kāi)的時(shí)候欠肾,隱藏遮擋層和大圖的圖層

      //鼠標(biāo)進(jìn)入事件
      box.onmouseover = function(){
               mask.style.display = "block";
               big.style.display = "block";
      }
      //鼠標(biāo)離開(kāi)事件
      box.onmouseout = function(){
               mask.style.display = "none";
               big.style.display = "none";
      }

第三步 注冊(cè)鼠標(biāo)移動(dòng)事件(確定遮罩層的定位)

給鼠標(biāo)注冊(cè)移動(dòng)事件瓶颠,在小圖上移動(dòng)的時(shí)候,遮罩層也跟著移動(dòng)

  • 要拿到可視區(qū)域的橫縱坐標(biāo)——clientX刺桃,clientY(不考慮兼容性)
  • 設(shè)置遮罩層的left和top值
    那么怎么通過(guò)鼠標(biāo)的橫縱坐標(biāo)來(lái)設(shè)置遮罩層的left和top的值呢粹淋?
    一張圖來(lái)說(shuō)明白:
mask.png

上圖中的第三步,分析為什么會(huì)出現(xiàn)這樣的問(wèn)題
因?yàn)樵谑髽?biāo)進(jìn)入的時(shí)候瑟慈,在鼠標(biāo)和小圖的框中加了一個(gè)遮罩層桃移,這個(gè)遮罩層讓鼠標(biāo)和小圖的框進(jìn)行了分離。所以當(dāng)鼠標(biāo)進(jìn)行移動(dòng)的時(shí)候葛碧,移動(dòng)到了小圖的框的外面借杰,但是檢測(cè)不到鼠標(biāo)到底有沒(méi)有離開(kāi)小圖的范圍,所以遮罩層就跟著鼠標(biāo)一起可以在可視區(qū)域中進(jìn)行移動(dòng)吹埠。
要想要進(jìn)行范圍的限定第步,就類(lèi)似于一輛車(chē)在兩堵墻之間的移動(dòng)的最大距離一樣疮装。最大的移動(dòng)距離無(wú)非就是小圖框本身的寬度 - 遮罩層本身的寬度

下面上代碼:

small.onmousemove = function (e) {
        var left = e.clientX - mask.offsetWidth / 2;//橫坐標(biāo)
        var top = e.clientY - mask.offsetHeight / 2;//縱坐標(biāo)
        //設(shè)置遮擋層的left和top
        var x = left - 100;//margin
        var y = top - 100;//margin

        //為遮擋層設(shè)置范圍
        x=x<0?0:x;//如果橫坐標(biāo)小于0就設(shè)置為0
        y=y<0?0:y;//如果縱坐標(biāo)小于0就設(shè)置為0

        //如果橫坐標(biāo)大于橫向最大移動(dòng)距離就設(shè)置為橫向最大移動(dòng)距離
        x=x>small.offsetWidth-mask.offsetWidth?small.offsetWidth-mask.offsetWidth:x;
        //如果縱坐標(biāo)大于縱向最大移動(dòng)距離就設(shè)置為縱向最大移動(dòng)距離
        y=y>small.offsetHeight-mask.offsetHeight?small.offsetHeight-mask.offsetHeight:y;
        
        //設(shè)置mask的定位
        mask.style.left = x + "px";
        mask.style.top = y + "px";
    };

最后一步 大圖跟著鼠標(biāo)移動(dòng)

  • 如果圖片是有比例的,那么移動(dòng)的時(shí)候也成比例就可以
  • 如果圖片是不成比例的粘都,那么就要有一個(gè)普遍的算法
    先來(lái)個(gè)原理圖:
max.png

上圖說(shuō)的是寬度廓推,其實(shí)高度可以以此類(lèi)推。
由此可以得出:
**大圖的移動(dòng)距離 = 遮擋層的移動(dòng)距離 * 大圖的最大移動(dòng)距離 / 遮擋層的最大移動(dòng)距離 **

        //大圖的最大的移動(dòng)距離
        var imgMaxMove=imgObj.offsetWidth-big.offsetWidth;
        //遮擋層的最大的移動(dòng)距離
        var maskMaxMove=small.offsetWidth-mask.offsetWidth;
        //大圖的橫向移動(dòng)的距離
        var imgMoveLeft=x*imgMaxMove/maskMaxMove;
        //大圖的縱向移動(dòng)的距離
        var imgMoveTop=y*imgMaxMove/maskMaxMove;

        //設(shè)置大圖的left和top---移動(dòng)的是margin-left和margin-top

        imgObj.style.marginLeft=-imgMoveLeft+"px";
        imgObj.style.marginTop=-imgMoveTop+"px";

整理一下全部的js代碼

<script>
    //獲取元素
        var box = document.getElementById("box");
        //獲取顯示小圖的div
        var small = box.children[0];
        //獲取小圖中的遮擋的div
        var mask = small.children[1];
        //獲取顯示大圖的div
        var big = box.children[1];
        //獲取大div中的大圖
        var imgObj = big.children[0];

    //顯示遮擋層和顯示大圖的的層
    //鼠標(biāo)進(jìn)入事件
    box.onmouseover = function () {
        mask.style.display = "block";
        big.style.display = "block";
    };
    //鼠標(biāo)離開(kāi)事件
    box.onmouseout = function () {
        mask.style.display = "none";
        big.style.display = "none";
    };

    //為小層注冊(cè)鼠標(biāo)移動(dòng)的事件
    small.onmousemove = function (e) {
        var left = e.clientX - mask.offsetWidth / 2;//橫坐標(biāo)
        var top = e.clientY - mask.offsetHeight / 2;//縱坐標(biāo)
   //設(shè)置遮擋層的left和top
        var x = left - 100;//margin
        var y = top - 100;//margin

        x=x<0?0:x;//如果橫坐標(biāo)小于0就設(shè)置為0
        y=y<0?0:y;//如果縱坐標(biāo)小于0就設(shè)置為0
        x=x>small.offsetWidth-mask.offsetWidth?small.offsetWidth-mask.offsetWidth:x;
        y=y>small.offsetHeight-mask.offsetHeight?small.offsetHeight-mask.offsetHeight:y;
        
   //設(shè)置遮擋層的定位值
        mask.style.left = x + "px";
        mask.style.top = y + "px";

   //設(shè)置大圖的移動(dòng)距離
        //大圖的最大的移動(dòng)距離
        var imgMaxMove=imgObj.offsetWidth-big.offsetWidth;
        //遮擋層的最大的移動(dòng)距離
        var maskMaxMove=small.offsetWidth-mask.offsetWidth;
        //大圖的橫向移動(dòng)的距離
        var imgMoveLeft=x*imgMaxMove/maskMaxMove;
        //大圖的縱向移動(dòng)的距離
        var imgMoveTop=y*imgMaxMove/maskMaxMove;

        //設(shè)置大圖的left和top---移動(dòng)的是margin-left和margin-top

        imgObj.style.marginLeft=-imgMoveLeft+"px";
        imgObj.style.marginTop=-imgMoveTop+"px";
    };
</script>

放大鏡進(jìn)階

最近要做的這個(gè)放大鏡的功能需求是這樣的
截取屏幕可視區(qū)域的圖片然后進(jìn)行放大翩隧。
為了可以看到動(dòng)態(tài)的效果樊展,所以我在上面加了隨機(jī)的添加圖標(biāo)的功能,這樣就可以看到實(shí)時(shí)的改變堆生。

功能分析

  • 設(shè)置按鈕专缠,點(diǎn)擊按鈕的時(shí)候顯示遮擋層和大圖框
  • 設(shè)置添加圖標(biāo)按鈕,點(diǎn)擊在屏幕的隨機(jī)位置生成一個(gè)圖標(biāo)
  • 在文本框中輸入文字
  • 截取可視區(qū)域的屏幕并生成圖片
  • 將可視區(qū)域的圖片進(jìn)行放大放入到大圖框中
  • 鼠標(biāo)移動(dòng)的時(shí)候大圖框中的也同樣移動(dòng)

效果圖

tb.png

截屏插件 html2canvas

html2canvas 官網(wǎng)

這個(gè)插件是讓你整體截屏或者部分截屏的功能淑仆,截屏直接在瀏覽器上使用涝婉。這個(gè)插件是基于dom操作,但是不是百分百準(zhǔn)確的蔗怠,因?yàn)樗⒉皇巧梢粋€(gè)圖片墩弯,而是基于頁(yè)面上的信息截圖。(說(shuō)白了就是截下來(lái)一部分的信息然后直接繪制到另一個(gè)地方寞射,并不是保存成了圖片文件)

注意事項(xiàng)

這個(gè)插件有一定的限制

  • 第一個(gè)就是文檔不是很全渔工,過(guò)于簡(jiǎn)單
  • 第二個(gè)是其工作原理不是真正生成一個(gè)截圖,而是遍歷所有的dom元素構(gòu)建頁(yè)面桥温,所以很多css屬性無(wú)法使用
  • 第三個(gè)是要求圖像同源且沒(méi)有代理引矩,這個(gè)腳本不渲染flash\applet\iframe等內(nèi)容

可用參數(shù)

這些參考API和中文的簡(jiǎn)書(shū),寫(xiě)的很清楚

html2canvas中文簡(jiǎn)書(shū)

demo

  • 先引入js文件
<script type="text/javascript" src="html2canvas.js"></script>
  • 寫(xiě)html結(jié)構(gòu)
<body id="bd">
    <div id="view" style="background:url('./test.png') no-repeat;background-size: contain; width: 700px; height: 500px;">
        <input type="button" value="截圖" onclick="takeScreenshot()">
    </div>
</body>
  • 寫(xiě)js代碼
<script type="text/javascript">
    function takeScreenshot() {
        html2canvas(document.getElementById('bd'), {
            onrendered: function(canvas) {
                document.body.appendChild(canvas);
            }
        });
    }
</script>

下面還是回歸正題侵浸,開(kāi)始寫(xiě)放大鏡的結(jié)構(gòu):

放大鏡的html結(jié)構(gòu)

<style>
        *{
            margin:0;
            padding:0;
        }
        body{
            background-image: url('./hua.jpg');
            background-repeat: no-repeat;
            position: absolute;
            width: 100%;
            height: 100%;
        }
        #dv{
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0,0,0,0.5);
            display: none;
        }

        #btn{
            position:absolute;
            top: 20px;
            left: 20px;
        }
        
        #mask{
            width: 175px;
            height:175px;
            position: absolute;
            top: 0;
            left: 0;
            background-color: rgba(255,150,0,.5);
            cursor: move;
        }

        #look{
            width: 200px;
            height:200px;
            position: absolute;
            top: 30px;
            right: 30px;
            border: 1px solid #f40;
            cursor: move;
            overflow: hidden;
        }
        #box{
            width: 100%;
            height:100%;
        }
</style>

<body id="bd">
    hello world!!
    <input type="button" value="放大鏡" id="btn"/>
    <div id="dv"><!--遮罩層-->
        <div id='box'></div><!--相當(dāng)于小圖-->
        <div id="mask"></div><!--跟著鼠標(biāo)的層-->
        <div id="look"><!--顯示的區(qū)域-->
            <div id="move"></div><!--移動(dòng)的地方-->
        </div>
    </div>
</body>

使用jquery進(jìn)行代碼實(shí)現(xiàn)

第一步 獲取元素

      //獲取id
      var btn = $('#btn');
      var dv = $('#dv');
      var box = $('#box');
      var mask = $('#mask');
      var look = $('#look');
      var move = $('#move');
      //定義圖片的最大移動(dòng)距離和跟著鼠標(biāo)層的最大移動(dòng)距離的變量
      var imgMaxMove;
      var maskMaxMove;

第二步 注冊(cè)按鈕點(diǎn)擊事件

  • 點(diǎn)擊按鈕的時(shí)候顯示遮罩層旺韭,同時(shí)也顯示出來(lái)隨著鼠標(biāo)移動(dòng)的框框,顯示出來(lái)圖片顯示的位置通惫。
  • 顯示遮罩層的時(shí)候截圖
  • 點(diǎn)擊遮罩層的時(shí)候遮罩層消失
        //給按鈕注冊(cè)點(diǎn)擊事件
        btn.on('click',function(){
            //截屏功能
            takeScreenshot();
            //遮罩層顯示
            dv.css('display','block');
        });

        //點(diǎn)擊屏幕的時(shí)候就消除
        dv.on('click',function(){
            $(this).css('display','none');
        })

第三步 截屏功能

function takeScreenshot() {
     //根據(jù)body進(jìn)行截屏
     html2canvas(bd, {
          allowTaint: true, //允許跨域
          taintTest: false,  //渲染圖片不用測(cè)試圖片
          //渲染圖片
          onrendered: function(canvas) {
               //將canvas標(biāo)簽轉(zhuǎn)化為img標(biāo)簽
               canvas.id = 'cv';
               var dataUrl = canvas.toDataURL();
               var newImg = document.createElement("img");
               newImg.src = dataUrl;
               //設(shè)置圖片的長(zhǎng)和寬
               newImg.width = 4 * bd.width();
               newImg.height = 4* bd.height();
               //把圖片的長(zhǎng)寬賦值給外面的盒子
               move.width(newImg.width);
               move.height(newImg.height);
               //把圖片加到盒子上
               move.append(newImg);
            },
        });
      }

第四步 注冊(cè)鼠標(biāo)移動(dòng)事件

  • 不考慮兼容的問(wèn)題茂翔,使用clientX
  • 確定不要讓跟著鼠標(biāo)的小塊出了屏幕混蔼,給它設(shè)定范圍
  • 比例這個(gè)東西啊履腋,因?yàn)橹敖仄恋臅r(shí)候,長(zhǎng)度就進(jìn)行了擴(kuò)大惭嚣,所以比例也不好掌握遵湖,后面自己慢慢的調(diào)。晚吞。延旧。總會(huì)差不多的槽地。(給自己留的bug)
//給鼠標(biāo)注冊(cè)移動(dòng)事件
dv.on('mousemove',function(e){
           var left = e.clientX - mask.width() / 2;//橫坐標(biāo)
            var top = e.clientY - mask.height() / 2;//縱坐標(biāo)
            //設(shè)置遮擋層的left和top
            var x = left;
            var y = top;

            x=x<0?0:x;//如果橫坐標(biāo)小于0就設(shè)置為0
            y=y<0?0:y;//如果縱坐標(biāo)小于0就設(shè)置為0
            x=x>box.width()-mask.width()?box.width()-mask.width():x;
            y=y>box.height()-mask.height()?box.height()-mask.height():y;

            //確定跟著鼠標(biāo)動(dòng)的小塊的定位值
            mask.offset({"left":x,"top":y});

            //大圖的最大的移動(dòng)距離
            imgMaxMove=newImg.width-look.width();
            //遮擋層的最大的移動(dòng)距離
            maskMaxMove=box.width()-mask.width();
              
            //大圖的橫向移動(dòng)的距離
            var imgMoveLeft=x*maskMaxMove/imgMaxMove*9;
            //大圖的縱向移動(dòng)的距離
            var imgMoveTop=y*maskMaxMove/imgMaxMove*9;
            // 給大圖設(shè)定移動(dòng)位置
            move.css("marginLeft",-imgMoveLeft);
            move.css("marginTop",-imgMoveTop);
  })

第五步 給屏幕上動(dòng)態(tài)的添加元素

  • 點(diǎn)擊添加圖標(biāo)的時(shí)候迁沫,在屏幕上隨機(jī)的添加一個(gè)圖標(biāo)
  • 可以在文本框中輸入文字信息
 $('#jb').on('click',function(){
            var img = document.createElement('img');
            img.src = 'images/jb.jpg';
            img.width = 100;
            img.height = 100;
            var leftRandom = Math.random()*1366; //隨機(jī)生成橫坐標(biāo)
            var topRandom = Math.random()*768; //隨機(jī)生成縱坐標(biāo)
            img.style.position = 'absolute';
            img.style.left = leftRandom + 'px';
            img.style.top = topRandom + 'px';
            $('#show').append(img);
        })

完整代碼

css文件glass.css

*{
    margin:0;
    padding:0;
}
body{
    background-image: url('../images/hua.jpg');
    background-repeat: no-repeat;
    position: absolute;
    width: 100%;
    height: 100%;
}
#dv{
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,0.5);
    display: none;
}

#btn{
    position:absolute;
    top: 100px;
    left: 100px;
    width: 100px;
    height:50px;
    background-color:rgba(0,0,0,.9);
    border-radius: 8px;
    line-height: 50px;
    text-align: center;
    color: #fff;
    cursor: pointer;
    font-size: 16px;
}

#mask{
    width: 200px;
    height:200px;
    position: absolute;
    top: 0;
    left: 0;
    background-color: rgba(255,150,0,.5);
    cursor: move;
}

#look{
    width: 300px;
    height:300px;
    position: absolute;
    bottom: 30px;
    right: 30px;
    border: 1px solid #f40;
    cursor: move;
    overflow: hidden;
}
#box{
    width: 100%;
    height:100%;
}

#jb{
    position:absolute;
    left: 100px;
    top:200px;
    width: 100px;
    height: 50px;
    background-color: rgba(0,0,0,.9);
    border-radius: 8px;
    line-height: 50px;
    text-align: center;
    color: #fff;
    cursor: pointer;
    font-size: 16px;
}

#txt{
    position: absolute;
    left: 100px;
    top: 300px;
    width: 100px;
    height: 50px;
}

index.html

<link rel="stylesheet" href="css/glass.css"/>
<script type="text/javascript" src="libs/jquery.min.js"></script>
<script type="text/javascript" src="libs/html2canvas.js"></script>
<script type="text/javascript" src="js/glass.js"></script>

<body id="bd">
hello world!!
<div id="jb">顯示圖標(biāo)</div>
<input type="text" id="txt"/>
<div id="show"></div>
<div id='btn'>放大鏡</div>
<div id="dv"><!--遮罩層-->
    <div id='box'></div><!--相當(dāng)于小圖-->
    <div id="mask"></div><!--跟著鼠標(biāo)的區(qū)域-->
    <div id="look">
        <div id="move"></div><!--移動(dòng)的地方-->
    </div><!--顯示的區(qū)域-->
</div>

<script>
    $(function(){
        $('#dv').glass();

        $('#jb').on('click',function(){
            var img = document.createElement('img');
            img.src = 'images/jb.jpg';
            img.width = 100;
            img.height = 100;
            var leftRandom = Math.random()*1366;
            var topRandom = Math.random()*768;
            img.style.position = 'absolute';
            img.style.left = leftRandom + 'px';
            img.style.top = topRandom + 'px';
            $('#show').append(img);

        })
    });
</script>
</body>

js文件 glass.js


(function($){
    $.fn.glass = function(){
        var mask = $('#mask');
        var box = $('#box');
        var look = $('#look');
        var move = $('#move');
        var btn = $('#btn');
        var imgMaxMove;
        var maskMaxMove;
        var _this = $(this);

        //點(diǎn)擊按鈕
        btn.on('click',function(){
            move.html('');
            takeScreenshot();
            _this.css('display','block');
        });

        //點(diǎn)擊屏幕的時(shí)候就消除
        _this.on('click',function(){
            _this.css('display','none');
        })


        //獲取屏幕截圖
        function takeScreenshot() {
            alert('1');
            html2canvas($('#bd'), {
                allowTaint: true,
                taintTest: false,
                onrendered: function(canvas) {
                    canvas.id = 'cv';
                    var dataUrl = canvas.toDataURL();
                    var newImg = document.createElement("img");
                    newImg.src = dataUrl;
                    newImg.width = 4 * $('#bd').width();
                    newImg.height = 4* $('#bd').height();
                    move.width(newImg.width);
                    move.height(newImg.height);
                    move.append(newImg);


                    _this.on('mousemove',function(e){
                        var left = e.clientX - mask.width() / 2;//橫坐標(biāo)
                        var top = e.clientY - mask.height() / 2;//縱坐標(biāo)
                        //console.log(mask.width());
                        //設(shè)置遮擋層的left和top
                        var x = left;//margin
                        var y = top;//margin
                        x=x<0?0:x;//如果橫坐標(biāo)小于0就設(shè)置為0
                        y=y<0?0:y;//如果縱坐標(biāo)小于0就設(shè)置為0
                        x=x>box.width()-mask.width()?box.width()-mask.width():x;
                        y=y>box.height()-mask.height()?box.height()-mask.height():y;
                        mask.offset({"left":x,"top":y});


                        //大圖的最大的移動(dòng)距離
                        imgMaxMove=newImg.width-look.width();
                        console.log(imgMaxMove);
                        //遮擋層的最大的移動(dòng)距離
                        maskMaxMove=box.width()-mask.width();
                        console.log(maskMaxMove);

                        //大圖的橫向移動(dòng)的距離
                        var imgMoveLeft=x*maskMaxMove/imgMaxMove*9;
                        //大圖的縱向移動(dòng)的距離
                        var imgMoveTop=y*maskMaxMove/imgMaxMove*9;
                        move.css("marginLeft",-imgMoveLeft);
                        move.css("marginTop",-imgMoveTop);
                    })
                },
            });
        }
    }
})(jQuery);

補(bǔ)充

關(guān)于圖片的比例問(wèn)題
也可以這樣做:
大圖的寬 / 小圖的寬 = 大圖的移動(dòng)距離 / 小圖的移動(dòng)距離
這樣就將id = move的標(biāo)簽進(jìn)行設(shè)置

css:
#move{ position:absolute; top:0; left: 0; }

js:
x = newImg.width / $('#bd').width() * x / 2; y = newImg.width / $('#bd').width() * y / 2; $('#move').css('left',-x); $('#move').css('top',-y);

還是那句話芦瘾,比例自己調(diào)正。集畅。近弟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挺智,隨后出現(xiàn)的幾起案子祷愉,更是在濱河造成了極大的恐慌,老刑警劉巖赦颇,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二鳄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡媒怯,警方通過(guò)查閱死者的電腦和手機(jī)订讼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扇苞,“玉大人躯嫉,你說(shuō)我怎么就攤上這事⊙罟眨” “怎么了祈餐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哄陶。 經(jīng)常有香客問(wèn)我帆阳,道長(zhǎng),這世上最難降的妖魔是什么屋吨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任蜒谤,我火速辦了婚禮,結(jié)果婚禮上至扰,老公的妹妹穿的比我還像新娘鳍徽。我一直安慰自己,他們只是感情好敢课,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布阶祭。 她就那樣靜靜地躺著,像睡著了一般直秆。 火紅的嫁衣襯著肌膚如雪濒募。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天圾结,我揣著相機(jī)與錄音瑰剃,去河邊找鬼。 笑死筝野,一個(gè)胖子當(dāng)著我的面吹牛晌姚,可吹牛的內(nèi)容都是我干的粤剧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挥唠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俊扳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猛遍,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馋记,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后懊烤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梯醒,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年腌紧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茸习。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壁肋,死狀恐怖号胚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浸遗,我是刑警寧澤猫胁,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站跛锌,受9級(jí)特大地震影響弃秆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓帽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一菠赚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郑藏,春花似錦衡查、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筑悴,卻和暖如春们拙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阁吝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械拍,地道東北人突勇。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓装盯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甲馋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埂奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 隨手打開(kāi)一個(gè)電商網(wǎng)站(如淘寶),查看商品的時(shí)候定躏, 把鼠標(biāo)放到圖片上都可以看到圖片的更多細(xì)節(jié)账磺,像把圖片局部放大...
    jazenye閱讀 1,392評(píng)論 0 10
  • 今天想要給大家分享JavaScript當(dāng)中的放大鏡實(shí)現(xiàn)的一些個(gè)人心得。 首先我們要知道在進(jìn)行JS特效制作之前痊远,我們...
    一念成mo閱讀 1,075評(píng)論 0 7
  • 經(jīng)常逛某寶可以發(fā)現(xiàn)垮抗,查看商品時(shí)都有如下的放大功能,鼠標(biāo)放到圖片上可以看到圖片的細(xì)節(jié)碧聪,那么它是如何實(shí)現(xiàn)的呢冒版?是真的將...
    丶chlorine閱讀 872評(píng)論 1 3
  • 今天我的標(biāo)題就是我們每天上班要喊的口號(hào)猎贴,這個(gè)口號(hào)第一是為了增強(qiáng)品牌在我們心中的自豪感,第二是做為一天上班開(kāi)始的...
    艾陽(yáng)陽(yáng)閱讀 479評(píng)論 2 3
  • 貼身提醒真的是一個(gè)非常不人性化的東西——現(xiàn)在科技設(shè)備纏身蝴光,我們本身就已經(jīng) over informed 了她渴,真的需要...
    五八閱讀 458評(píng)論 0 5