我们平时在电商网站购物时,需要对选取的某一个商品进行详情查看,此时当鼠标在商品图片上某一部分移动查看时旁边就会出现一个该部分图片的放大效果,这样就能够更好的对商品进行分析,下面就使用原生js来实现一下类似放大镜的效果。
思路分析:
1.鼠标切换图片列表时,.pic盒子中的图片相对应切换
2.在.pic中生成一个.zoom的盒子,移动该盒子时类似对.pic盒子中的图片进行剪切
2.1动态获取.zoom盒子相对.pic盒子的background-positin属性值
2.2对.zoom盒子的移动范围进行限制(只在.pic盒子中移动)
3.将剪切的图片按比例放大显示到.details的盒子中
注:放大比例=左边盒子的大小/里面进行剪切的盒子大小,该比例值作为右边盒子显示内容的大小
代码如下:
1<!DOCTYPEhtml>
2<htmllang="en">
3<head>
4<metacharset="UTF-8">
5<metaname="viewport"content="width=device-width,initial-scale=1.0">
6<metahttp-equiv="X-UA-Compatible"content="ie=edge">
7<title>原生js实现图片放大镜</title>
8<linkrel="stylesheet"href="./css/style.css">
9</head>
10
11<body>
12
13<divid="wrap">
14<divclass="pic">
15<imgsrc="./images/1.jpg"alt="">
16<divclass="zoom"></div>
17</div>
18<ulclass="list">
19<liclass="current">
20<imgsrc="./images/1.jpg"alt="">
21</li>
22<li>
23<imgsrc="./images/2.jpg"alt="">
24</li>
25<li>
26<imgsrc="./images/3.jpg"alt="">
27</li>
28<li>
29<imgsrc="./images/4.jpg"alt="">
30</li>
31<li>
32<imgsrc="./images/5.jpg"alt="">
33</li>
34<li>
35<imgsrc="./images/6.jpg"alt="">
36</li>
37</ul>
38<divclass="details"></div>
39
40
41<scriptsrc="./js/index.js"></script>
42</body>
43</html>
HTML部分
@charset"utf-8";
*{
margin:0;
padding:0;
}
li{
list-style:none;
}
body{
background-color:#eee;
}
#wrap{
position:relative;
width:400px;
height:480px;
margin:50pxauto;
border:1pxsolid#888;
}
#wrap.picimg{
width:400px;
height:400px;
}
#wrap.pic.zoom{
position:absolute;
top:0;
left:0;
width:150px;
height:150px;
background-color:lightblue;
opacity:.4;
cursor:move;
}
#wrap.list{
display:flex;
margin-top:10px;
justify-content:space-around;
}
#wrap.listli{
cursor:pointer;
}
#wrap.list.current{
border:2pxsolidred;
}
#wrap.listimg{
width:50px;
height:50px;
vertical-align:bottom;/*解决图片底部留白,改变对齐方式,默认基线对齐*/
}
#wrap.details{
position:absolute;
/*display:none;*/
top:0;
left:400px;
width:400px;
height:400px;
margin-left:20px;
border:1pxsolid#888;
background-image:url('/images/1.jpg');
background-size:266%;
}
CSS部分
1varlist=document.querySelector('.list'),
2img=document.querySelector('.picimg'),
3li_list=list.querySelectorAll('li'),
4pic=document.querySelector('#wrap.pic'),
5zoom=document.querySelector('.zoom'),
6details=document.querySelector('.details')
7
8list.addEventListener('click',function(e){
9e=e||window.event
10//console.log(e.target)
11if(e.target.tagName=='IMG'){
12img.src=e.target.src;
13details.style.backgroundImage='url('+e.target.src+')';
14//console.log(e.target.parentNode)
15li_list.forEach(function(item){
16console.log(item)
17item.className='';//每次遍历六个li元素并清除类名
18})
19e.target.parentNode.className='current';//通过e.target找到其父元素并添加上类名
20//console.log(li_list)
21}
22},false)
23
24pic.addEventListener('mousemove',function(e){
25e=e||window.event
26varx=e.clientX,
27y=e.clientY;
28cx=pic.getBoundingClientRect().left;//getBoundingClientRect()获取某个元素相对于视窗的位置集合
29cy=pic.getBoundingClientRect().top;
30tx=x-cx-75;
31ty=y-cy-75
32//console.log(e)
33//console.log(x,y)
34//console.log(cx,cy)
35
36//对.zoom盒子移动范围进行限制
37if(tx<0){
38tx=0;
39}
40if(tx>250){
41tx=250
42}
43if(ty<0){
44ty=0;
45}
46if(ty>250){
47ty=250
48}
49
50details.style.backgroundPosition=(tx/250*100+'%')+(ty/250*100+'%')
51
52zoom.style.left=tx+'px'
53zoom.style.top=ty+'px';
54})
js部分
最终效果:
总结:
整体先实现静态效果,然后根据需求进行一步步逻辑代码的编写,从而实现整个效果
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56605.shtml