js實現(xiàn)購物網站商品放大鏡效果
本文實例為大家分享了js實現(xiàn)購物網站商品放大鏡效果的具體代碼,供大家參考,具體內容如下
首先說一下原理,以天貓某商品放大鏡效果為例:

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

顯然,小圖中放的就是我這里圖片名中帶有small的小圖了,遮蓋層就是正常大小的圖,放大層就是帶有big的放大的圖了,然后再加入適當?shù)奈灰坪惋@示效果,就達成我們見到的放大鏡效果了,下面就通過代碼來實現(xiàn)吧:
首先寫出HTML結構:
<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、定位遮蓋層位置,讓它隨著鼠標在 正常圖片盒子 內移動,同時放大層圖片對應的在放大層盒子內移動
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');
}
// 定義一個方法,來調用之后定義的所有的方法
// 入口函數(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,需要讓右側放大鏡的背景圖片也一起移動
// 給背景圖片添加定位
// 左側是 圖片不動,遮蓋層動 遮蓋層動 100 100
// 右側是 放大鏡不動,背景圖片動 背景圖動 -100 -100
// 移動時,定位必須是按照比例來設定
// 背景圖片定位 = 背景圖片大小 * 遮蓋層定位 / 圖片大小
// 通過遮蓋層移動的比例,來計算,背景圖片定位的數(shù)值
let backX = 2400 * x / 600;
let backY = 2400 * y / 600;
// 給背景圖片定位
// 給背景圖片進行定位賦值操作
this.magnify.style.backgroundPosition = `-${backX}px -${backY}px`;
})
}
// 切換效果
// 1,給當前鼠標經過mouseover 的標簽,添加樣式
// 給所有的標簽去除樣式,給當前點擊/經過標簽,添加樣式
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ū)域,背景圖片設定路徑
// 必須把關于背景圖片的所有設定都重新寫一遍
this.magnify.style.background = `url('./images/${this.array[key].big}') no-repeat 0 0 / 2400px`;
})
})
}
}
要完美實現(xiàn)放大鏡效果,必須注意2個比例:
1、CSS樣式的比例 : 圖片區(qū)域大小 : 遮蓋層大小 = 背景圖片大小 : 放大鏡區(qū)域大小
2、定位的比例 : 遮蓋層定位 : 圖片區(qū)域大小 = 背景圖片定位 : 背景圖片大小
然后在調用我們的構造函數(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>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
javascript使用正則獲取url上的某個參數(shù)
使用indexOf取得?之后的參數(shù),以&使split進行分割成數(shù)組,下面展示了一個從url上獲取名為MenuCode參數(shù)的過程2014-09-09

