1. 程式人生 > >電商網站常用放大鏡特效

電商網站常用放大鏡特效

mar nbsp 設置 之前 事件 圖片 range div absolute

預覽效果:

類似於之前做過的裁剪預覽效果

技術分享圖片

HTML、CSS代碼

<!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>Document</
title> <script src="demo.js"></script> <style> #demo{ display: block; width: 330px; height: 220px; margin: 50px; position: relative; border: 1px solid darkorange; } img
{ width: 330px; height: 220px; } #small-box{ /* width: 330px; */ position: relative; z-index: 1; } #float-box{ display: none; position: absolute; background-color: #ffffcc
; width: 200px; height: 125px; opacity: 0.5; cursor: move; border: 1px solid #ccc; } #big-box{ display: none; position: absolute; top: 0; left: 400px;; width: 400px; height: 300px; overflow: hidden; border: 1px solid #ccc; z-index: 1; } #big-box img{ width: 600px; height: 400px; position: absolute; z-index: 5; } #mark{ position: absolute; display: block; width: 330px; height: 220px; background-color: #fff; opacity: 0; z-index: 10; } </style> </head> <body> <div id="demo"> <div id="small-box"> <div id="mark"></div> <div id="float-box"></div> <img src="img1.jpg" alt="小圖"> </div> <div id="big-box"> <img src="img1.jpg" alt="大圖"> </div> </div> </body> </html>

JS代碼:

window.onload = function(){
    var demo = document.getElementById("demo");
    var small_box = document.getElementById("small-box");
    var big_box = document.getElementById("big-box");
    var mark = document.getElementById("mark");
    var float_box = document.getElementById("float-box");
    var bigImg = big_box.getElementsByTagName("img")[0];
    console.log(bigImg);
    small_box.onmouseover = function(){
        big_box.style.display = "block";
        float_box.style.display = "block";
    }
    
    small_box.onmouseleave = function(){
        big_box.style.display = "none";
        float_box.style.display = "none";
    }

    small_box.onmousemove = function(ev){
        var _event  = ev || window.event;//兼容不同瀏覽器獲取事件對象的方式
        var left = _event.clientX - demo.offsetLeft - small_box.offsetLeft - (float_box.offsetWidth)/2;
        console.log(left);
        var top = _event.clientY - demo.offsetTop - small_box.offsetTop - (float_box.offsetTop)/2;
        if(left < 0){
            left = 0;
        }else if(left > (mark.offsetWidth - float_box.offsetWidth)){
            left = (mark.offsetWidth - float_box.offsetWidth);
            console.log("max");
        };
        if(top < 0){
            top = 0;
        }else if(top > (mark.offsetHeight - float_box.offsetHeight)){
            top = mark.offsetHeight - float_box.offsetHeight;
            console.log("maxerr");
        };
        //開始設置float_box的位置變化
        float_box.style.left = left + "px";
        float_box.style.top = top + "px";

        var percentX = left / (mark.offsetWidth - float_box.offsetWidth);
        var percentY = top / (mark.offsetHeight - float_box.offsetHeight);
        bigImg.style.left = - percentX *(bigImg.offsetWidth - big_box.offsetWidth) + "px" ;
        bigImg.style.top = - percentY *(bigImg.offsetHeight - big_box.offsetHeight) + "px";

    }
}

註意一個要點:

浮動框的寬/小盒子的寬 = 大盒子的寬/圖片的寬

電商網站常用放大鏡特效