js、jquery實現放大鏡效果

在一些電商網站的商品詳情頁面,都會有放大鏡效果,實現起來並非很困難,今天用了兩個小時,寫了一個放大鏡效果的實例,來分享給你們!javascript

實現的效果大概是這個樣子的css

預覽

先來看一下效果吧,點擊下面的連接預覽動態的效果!html

http://sandbox.runjs.cn/show/vbu6ebq2java

 

代碼實現過程:

1. html部分

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>商品詳情放大鏡效果</title>
    <script type="text/javascript" src="js/jquery/jquery-3.2.1.js"></script>
</head>
<body>
<div class="container">
    <h2>商品詳情放大鏡效果</h2>
    <div class="magnifierContainer">
        <div class="imgLeft">
            <!-- 中號圖片 -->
            <div class="imgMedium" id="imgMedium">
                <!-- 放大鏡 -->
                <div class="magnifier" id="magnifier">
                    <img src="http://product.dangdang.com/images/zoom_pup.png">
                </div>
                <!-- 圖片 -->
                <div class="mediumContainer" id="mediumContainer">
                    <img src="http://img3m3.ddimg.cn/2/21/22628333-1_w_2.jpg">
                </div>    
                <div id="zhezhao"></div>            
            </div>
            
            <!-- 縮略圖 -->
            <ul class="img_x" id="img_x">
                <li><img src="http://img3m3.ddimg.cn/2/21/22628333-1_x_2.jpg"></li>
                <li><img src="http://img3m3.ddimg.cn/2/21/22628333-2_x_2.jpg"></li>
                <li><img src="http://img3m3.ddimg.cn/2/21/22628333-3_x_2.jpg"></li>
                <li><img src="http://img3m3.ddimg.cn/2/21/22628333-4_x_2.jpg"></li>
                <li><img src="http://img3m3.ddimg.cn/2/21/22628333-5_x_2.jpg"></li>
            </ul>
        </div>
        <div class="imgRight">
            <!-- 大圖 -->
            <div class="img_u" id="img_u">
                <img src="http://img3m3.ddimg.cn/2/21/22628333-1_u_2.jpg">
            </div>
        </div>        
    </div>
</div>
</body>
</html>

 

2. css部分

 

<style type="text/css">
    * {
        margin: 0;
        padding: 0;
    }
    ul {
        list-style: none;
    }
    .container {
        width: 850px;
        margin: 50px auto;
        text-align: center;
    }
    .magnifierContainer {
        display: flex;
        margin-top: 30px;
    }
    .imgMedium {
        position: relative;
    }
    .imgLeft .magnifier {
        position: absolute;
        display: none;
        width: 200px;
        height: 200px;
    }
    .mediumContainer {
        width: 350px;
        height: 350px;
        border: 1px solid #eee;
        overflow: hidden;
    }
    #zhezhao {
        width: 350px;
        height: 350px;
        background: transparent;
        position: absolute;
        top: 0;
        border: 1px solid transparent;
    }
    #zhezhao:hover {
        cursor: move;
    }
    .img_x {
        width: 350px;
        height: 77px;
        border: 1px solid #eee;
        margin-top: 20px;
        display: flex;
    }
    .img_x li{
        width: 54px;
        height: 54px;
        border: 2px solid transparent;
        margin: 8px 4px;
        padding: 2px;
    }
    .img_u {
        width: 500px;
        height: 450px;
        border: 1px solid #eee;
        float: left;
        margin-left: 15px;
        overflow: hidden;
        display: none;
    }
</style>

 

3. js部分

<script type="text/javascript">
    $('#img_x li').eq(0).css('border', '2px solid coral');
    $('#zhezhao').mousemove(function(e){
        $('#img_u').show();
        $('#magnifier').show();
        var left = e.offsetX - parseInt($('#magnifier').width()) / 2;
        var top = e.offsetY - parseInt($('#magnifier').height()) / 2;
        left = left < 0 ? 0 : left;
        left = left > (parseInt($('#zhezhao').outerWidth()) - parseInt($('#magnifier').outerWidth())) ? (parseInt($('#zhezhao').outerWidth()) - parseInt($('#magnifier').outerWidth())) : left;
        top = top < 0 ? 0 : top;
        top = top > (parseInt($('#zhezhao').outerHeight()) - parseInt($('#magnifier').outerHeight())) ? (parseInt($('#zhezhao').outerHeight()) - parseInt($('#magnifier').outerHeight())) : top;

        $('#magnifier').css('left', left + 'px');
        $('#magnifier').css('top', top + 'px');

        var leftRate = left / parseInt($('#zhezhao').outerWidth());
        var bigLeft = leftRate * parseInt($('#img_u img').outerWidth());
        $('#img_u img').css('margin-left', -bigLeft + 'px');

        var topRate = top / parseInt($('#zhezhao').outerHeight());
        var bigTop =  topRate * parseInt($('#img_u img').outerHeight());
        $('#img_u img').css('margin-top', -bigTop + 'px');
    })
    $('#zhezhao').mouseleave(function(){
        $('#img_u').hide();
        $('#magnifier').hide();
    })

    $('#img_x li').mouseover(function(){
        $(this).css('border', '2px solid coral').siblings().css('border', '2px solid transparent');
        $('#mediumContainer img').eq(0).attr('src', 'http://img3m3.ddimg.cn/2/21/22628333-' + ($(this).index()+1) + '_w_2.jpg');
        $('#img_u img').eq(0).attr('src', 'http://img3m3.ddimg.cn/2/21/22628333-' + ($(this).index()+1) + '_u_2.jpg');
    })
</script>

 

實現過程當中須要注意的地方:

在實現放大鏡在圖片上移動時,我給商品圖片綁定了mousemove鼠標移動事件,當鼠標移動的同時,也移動放大鏡,可是效果卻不是想象的樣子,會有一些卡頓、閃爍的現象jquery

當鼠標在商品圖片上移動時,放大鏡也隨之移動,當鼠標在放大鏡圖片上時,則不會移動,這是由於綁定mousemove事件的是商品圖片,而不是放大鏡圖片,而放大鏡圖片所在的圖層在商品圖片之上,因此當鼠標移動到放大鏡圖片上時,就不會觸發mousemove事件,從而就出現了卡頓的現象。ide

那麼,怎樣解決呢?flex

我又加了一個div,這個div的大小和商品圖片的div的大小同樣,背景色爲透明色,圖層在最上面,而後給這個透明的div綁定mousemove事件,放大鏡圖片就會流暢的移動了。網站

  

在線調試

如需在線調試請點擊下面的連接!ui

http://runjs.cn/code/vbu6ebq2this

  

若是對您有幫助,記得點贊哦!須要您的支持與鼓勵,同時也歡迎您留下寶貴意見!

相關文章
相關標籤/搜索