【纯原生JS】 我居然用onmouseover+onmouseout+onmousemove鼠标事件来实现了商品放大镜效果 明白了 原来还可以这么干 附上源代码文件

简介: 用onmouseover+onmouseout+onmousemove鼠标事件来实现商品放大镜效果

🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注

1.png

前言😃

商品的放大镜效果相信逛过商城的朋友应该都见过吧,代码逻辑其实也很简单!
只要你掌握了onmouseover+onmouseout+onmousemove以及事件对象和一点点的DOM操作就可以轻松几行JS代码实现出来!

准备工作 🧐

搞几张图片来当素材吧, 我这里准备的是一张大图 800x 800 小图450x450 就可以了
2.png

接下来直接上代码

HTML结构 ☘️

 <div id="div1">
        <!--小图-->
        <div class="small_pic">
            <span class="mark"></span>
            <span class="float_layer"></span>
            <img  src="img/small.jpeg" longdesc="" />
        </div>

         <!--大图-->
        <div class="big_pic">
            <img  src="img/big.jpeg" alt="" longdesc="" />
        </div>
</div>

html布局结构的方式其实是有多种多样的,这也影响后期的js效果设计

CSS样式 🥳

*{
   
   
    margin: 0;
    padding: 0;
}
a{
   
   
    text-decoration: none;
}

#div1 {
   
    width:450px; height:450px; padding: 5px; border: 1px solid #ccc; position: relative; left: 50px; top:30px;}

#div1>.small_pic>.float_layer {
   
    width: 100px; height: 100px; border: 1px solid #000; background: #fff; filter: alpha(opacity: 30); opacity: 0.3; position: absolute; top: 0; left: 0; display:none; }
#div1>.small_pic>.mark {
   
   width:100%; height:100%; position:absolute; z-index:2; left:0px; top:0px; background:red; filter:alpha(opacity:0); opacity:0;}
#div1>.small_pic>.mark:hover{
   
    cursor: move;}

#div1>.big_pic {
   
    position: absolute; top: -1px; left: 480px; width:500px; height:500px; overflow:hidden; border:2px solid #CCC; display:none; }

#div1>.big_pic>img {
   
    position:absolute; top: 0px; left: 0px; }

其实有时候觉得css还是很重要的,毕竟css写好了 对后期js的整体代码逻辑也有一定影响的 这一点大家注意哈! hohohoho 🥳🥳🥳

javascript代码逻辑

function getByClass(obj,cName){
   
   
         var List=obj.getElementsByTagName("*");
         var arr=[];
         var i=0;
         var len=List.length;
         for(i=0;i<len;i++){
   
   
             if(List[i].className===cName){
   
   
                 arr.push(List[i]);
             }
         }
         return arr;
 }

 window.onload=function () {
   
   

     var _div1=document.getElementById("div1");
     var _mark=getByClass(_div1,'mark')[0];
     var _floatLayer=getByClass(_div1,'float_layer')[0];
     var _bigPic=getByClass(_div1,'big_pic')[0];
     var _smallPic=getByClass(_div1,'small_pic')[0];
     var _Img=_bigPic.getElementsByTagName("img")[0];

     _mark.onmouseover=function(){
   
   
         _floatLayer.style.display="block";
         _bigPic.style.display="block";
     }

     _mark.onmouseout=function(){
   
   
         _floatLayer.style.display="none";
         _bigPic.style.display="none";
     }
     _mark.onmousemove=function(event){
   
   
          var e=event || window.event;
          var X=e.clientX-_div1.offsetLeft-_smallPic.offsetLeft-(_floatLayer.offsetWidth/2);
          var Y=e.clientY-_div1.offsetTop-_smallPic.offsetTop-(_floatLayer.offsetHeight/2);
          if(X<0){
   
   
             X=0;
          }
         if(Y<0){
   
   
             Y=0;
         }
         if(X>(_mark.offsetWidth-_floatLayer.offsetWidth)){
   
   
             X=(_mark.offsetWidth-_floatLayer.offsetWidth);
         }
         if(Y>(_mark.offsetHeight-_floatLayer.offsetHeight)){
   
   
             Y=(_mark.offsetHeight-_floatLayer.offsetHeight);
         }

         _floatLayer.style.left=X+'px';
         _floatLayer.style.top=Y+'px';

         var _Px=X/(_mark.offsetWidth-_floatLayer.offsetWidth);
         var _Py=Y/(_mark.offsetHeight-_floatLayer.offsetHeight);

         //大图移动
         _Img.style.left=-_Px*(_Img.offsetWidth-_bigPic.offsetWidth)+'px';
         _Img.style.top=-_Py*(_Img.offsetHeight-_bigPic.offsetHeight)+'px';
     }
 }

有兴趣的朋友可以直接下载代码去试试,修改一下图片就可以马上使用!! 😁😁 【方言: 就等你说要不要的!】

最终效果

如图
3.gif

相关文章
|
3月前
|
JavaScript API
深入探索fs.WriteStream:Node.js文件写入流的全面解析
深入探索fs.WriteStream:Node.js文件写入流的全面解析
|
26天前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
32 0
|
3月前
|
JavaScript
鼠标事件(点击换色)分别使用js和jQuery代码实现
鼠标事件(点击换色)分别使用js和jQuery代码实现
40 1
|
2月前
|
存储 前端开发 JavaScript
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
本文介绍了JavaScript变量的声明和使用、标识符的命名规则、如何获取和操作HTML元素,以及JavaScript的鼠标事件处理,通过示例代码展示了这些基础知识点在实际开发中的应用。
41 2
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
|
23天前
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
14 2
|
2月前
|
前端开发 JavaScript API
前端JS读取文件内容并展示到页面上
前端JavaScript使用FileReader API读取文件内容,支持文本类型文件。在文件读取成功后,可以通过onload事件处理函数获取文件内容,然后展示到页面上。
61 2
前端JS读取文件内容并展示到页面上
|
2月前
|
JavaScript 前端开发 数据安全/隐私保护
混淆指定js文件
【9月更文挑战第26天】JavaScript 混淆旨在保护代码知识产权、减小文件体积和提高安全性。方法包括变量名和函数名混淆、代码压缩、控制流平坦化及字符串加密。常用工具如 UglifyJS 和 JScrambler 可实现这些功能。然而,混淆可能带来兼容性和调试困难等问题,需谨慎使用并确保法律合规。
|
18天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
93 0
|
2月前
|
移动开发 JavaScript 前端开发
js之操作文件| 12-5
js之操作文件| 12-5
|
2月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
27 0
原生JavaScript+canvas实现五子棋游戏_值得一看