Vue实现电商网站商品放大镜效果

效果图

各部分代码

HTML部分

<div id="goodsPics">

        <!--当前查看商品图区域-->
        <div id="imgPre" style="position: relative;"
         @mouseleave="seeEnd">

         <div ref="imgPre">
          <img :src="url" alt="picNow">
         </div>

            <div class="topMask" @mouseenter="seeBegin($event)" @mousemove="move($event)"></div>
            <!--鼠标放大镜模块-->
            <div ref="move" v-show="isShow"
              class="move"
              :style="cursorMask">

            </div>
        </div>
        
        <!--商品图总览 —— 就是一排的小图-->
        <ul class="imgNow">
            <li  v-for=(item,index) in goodsImgs :key=item.id @mouseover="seeThis(index)" :id="urlIndex == index?sign:">
              <img style="width: 54px; height: 54px;" :src="item.src" alt="pics">
            </li>
        </ul>


            <!--放大镜区域 —— 查看商品图放大后的效果-->
            <div v-if="isShow" id="seeDetail" ref="bigImg">
              <img :src="Bigurl" alt="" :style="imgMove">
            </div>
                   
    </div>

CSS部分

#page{
          
   
  position: relative;
  height: 700px;
  width: 1246px;
  left: 19.3%;
  top: 111px;
  background-color: aqua;
}

/*商品图*/
#goodsPics{
          
   
  width: 452px;
  height: 626px;
  background-color: blue;
  position: relative;
  top: 10px;
}

/*当前所查看的图片,也即所需要局部放大查看的图片*/
.imgNow{
          
   
  position: relative;
  top: 15px;
  left: 37px;
}

.imgNow li{
          
   
/*CSS3给盒子:hover添加border时,盒子发生抖动的解决方案之一: 给盒子设置初始透明边框*/
  display: block;
  float: left;
  height: 54px;
  width: 54px;
  margin-left: 15px;
  border: 2px solid transparent
}
.imgNow li:hover, #sign{
          
   
  border: 2px solid red;
}

#seeDetail{
          
   
 /*注意定位,父相子绝*/
  position: absolute;
  background-color: aliceblue;
  width: 600px;
  height: 600px;
  top: 0%;
  left: 101%;
  overflow: hidden;/*隐藏图片溢出查看框之外的部分*/
  border: 2px solid #f90;
  background-position: 0 0;
  background-repeat: no-repeat;
}

#seeDetail img{
          
   
  position: absolute;
  /*这里注意下,初始时候将查看框内待放大图的左上角定位与查看框的左顶点处,也即其定位原点处*/
  top: 0;
  left: 0;
  background-repeat: no-repeat;
  
  /*我自己的图片设置的宽高是450×450,所以这里放大部分的图片的宽高设置为原图的四倍*/
  /*这个倍数需要注意,后面进行坐标变换的时候要用上*/
  width: 1800px;
  height: 1800px;
}
/*鼠标查看区域 —— 也即需要放大局部放大查看的区域*/
.move{
          
   
  position: absolute;
  
  /*初始定位*/
  left: 0;
  top: 0;
  
  width: 150px;
  height: 150px;
  cursor: move;
  background: rgba(142, 223, 255, 0.407);
}
.topMask{
          
   

/*覆盖在放大图的原图表面上的一个遮罩层*/
  width: 452px;
  height: 454px;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 5;
}

js部分

总结

放大镜功能的核心实现思路就是两张图,一大一小,计算光标预览区域左上角的坐标,然后根据两张图所在div的对应宽高比,等比反方向移动大图,溢出部分设置overflow: hidden,从而实现放大镜的效果

需要的知识点:

    在css3的实现方法中,可以使用transform: translate(),来设置图片的移动,此外还可以使用js获取标签进行对应属性的更改。 这里面主要是对pageX、pageY、offsetX、offsetY、offsetLeft、offsetTop、clientX、clientY等的区分使用
经验分享 程序员 微信小程序 职场和发展