JavaScript实现京东购物放大镜和选项卡效果的方法分析


Posted in Javascript onJuly 05, 2018

本文实例讲述了JavaScript实现京东购物放大镜和选项卡效果的方法。分享给大家供大家参考,具体如下:

购物网站点击商品后,都会有一个查看物品图片,并且可以放大仔细观察物品的功能。这个功能看起来复杂,其实实现起来非常简单。下面我们来一起做这个小效果吧!

首先,我们看一下页面的布局:

JavaScript实现京东购物放大镜和选项卡效果的方法分析

1.小图片显示区,上面有一个方形遮罩层
2.缩略图横向列表
3.大图显示区域

然后,我们写出开发步骤:

1.编写3个区域的html布局,使他们位于同一个容器内
2.显示区域2的图片列表
3.给区域2的图片添加mouseover事件,使图片显示在区域1内
4.鼠标移入区域1,生成半透明的选择框
5.区域3显示区域2选择框对应的图片位置放大的效果
6.鼠标移除区域2,区域3隐藏

最后,根据需求写出相应代码:

html和css:

<style>
    ul{
      list-style: none;
      padding: 0;
    }
    .zoom-box{
      position: relative;
      width: 452px;
    }
    .small-box{
      border: 1px solid #ccc;
      position: relative;
    }
    .small-box .square{
      position: absolute;
      background-color: yellow;
      opacity: 0.5;
      display: none;
    }
    .small-box .mask{
      width: 100%;
      height: 100%;
      opacity: 0;
      position: absolute;
      top:0;
      left:0;
    }
    .img-list ul:after{
      clear: both;
      content: '';
      display: table;
    }
    .img-list ul li{
      float: left;
      padding: 0 8px;
    }
    .img-list img{
      border: 2px solid transparent;
    }
    .img-list img.active{
      border: 2px solid red;
    }
    .big-box{
      position: absolute;
      top:0;
      left: 100%;
      margin-left: 2px;
      width: 500px;
      height: 500px;
      border: 1px solid #ccc;
      display: none;
      overflow: hidden;
    }
    .big-box img{
      position: absolute;
    }
  </style>
</head>
<body>
<div class="zoom-box">
  <div class="small-box">
    <img src="../../../img/京东放大镜/m1.jpg" alt="">
    <div class="square">
    </div>
    <div class="mask"></div>
  </div>
  <div class="img-list">
    <ul>
      <li><img class="active" src="../../../img/京东放大镜/s1.jpg" alt="" data-small="../../../img/京东放大镜/m1.jpg"
           data-big="../../../img/京东放大镜/b1.jpg"></li>
      <li><img src="../../../img/京东放大镜/s2.jpg" alt="" data-small="../../../img/京东放大镜/m2.jpg"
           data-big="../../../img/京东放大镜/b2.jpg"></li>
      <li><img src="../../../img/京东放大镜/s3.jpg" alt="" data-small="../../../img/京东放大镜/m3.jpg"
           data-big="../../../img/京东放大镜/b3.jpg"></li>
      <li><img src="../../../img/京东放大镜/s4.jpg" alt="" data-small="../../../img/京东放大镜/m4.jpg"
           data-big="../../../img/京东放大镜/b4.jpg"></li>
      <li><img src="../../../img/京东放大镜/s5.jpg" alt="" data-small="../../../img/京东放大镜/m5.jpg"
           data-big="../../../img/京东放大镜/b5.jpg"></li>
      <li><img src="../../../img/京东放大镜/s6.jpg" alt="" data-small="../../../img/京东放大镜/m6.jpg"
           data-big="../../../img/京东放大镜/b6.jpg"></li>
    </ul>
  </div>
  <div class="big-box">
    <img src="../../../img/京东放大镜/b1.jpg" alt="">
  </div>
</div>

js代码:

