最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js實現(xiàn)購物網(wǎng)站商品放大鏡效果

 更新時間:2021年10月11日 14:52:28   作者:夜深人靜_  
這篇文章主要為大家詳細介紹了js實現(xiàn)購物網(wǎng)站商品放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js實現(xiàn)購物網(wǎng)站商品放大鏡效果的具體代碼,供大家參考,具體內(nèi)容如下

首先說一下原理,以天貓某商品放大鏡效果為例:

所謂的放大鏡效果,其實也是欺騙我們眼球的一種效果,這里我們可以看到,圖片顯示去下面那一排小圖與遮蓋層的圖片和放大層的圖片其實是一樣的,只是分辨率不同,所以實現(xiàn)放大鏡效果,就需要這么幾組分辨率大小不同,但是圖片內(nèi)容相同的圖片:

顯然,小圖中放的就是我這里圖片名中帶有small的小圖了,遮蓋層就是正常大小的圖,放大層就是帶有big的放大的圖了,然后再加入適當?shù)奈灰坪惋@示效果,就達成我們見到的放大鏡效果了,下面就通過代碼來實現(xiàn)吧:

首先寫出HTML結(jié)構(gòu):

<div id="box">
    <div class="show">
        <img src="./images/1.jpg" alt="#">
        <div class="drag"></div>
    </div>
    <div class="magnify"></div>
    <ul>
        <li class="active"><img src="./images/1.small.jpg" alt="#"></li>
        <li><img src="./images/2.small.jpg" alt="#"></li>
    </ul>
</div>

<script type="text/javascript" src="./javascript/mgfyGlass.js"></script>

<script>
    const oBox = document.querySelector('#box');
    
    const imgArr = [
        {small: '1.small.jpg', normal: '1.jpg', big: '1.big.jpg'},
        {small: '2.small.jpg', normal: '2.jpg', big: '2.big.jpg'}
    ];
</script>

然后加入css樣式:

body,div,ul,li{
    margin: 0; padding: 0;
    list-style: none;
    font-size: 0;
}
img{
    display: block;
}
#box{
    width: 650px;
    position: relative;
    margin: 0 auto 0 240px;
}
#box .show{
    width: 600px;
    border: solid 2px hotpink;
    position: relative;
}
#box .show img{
    width: 100%;
}
#box .show .drag{
    position: absolute;
    width: 200px;
    height: 200px;
    background-color: #e0a8d7;
    opacity: .4;
    left: 0;
    top: 0;
    display: none;
}
#box .magnify{
    width: 800px;
    height: 800px;
    border: solid 2px #7d777b;
    position: absolute;
    left: 100%;
    top: 0;
    background: url("../images/1.big.jpg") no-repeat 0 0 / 2400px;
    display: none;
}
#box ul{
    width: 100%;
    height: 150px;
    margin-top: 20px;
}
#box ul::after{
    content: '';
    display: block;
    clear: both;
}
#box ul li{
    height: 100%;
    float: left;
    margin: 0 8px;
    border: solid 2px #fff;
}
#box ul li.active{
    border-color: hotpink;
}
#box ul li img{
    height: 100%;
}

這里設置css樣式的時候需要注意:

放大層是通過遮蓋層等比放大的,所以放大層的寬高與遮蓋層寬高的比,和,放大層背景圖大小與正常顯示圖片(也就是class=“show” 盒子中的圖片)大小的比是相同的。

這里需要用js來實現(xiàn)幾個效果:

1、鼠標移入正常圖片盒子時遮蓋層和放大層盒子顯示,鼠標移出正常圖片盒子時遮蓋層和放大層盒子隱藏
2、定位遮蓋層位置,讓它隨著鼠標在 正常圖片盒子 內(nèi)移動,同時放大層圖片對應的在放大層盒子內(nèi)移動
3、設置小圖切換效果,并在小圖切換的同時,正常圖片和放大圖切換到對應圖片

然后上代碼:

class MgnGlass {
    constructor(ele, array) {
        this.ele = ele;
        this.array = array;

        this.show = ele.querySelector('.show');
        this.showImg = this.show.querySelector('img');
        this.drag = ele.querySelector('.drag');
        this.magnify = ele.querySelector('.magnify');
        this.oUl = ele.querySelector('ul');
        this.oUlis = ele.querySelectorAll('ul li');
    }

