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 相关文章推荐
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 Javascript
JavaScript实现的日期控件具体代码
Nov 18 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
javascript倒计时效果实现
Nov 12 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
jQuery限制图片大小的方法
May 25 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
微信小程序实现多选功能
Nov 04 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
Aug 20 Javascript
Javascript基于OOP实实现探测器功能代码实例
Aug 26 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
SMARTY学习手记
2007/01/04 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
php实现算术验证码功能
2018/12/05 PHP
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
python+tkinter实现学生管理系统
2019/08/20 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
市场营销策划方案
2014/06/11 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
员工升职自荐信
2015/03/27 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python