如何用原生javascript實現(xiàn)放大鏡效果

隨著科技的發(fā)展,網(wǎng)購已成為大家生活中必不可少的一個模式,各種電商平臺也如雨后春筍般涌現(xiàn)出來,今天我們就來用原生js來實現(xiàn)類似淘寶選購物品時的放大鏡效果.

這里要用到大小兩張圖片,我選取的是800x800和350x350大小的兩張圖片

圖片來源于網(wǎng)絡(luò)

首先寫出html和css樣式

html部分

  <body>
        <div class="min">
            <img src="img/1.jpg" />
            <div class="fd"></div>
        </div>
        <div class="max"><img src="img/2.jpg" /></div>
    </body>

原理是創(chuàng)建minmax兩個區(qū)域,將小圖img/1.jpg和創(chuàng)建的放大鏡divfd放到min中,將大圖img/2.jpg放到max

css樣式部分

        <style type="text/css">
            .min{
                width: 350px;
                height: 350px;
                border: 1px solid black;
                float: left;
                position: relative;
            }
            .max{
                width: 350px;
                height: 350px;
                border: 1px solid black;
                float: left;
                display: none;
                overflow: hidden;
                position: relative;
            }
            .max img{
                position: absolute;
                margin: 0 auto;
            }
            .fd{
                width: 153.125px;
                height: 153.125px;
                background-color: skyblue;  
                opacity: 0.3;
                position: absolute;
                top: 0;
                left: 0;
                display: none;
                }

這里需要強調(diào)的是
1.大圖相對于父級絕對定位末荐。
2.放大鏡的寬高,如果按照我選的尺寸的兩張圖寬高必須為153.125px,否則會出現(xiàn)左側(cè)所選區(qū)域和右側(cè)顯示區(qū)域不能完全吻合的情況;
3.大圖的父級max定義的框尺寸為什么比里面的圖片小?(這里的框相當(dāng)于一個窗戶,里面的圖片相當(dāng)于窗子一面的物體,無論里面的物體多大也只能顯示出窗子的尺寸)
4.當(dāng)鼠標放在小圖外區(qū)域時,大圖和放大鏡無顯示,所以開始置maxfddisplay:none;

為了顯示效果我們先把display:none注掉,此時效果如下

樣式圖

js部分

首先分析邏輯順序

1.鼠標覆蓋顯示max和fd
2.確定放大鏡的移動范圍(不能出min)
3.max的對應(yīng)顯示
然后按順序書寫代碼

定義變量
<script type="text/javascript">
        var min = document.querySelector(".min"),
        max = document.querySelector(".max"),
        img = document.querySelector(".max img"),
        fd = document.querySelector(".fd");
操作
    min.onmouseover = function(){
        //1.鼠標覆蓋顯示max和fd
        max.style.display = "block";
        fd.style.display = "block";
    }
        //離開時隱藏
        min.onmouseout= function(){
        max.style.display = "none";
        fd.style.display = "none";
        }
        //2.fd的移動范圍
        min.onmousemove = function(){
            //鼠標觸摸的點
            var x = event.clientX-min.offsetLeft-fd.offsetWidth/2;
            var y = event.clientY-min.offsetTop-fd.offsetHeight/2;
            //最大移動距離
            var maxX = min.clientWidth-fd.offsetWidth;
            var maxY = min.clientHeight-fd.offsetHeight;
            //邊界判斷
            if(x<=0){
                x=0;
            }else if(x>=maxX){
                x=maxX;
            }
            if(y<=0){
                y=0;
            }else if(y>=maxY){
                y=maxY;
            }
            //fd的位置
            fd.style.left = x+"px";
            fd.style.top = y+"px";
            //fd/min = max/img
            //移動比例
            var yidongX = x/maxX;
            var yidongY = y/maxY;
            //移動
            //3.max的對應(yīng)顯示
            // 對于大圖而言 放大鏡在小圖上移動的比例 相當(dāng)于img在可顯示區(qū)域上移動的比例  放大鏡右移等于圖片左移
            // 也就是本質(zhì)上為img - max 然而需要負值 則*-1 簡化后 為max-img
            img.style.left = yidongX * (max.clientWidth - img.offsetWidth) + "px";
            img.style.top = yidongY * (max.clientHeight - img.offsetHeight) + "px";
    }
</script>

最后根據(jù)需求完善即可
實現(xiàn)效果如下

1.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倍谜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踩衩,死亡現(xiàn)場離奇詭異责静,居然都是意外死亡,警方通過查閱死者的電腦和手機星虹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門零抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搁凸,你說我怎么就攤上這事媚值。” “怎么了护糖?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵褥芒,是天一觀的道長。 經(jīng)常有香客問我嫡良,道長锰扶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任寝受,我火速辦了婚禮坷牛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘很澄。我一直安慰自己京闰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布甩苛。 她就那樣靜靜地躺著蹂楣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讯蒲。 梳的紋絲不亂的頭發(fā)上痊土,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音墨林,去河邊找鬼赁酝。 笑死犯祠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酌呆。 我是一名探鬼主播衡载,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肪笋!你這毒婦竟也來了月劈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤藤乙,失蹤者是張志新(化名)和其女友劉穎猜揪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坛梁,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡而姐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了划咐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴念。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褐缠,靈堂內(nèi)的尸體忽然破棺而出政鼠,到底是詐尸還是另有隱情,我是刑警寧澤队魏,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布公般,位于F島的核電站,受9級特大地震影響胡桨,放射性物質(zhì)發(fā)生泄漏官帘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一昧谊、第九天 我趴在偏房一處隱蔽的房頂上張望刽虹。 院中可真熱鬧,春花似錦呢诬、人聲如沸涌哲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膛虫。三九已至,卻和暖如春钓猬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撩独。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工敞曹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留账月,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓澳迫,卻偏偏與公主長得像局齿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子橄登,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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