1. 程式人生 > >JavaScript實現的網頁放大鏡效果

JavaScript實現的網頁放大鏡效果

今天在觀看視訊學習的時候,學到了一個小技巧。就拿過來與大家進行分享一下啦。

實現的原理

  • 分析需求:需要兩張圖,一大一小。然後根據滑鼠的動作顯示出不同的區域塊的影象。
  • 核心:滑鼠事件的獲取和處理。圖片顯示的時候的放大比例的處理。

編碼實現

  • 大結構是如下:
    外邊套一個最大的區域塊,然後再裡面新增不同的顯示。
<body>
<div id="demo">
<!--小圖片顯示區域-->
    <div id="small-box">
    <!--mark表示小圖片的邊界,float-box則代表放大鏡的id-->
<div id="mark"></div> <div id="float-box"></div> <img src="img/small.jpg"/> </div> <!--大圖片顯示區域--> <div id="big-box"> <img src="img/big.jpg"/> </div> </div> </body> </html>
  • 然後是樣式表的設定。注意對放大鏡的圖層的處理。主要是和背景圖層的色差很明顯,便於觀察。
* {
            margin: 0;
            padding: 0
        }

        #demo {
            display: block;
            width: 400px;
            height: 255px;
            margin: 50px;
            position: relative;
            border: 1px solid #ccc;
        }

        #small-box {
            position
: relative
; z-index: 1; }
#float-box { display: none; width: 160px; height: 120px; position: absolute; background: #ffffcc; border: 1px solid #ccc; filter: alpha(opacity=50); opacity: 0.5; } #mark { position: absolute; display: block; width: 400px; height: 255px; background-color: #fff; filter: alpha(opacity=0); opacity: 0; z-index: 10; } #big-box { display: none; position: absolute; top: 0; left: 460px; width: 400px; height: 300px; overflow: hidden; border: 1px solid #ccc; z-index: 1;; } #big-box img { position: absolute; z-index: 5 }
  • 再就是核心的編碼了。那就是js程式碼的邏輯處理,主要是關於滑鼠的三個動作事件的捕獲和相應的處理。onmouseover,onmouseout,onmousemove三個函式。
  • `
    //注意是頁面載入完成後才會執行js程式碼
    window.onload = function () {

        var objDemo = document.getElementById("demo");
        var objSmallBox = document.getElementById("small-box");
        var objMark = document.getElementById("mark");
        var objFloatBox = document.getElementById("float-box");
        var objBigBox = document.getElementById("big-box");
        var objBigBoxImage = objBigBox.getElementsByTagName("img")[0];
    
        /**
         * 當滑鼠放到小圖片上時,圖片和放大鏡開始進行顯示
         */
        objMark.onmouseover = function () {
            objFloatBox.style.display = "block";
            objBigBox.style.display = "block";
        };
    
        /**
         * 滑鼠移出時,就會觸發響應的事件,然後放大鏡和圖片不再顯示
         */
        objMark.onmouseout = function () {
            objFloatBox.style.display = "none";
            objBigBox.style.display = "none";
        };
    
        /**
         * 滑鼠滑過的時候,對相關的放大的倍數進行計算後對圖片進行輸出
         */
        objMark.onmousemove = function (ev) {
    
            var _event = ev || window.event;  //相容多個瀏覽器的event引數模式
    
            /**
             * 這裡的clientX是指滑鼠在瀏覽器中的絕對座標位置,也就是計算網頁中圖片的位置。然後進行絕對化的圖片顯示的過程
             */
            var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;
            var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2;
    
            /**
             * 此段程式碼是為了對放大鏡區域移出mark標記塊的時候的處理。
             * 實現的功能是:放大鏡區域只會存在與mark的標記塊內部
             */
            if (left < 0) {
                left = 0;
            } else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
                left = objMark.offsetWidth - objFloatBox.offsetWidth;
            }
    
            if (top < 0) {
                top = 0;
            } else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
                top = objMark.offsetHeight - objFloatBox.offsetHeight;
    
            }
    
            /**
             * 設定放大鏡出現的位置
             */
            objFloatBox.style.left = left + "px";   //oSmall.offsetLeft的值是相對什麼而言
            objFloatBox.style.top = top + "px";
    
            var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);
            var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight);
    
            /**
             * 這裡有亮點需要進行注意:
             * 1.注意負號,因為大圖的顯示的方向與放大鏡的移動方向是相反的
             * 2.注意相乘的比例值的計算
             */
            objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
            objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
        }
    }`
    

效果展示

這裡寫圖片描述

總結

從上面的程式碼我學到了什麼:

  • 首先是分析問題,只有將問題分析的徹底了,後續的步驟才不會出現意想不到的問題。
  • 然後是實現的思路,仔細想想可以通過什麼方式來實現這些需求。
  • 耐心的編碼,對事件的處理邏輯把握到位!