 // 定義一個方法,來調(diào)用之后定義的所有的方法
    // 入口函數(shù)
    init() {
        this.setMouse();
        this.setPosition();
        this.setTab();
    }

    // 鼠標的移入移出
    setMouse() {
     // 鼠標移入,圖片區(qū)域show,讓遮蓋層和放大鏡顯示
        this.show.addEventListener('mouseover', () => {
            this.drag.style.display = 'block';
            this.magnify.style.display = 'block';
        });
        // 鼠標移出,圖片區(qū)域show,讓遮蓋層和放大鏡隱藏
        this.show.addEventListener('mouseout', () => {
            this.drag.style.display = 'none';
            this.magnify.style.display = 'none';
        });
    }

 // 設置定位效果
 // 鼠標在 圖片區(qū)域移動 時
    // 1,讓遮蓋層,跟隨鼠標移動 --- 類似之前鼠標拖拽的效果
    setPosition() {
        this.show.addEventListener('mousemove', (e) => {
            e = e || event;
            // 1,定位 遮蓋層
            // 通過 鼠標的定位位置,來計算 遮蓋層 左上角 定位的坐標位置
            let x = e.clientX - this.ele.offsetLeft - this.ele.clientLeft - this.drag.clientWidth / 2;
            let y = e.clientY - this.ele.offsetTop - this.ele.clientTop - this.drag.clientHeight / 2;

   // 2,設定邊界值
            // 最小是 0  最大值 父級div寬高 - 遮蓋層寬高
            if (x < 0){
                x = 0;
            }
            else if (x > (this.show.clientWidth - this.drag.clientWidth)){
                x = this.show.clientWidth - this.drag.clientWidth;
            }
            if (y < 0){
                y = 0;
            }
            else if (y > (this.show.clientHeight - this.drag.clientHeight)){
                y = this.show.clientHeight - this.drag.clientHeight;
            }

   // 3,將數(shù)值定位給遮蓋層
            this.drag.style.left = x + 'px';
            this.drag.style.top = y + 'px';

   // 4,需要讓右側(cè)放大鏡的背景圖片也一起移動
            // 給背景圖片添加定位
            // 左側(cè)是 圖片不動,遮蓋層動      遮蓋層動  100  100
            // 右側(cè)是 放大鏡不動,背景圖片動  背景圖動 -100 -100
            // 移動時,定位必須是按照比例來設定

   // 背景圖片定位 = 背景圖片大小 * 遮蓋層定位 / 圖片大小 
            // 通過遮蓋層移動的比例,來計算,背景圖片定位的數(shù)值
            let backX = 2400 * x / 600;
            let backY = 2400 * y / 600;

   // 給背景圖片定位
            // 給背景圖片進行定位賦值操作
            this.magnify.style.backgroundPosition = `-${backX}px -${backY}px`;
        })
    }

 // 切換效果
    // 1,給當前鼠標經(jīng)過mouseover 的標簽,添加樣式
    //   給所有的標簽去除樣式,給當前點擊/經(jīng)過標簽,添加樣式
    setTab() {
        this.oUlis.forEach((item, key) => {
            item.addEventListener('mouseover', () => {
             // 1,給所有的li標簽清除樣式
                this.oUlis.forEach((item2) => {
                    item2.className = '';
                });
                // 2,給當前的標簽添加樣式
                item.className = 'active';

    // 3,設定圖片
                // 當前標簽的索引下標 key 就是對應 圖片數(shù)組中,需要顯示的圖片的索引下標
                
                // 1,給圖片標簽,設定路徑
                // 通過數(shù)組,索引,圖片屬性,獲取對應的圖片名稱
                // 標簽.src = 賦值   或者  標簽.setAttribute('src' , 屬性值) 都可以
                this.showImg.setAttribute('src', `./images/${this.array[key].normal}`);
                // 2,給放大鏡區(qū)域,背景圖片設定路徑
                // 必須把關(guān)于背景圖片的所有設定都重新寫一遍
                this.magnify.style.background = `url('./images/${this.array[key].big}') no-repeat 0 0 / 2400px`;
            })
        })
    }
}

要完美實現(xiàn)放大鏡效果,必須注意2個比例:

1、CSS樣式的比例 : 圖片區(qū)域大小 : 遮蓋層大小 = 背景圖片大小 : 放大鏡區(qū)域大小
2、定位的比例 : 遮蓋層定位 : 圖片區(qū)域大小 = 背景圖片定位 : 背景圖片大小

