js實現購物網站放大鏡效果

在一些主流的購物網站上,我們經常能看到一些帶有放大鏡效果的圖片框,看似神奇,指哪哪大,其實實現的原理很簡單

主要原理:實現放大鏡的核心是需要有三套大小不同,形狀相同的圖片,通過座標的改變來實現圖片的區域切換;

 

代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>放大鏡</title>
    <link rel="stylesheet" href="./css/index.css">
    <!-- 引入css樣式 -->
</head>

<body>
    <!-- 整個案例 -->
    <div class="box">
        <!-- 大圖 -->
        <div class="big_box_img"></div>
        <!-- 中圖 -->
        <div class="banner" data-src="img/_800x1026.jpg">
            <img class="middleImage" src="./img/cc_350x449.jpg" alt="">
            <div class="ceng"></div>
        </div>
        <!-- 小圖 -->
        <div class="small_box">
            <div class="small_box_img" data-big="img/cc_800x1026.jpg" data-src="./img/cc_350x449.jpg">
                <img src="./img/cc_50x64.jpg" alt="">
            </div>
            <div class="small_box_img" data-big="img/c_800x1026.jpg" data-src="./img/.jpg">
                <img src="./img/_50x64.jpg" alt="">
            </div>
            <div class="small_box_img" data-big="img/800x1026.jpg" data-src="./img/cc_350x449.jpg">
                <img src="./img/cc_50x64.jpg" alt="">
            </div>
            <div class="small_box_img" data-big="img/cc_800x1026.jpg" data-src="./img/cc_350x449.jpg">
                <img src="./img/!cc_50x64.jpg" alt="">
            </div>
            <div class="small_box_img" data-big="img/cc_800x1026.jpg" data-big="" data-src="./img/cc_350x449.jpg">
                <img src="./img/cc_50x64.jpg" alt="">
            </div>
        </div>
    </div>
    <script>
        //放大鏡共由三套圖組成,大中小圖,基本方式是在小圖上綁定中圖和大圖的事件,當觸發小圖的事件時將
        //中圖的路徑傳給中圖img 將大圖的路徑傳給中圖的div 觸發中圖的事件時將中圖div的路徑傳給大圖並使
        //隱藏的大圖顯示出來,利用座標計算出 ceng 和鼠標相應的位置。
        big_box_img = document.getElementsByClassName('big_box_img')[0];//找到了大圖的img
        var box = document.getElementsByClassName('box')[0];//找到了整個大的box
        var mousein_img = document.getElementsByClassName('small_box_img');//找到了小圖的img
        var oldboder_object = mousein_img[0];//定義了上次執行初值小圖的變量 
        //相當於使它表示當前變紅的小圖的邊框,在執行新的操作時,它就成爲了上一次的執行對象,方便操作
        var move_img = document.getElementsByClassName('middleImage')[0];//找到了中圖的img
        var banner = document.getElementsByClassName('banner')[0];//找到中圖的div
        var ceng1 = document.getElementsByClassName('ceng')[0];//找到放大鏡鼠標塊的div
        mousein_img[0].style.borderColor = '#e60000';//讓小圖的左邊第一個邊框默認變紅
        // console.log(banner);之前用於測試

        //實現小圖的懸停使得對應的邊框變色且之前的邊框變爲透明色(也就是沒有顏色)
        //大致思想:通過for循環,使每個小圖的img都綁定上鼠標進入到小圖事件(onmouseseenter)
        //用oldboder_object記錄當前事件,在執行下一事件時,它就變爲了之前的事件!!!!!!
        //將當前的邊框變爲了紅色,然後將之前的(oldboder_object)變爲透明
        for (var i = 0; i < mousein_img.length; i++) {//將所有的小圖綁定事件
            mousein_img[i].onmouseenter = function () {
                oldboder_object.style.borderColor = 'transparent';
                this.style.borderColor = '#e60000';
                oldboder_object = this;//this 表示當前執行
                move_img.src = this.getAttribute("data-src");//data-src表示中圖的src(自定義)
                banner.setAttribute('data-src', this.getAttribute('data-big'));//data-big表示大圖的src(自定義)
            }

        }
        //實現中圖鼠標進入時候的事件綁定
        //

        banner.onmouseenter = function () {
            console.log('sada');//用於測試是否找到元素
            big_box_img.style.display = "block";//將隱藏的大圖的div顯示出來
            ceng1.style.display = 'block';//將隱藏的 ceng 的div顯示出來
            var big_img_src = banner.getAttribute('data-src');//定義一個變量將中圖div中的src傳入
            big_box_img.style.backgroundImage = 'url(' + big_img_src + ')';//利用字符串拼接將big_img_src
            //中的src 傳入big_box_img的背景圖片中
        }
        banner.onmousemove = function (e) {
            this.style.cursor = 'move';//改變鼠標在中圖中的默認形狀
            var x = e.pageX || e.clientX;//定義鼠標在中圖中的X座標
            var y = e.pageY || e.clientY;//定義鼠標在中圖中的Y座標
            var left = (x - box.offsetLeft - 118.125) <= 0 ? 0 : (x - box.offsetLeft - 118.125) >= 113.75 ? 113.75 : (x - this.offsetLeft - 118.125);//offsetLeft左邊界偏移的像素值(鎖定ceng的位置,當鼠標位置大於限定的距離時,位置保持不變)
            var top = ((y - box.offsetTop - 118.115)) <= 0 ? 0 : (y - box.offsetTop - 118.115) >= 212.69 ? 212.69 : (y - this.offsetTop - 118.115);//offsetTop上邊界偏移的像素值
            ceng1.style.left = left + 'px';
            ceng1.style.top = top + 'px';//配合將鼠標的座標放在ceng的中間且限定ceng的位置
            big_box_img.style.backgroundPosition=-left * 2.28+"px "+-(top * 2.28)+"px";//限制了大圖比例
        }
        banner.onmouseleave = function () {
            ceng1.style.display = 'none';
            big_box_img.style.display = 'none';//當鼠標離開中圖時,將大圖中的所有none掉
        }
    </script>
</body>

</html>

這個案例是一個月前寫的,現在翻出來,我的天吶~~~

我覺得已經寫得有點詳細了,真沒想到我之前那麼努力那麼認真(容許我自戀一秒,哈哈啊哈~^_^~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章