放大鏡

放大鏡的效果跟平常我們?cè)陔娚叹W(wǎng)站中的商品詳情頁將商品放大查看的效果是一樣的,效果圖如下:


放大鏡

布局結(jié)構(gòu)如下:

<div class="enlarge">
    <div class="middleBox">
        <img src="./img/1.jfif" alt="">
        <div class="mask"></div>
        <div class="bigBox">
            <img src="./img/1.jfif" alt="">
        </div>
    </div>
    <div class="smallBox">
        <img src="./img/1.jfif" alt="">
        <img src="./img/2.webp" alt="">
        <img src="./img/3.webp" alt="">
    </div>
</div>

css樣式如下:

.middleBox{
    width: 400px;
    height: 400px;
    position:relative;
}
.middleBox>img{
    width: 400px;
    height: 400px;
}
.middleBox .mask{
    width: 100px;
    height: 100px;
    background-color: rgba(255,255,0,.7);
    position:absolute;
    left: 0;
    top: 0;
    display:none;
}
/* 
    布局的時(shí)候,有一個(gè)比例必須遵循:
    中等盒子跟遮罩的大小比例 = 大圖跟大盒子的大小比例
*/
.middleBox>.bigBox{
    width: 300px;
    height: 300px;
    position:absolute;
    left: 105%;
    top: 0;
    display:none;
    overflow: hidden;
}
.middleBox>.bigBox>img{
    width: 1200px;
    height: 1200px;
    position:absolute;
    left: 0;
    top: 0;
}
.smallBox img{
    width: 80px;
    height: 80px;
    border:2px solid #000;
    margin:20px 20px 0 0;
}
.smallBox img:first-child{
    border-color:red;
}
.mask:hover{
    cursor: move;
}

效果分為3個(gè)部分,第1部分是點(diǎn)擊小圖,換中等圖和大圖:

// 獲取所有標(biāo)簽
var enlarge = document.querySelector('.enlarge');
var middleBox = enlarge.querySelector('.middleBox')
var bigBox = enlarge.querySelector('.bigBox')
var middleImg = enlarge.querySelector('.middleBox>img')
var bigImg = enlarge.querySelector('.bigBox>img')
var smallImgs = enlarge.querySelectorAll('.smallBox>img')
var mask = enlarge.querySelector('.mask')
// 點(diǎn)擊小圖換中圖和大圖
// 遍歷所有小圖
for(var  i=0;i<smallImgs.length;i++){
    // 給所有小圖綁定單擊事件
    smallImgs[i].onclick = function(){
        // 將所有小圖的邊框顏色改成黑色
        for(var  j=0;j<smallImgs.length;j++){
            smallImgs[j].style.borderColor = '#000';
        }
        // 將當(dāng)前點(diǎn)擊的這個(gè)小圖邊框顏色改成紅色
        this.style.borderColor = 'red';
        // 獲取到當(dāng)前點(diǎn)擊的小圖的路徑
        var src = this.getAttribute('src')
        // 將小圖的路徑放到中圖和大圖中
        middleImg.setAttribute('src',src)
        bigImg.setAttribute('src',src)
    }
}

第2部分是鼠標(biāo)移入中等盒子讓遮罩和大盒子顯示,移出隱藏:

// 鼠標(biāo)移入中盒子
middleBox.onmouseover = function(){
    // 讓遮罩和大盒子顯示
    mask.style.display = 'block';
    bigBox.style.display = 'block';
}
// 鼠標(biāo)移出中盒子
middleBox.onmouseout = function(){
    // 讓遮罩和大盒子隱藏
    mask.style.display = 'none';
    bigBox.style.display = 'none';
}

第3部分,鼠標(biāo)在移入中等盒子后,讓遮罩跟隨鼠標(biāo)移動(dòng),讓大圖跟隨遮罩移動(dòng):

// 鼠標(biāo)移入中盒子
middleBox.onmouseover = function(){
    // 讓遮罩和大盒子顯示
    mask.style.display = 'block';
    bigBox.style.display = 'block';
    // 鼠標(biāo)在中盒子中移動(dòng)
    middleBox.onmousemove = function(){
        // 獲取鼠標(biāo)當(dāng)前在瀏覽器中的位置
        var e = window.event;
        var x = e.pageX;
        var y = e.pageY;
        // 根據(jù)光標(biāo)位置計(jì)算遮罩的left和top = 光標(biāo)位置 - 遮罩大小的一般 - 大盒子左邊的間距
        var l = x - mask.offsetWidth/2 - enlarge.offsetLeft;
        var t = y - mask.offsetHeight/2 - enlarge.offsetTop;
        // 限制left和top
        if(l<0) l=0
        if(t<0) t=0
        if(l>middleBox.clientWidth-mask.offsetWidth) l=middleBox.clientWidth-mask.offsetWidth
        if(t>middleBox.clientHeight-mask.offsetHeight){
            t=middleBox.clientHeight-mask.offsetHeight
        }
        // 設(shè)置left和top
        mask.style.left = l + 'px'
        mask.style.top = t + 'px'
        // 移動(dòng)過程中計(jì)算大圖需要移動(dòng)的距離 = 遮罩在中盒子中移動(dòng)的比例 * 大圖的尺寸
        // 計(jì)算遮罩在中盒子中移動(dòng)的比例
        var percentX = l / middleBox.clientWidth;
        var percentY = t / middleBox.clientHeight;
        // 根據(jù)比例計(jì)算大圖需要移動(dòng)的距離
        var bigLeft = percentX * bigImg.offsetWidth
        var bigTop = percentY * bigImg.offsetHeight
        // 將計(jì)算好的大圖需要移動(dòng)的距離的設(shè)置給大圖
        bigImg.style.left = -bigLeft + 'px'
        bigImg.style.top = -bigTop + 'px'
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容