然后在調(diào)用我們的構(gòu)造函數(shù)即可得到最終的HTML,執(zhí)行即可達到我們的放大鏡效果了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>放大鏡</title>
    <link rel="stylesheet" type="text/css" href="./css/mgfyGlass.css" >
</head>
<body>
    <div id="box">
        <div class="show">
            <img src="./images/1.jpg" alt="#">
            <div class="drag"></div>
        </div>
        <div class="magnify"></div>
        <ul>
            <li class="active"><img src="./images/1.small.jpg" alt="#"></li>
            <li><img src="./images/2.small.jpg" alt="#"></li>
        </ul>
    </div>

    <script type="text/javascript" src="./javascript/mgfyGlass.js"></script>

    <script>
        const oBox = document.querySelector('#box');
        
        const imgArr = [
            {small: '1.small.jpg', normal: '1.jpg', big: '1.big.jpg'},
            {small: '2.small.jpg', normal: '2.jpg', big: '2.big.jpg'}
        ];
        
        const mgnGlass = new MgnGlass(oBox, imgArr);
    
        mgnGlass.init();
    
    
    </script>
</body>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 服務端渲染nextjs項目接入經(jīng)驗總結(jié)分析

    服務端渲染nextjs項目接入經(jīng)驗總結(jié)分析

    這篇文章主要為大家介紹了服務端渲染nextjs項目接入經(jīng)驗總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 學習JavaScript中的閉包closure應該注意什么

    學習JavaScript中的閉包closure應該注意什么

    這篇文章主要介紹了學習JavaScript中的閉包closure應該注意什么?在?JavaScript?中,?每當創(chuàng)建一個函數(shù),?閉包就會在函數(shù)創(chuàng)建的同時被創(chuàng)建出來,但是學習的時候我們應該注意哪些問題呢,帶著疑問一起進入下面文章學習具體內(nèi)容吧
    2022-06-06
  • js斷點調(diào)試經(jīng)驗分享

    js斷點調(diào)試經(jīng)驗分享

    給大家詳細分析了一下JS斷電調(diào)試的心得和經(jīng)驗,有需要的朋友參考一下吧。
    2017-12-12
  • 純js仿淘寶京東商品放大鏡功能

    純js仿淘寶京東商品放大鏡功能

    本文主要介紹了純js仿淘寶京東商品放大鏡功能的實例。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • 小程序如何獲取多個formId實現(xiàn)詳解

    小程序如何獲取多個formId實現(xiàn)詳解

    這篇文章主要介紹了小程序如何獲取多個formId實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • javascript使用正則獲取url上的某個參數(shù)

    javascript使用正則獲取url上的某個參數(shù)

    使用indexOf取得?之后的參數(shù),以&使split進行分割成數(shù)組,下面展示了一個從url上獲取名為MenuCode參數(shù)的過程
    2014-09-09
  • javaScript中push函數(shù)用法實例分析

    javaScript中push函數(shù)用法實例分析

    這篇文章主要介紹了javaScript中push函數(shù)用法,較為詳細的分析了javascript中push函數(shù)的功能、定義及使用技巧,需要的朋友可以參考下
    2015-06-06
  • 詳解js 創(chuàng)建對象的幾種方法

    詳解js 創(chuàng)建對象的幾種方法

    這篇文章主要介紹了js 創(chuàng)建對象的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 微信小程序?qū)崿F(xiàn)左滑動刪除效果

    微信小程序?qū)崿F(xiàn)左滑動刪除效果

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)左滑動刪除效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • javawscript 三級菜單的實現(xiàn)原理

    javawscript 三級菜單的實現(xiàn)原理

    javawscript 三級菜單的實現(xiàn)代碼。
    2009-07-07

最新評論

保山市| 绥宁县| 泊头市| 凤山市| 楚雄市| 健康| 额尔古纳市| 阜南县| 光山县| 邯郸市| 蒙自县| 依兰县| 镇原县| 台前县| 贡嘎县| 炉霍县| 襄汾县| 鹤庆县| 宜兰县| 黔东| 浦县| 扎囊县| 台前县| 手机| 商城县| 西藏| 红桥区| 商都县| 宝山区| 赣榆县| 乐亭县| 平安县| 松滋市| 南充市| 永定县| 安泽县| 富蕴县| 合江县| 潼南县| 景宁| 阳新县|