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 style 中visibility和display之间的区别
Jan 22 Javascript
jQuery JSON实现无刷新三级联动实例探讨
May 28 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
js重写方法的简单实现
Jul 10 Javascript
Vue计算属性的学习笔记
Mar 22 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
微信公众平台 发送模板消息(Java接口开发)
Apr 17 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
JS数组的高级使用方法示例小结
Mar 14 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 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分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
PHP文件操作详解
2016/12/30 PHP
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
初识Node.js
2015/03/20 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python实现画一颗树和一片森林
2018/06/25 Python
基于python中theano库的线性回归
2018/08/31 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
Linux的文件类型
2012/03/07 面试题
大学生找工作推荐信范文
2013/11/28 职场文书
中英文自我评价常用句型
2013/12/19 职场文书
保密协议书范本
2014/04/22 职场文书
给公司的建议书范文
2014/05/13 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
大学生入党自荐书
2015/03/05 职场文书
Python基础详解之邮件处理
2021/04/28 Python
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android