<script>
  var smallBox=$('.small-box .mask');
  var smallImg=$('.small-box img');
  var square=$('.square');
  var imagesList=$all('.img-list img');
  var bigBox=$('.big-box');
  var bigImg=$('.big-box img');
  //选项卡切换
  for(var i=0;i<imagesList.length;i++){
    imagesList[i].onmouseover=function () {
      for (var j=0;j<imagesList.length;j++){
        imagesList[j].className='';
      }
      this.className='active';
      bigImg.src=this.getAttribute('data-big');
      smallImg.src=this.getAttribute('data-small');
    }
  }
  //鼠标移进事件
  smallBox.onmouseover=function () {
    square.style.display='block';
    bigBox.style.display='block';
    //利用比例公式计算square的宽高
    //square的宽/smallImg的宽 = bigBox的宽/bigIma的宽
    square.style.width=smallImg.offsetWidth * bigBox.offsetWidth / bigImg.offsetWidth + 'px';
    square.style.height=smallImg.offsetHeight * bigBox.offsetHeight / bigImg.offsetHeight + 'px';
  };
  //鼠标移出事件
  smallBox.onmouseout=function () {
    square.style.display='none';
    bigBox.style.display='none';
  };
  //鼠标移动事件
  smallBox.onmousemove=function (e) {
    var e=e||window.event;
    var x,y;
    //x和y的坐标
    x=e.offsetX-square.offsetWidth/2;
    y=e.offsetY-square.offsetHeight/2;
    if(x<0){
      x=0;
    }
    if(x>smallBox.offsetWidth-square.offsetWidth){
      x=smallBox.offsetWidth-square.offsetWidth;
    }
    if(y<0){
      y=0;
    }
    if(y>smallBox.offsetHeight-square.offsetHeight){
      y=smallBox.offsetHeight-square.offsetHeight;
    }
    square.style.left=x+'px';
    square.style.top=y+'px';
    //利用公式计算大图的坐标
    //<!--// x/?=smallimg.w/bigimg.w-->
    //<!--// y/?=smallimg.h/bigimg.h-->
    bigImg.style.left=-x * bigImg.offsetWidth / smallImg.offsetWidth + 'px';
    bigImg.style.top=-y * bigImg.offsetHeight / smallImg.offsetHeight + 'px';
  };
  function $(name) {
    return document.querySelector(name);
  }
  function $all(name) {
    return document.querySelectorAll(name);
  }
</script>

大家可以做一下看看效果:

JavaScript实现京东购物放大镜和选项卡效果的方法分析

添加一个mask的div是因为,如果直接在smallBox上添加事件,会受到其中的子元素的影响,导致图片抖动。而对一个空内容的mask操作就不会有影响了。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript parseInt与Number函数的区别
Jan 21 Javascript
Jquery Ajax的Get方式时需要注意URL地方
Apr 07 Javascript
JQUERY 设置SELECT选中项代码
Feb 07 Javascript
jquery删除数据记录时的弹出提示效果
May 06 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
javascript中FOREACH数组方法使用示例
Mar 01 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
从0开始学Vue
Oct 27 Javascript
jQuery代码实现实时获取时间
Jan 29 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
Jun 04 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
Feb 27 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
Nov 08 Javascript
微信小程序实现左右联动的实战记录
Jul 05 #Javascript
vue实现自定义多选与单选的答题功能
Jul 05 #Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 #Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 #Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 #Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 #Javascript
vue两个组件间值的传递或修改方式
Jul 04 #Javascript
You might like
PHP实现获取中英文首字母
2015/06/19 PHP
PHP如何使用Memcached
2016/04/05 PHP
JS 继承实例分析
2008/11/04 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
Python装饰器使用示例及实际应用例子
2015/03/06 Python
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
python列出目录下指定文件与子目录的方法
2015/07/03 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
基于python实现复制文件并重命名
2020/09/16 Python
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
上班打牌检讨书
2014/02/07 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
财务会计求职信范文
2015/03/20 职场文书
四风之害观后感
2015/06/09 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
python在package下继续嵌套一个package
2022/04/14 Python