js实现图片局部放大效果详解


Posted in Javascript onMarch 18, 2019

图片局部放大效果结合的知识点主要是DOM的操作,以及事件的应用,所以首先要对DOM的操作有一定了解,其次能对事件的应用有一定的累积。

js实现图片局部放大效果详解

如上图,可以看到,这是放大镜的基本效果,主要分成左右两个部分。左边分成一张大图,和一个导航栏,在右边则是一个放大镜放大后的图片。因此,我在画页面的时候,大体的HTMl结构如下:

<body>
  <div class="choose">
    <div class="content">
      <img src="images/small1.jpg" id = "small">
      <div class="shadow"></div>
    </div>
    <ul id = "listshow">
      <li class="selected">
        <img src="images/small1.jpg" data-img = "images/big1.jpg" alt="">
      </li>
      <li>
        <img src="images/small2.jpg" data-img = "images/big2.jpg" alt="">
      </li>
      <li>
        <img src="images/small3.jpg" data-img = "images/big3.jpg" alt="">
      </li>
      <li>
        <img src="images/small4.jpg" data-img = "images/big4.jpg" alt="">
      </li>
    </ul>
  </div>
  <div class="larger">
    <img src="images/big1.jpg" id = "big">
  </div>
</body>

在这个时候,将静态页面按常规方式进行布局,给予css样式如下:

<style>
    *{
      padding: 0;
      margin: 0;
      list-style: none;
    }
    .choose{
      width: 400px;
      height: 600px;
      float: left;
      margin:50px 0 0 50px;
    }
    .content{
      width: 400px;
      height: 400px;
      position: relative;
    }

    .content img {
      width: 400px;
      height: 400px;
    }
    #listshow{
      width: 400px;
      height: 100px;
      margin-top: 20px;
    }
    #listshow li{
      width: 98px;
      height: 100px;
      float: left;
      border:1px solid #666;
    }
    #listshow li img{
      width: 98px;
      height: 100px;
    }
    #listshow .selected{
      border-color: brown;
    }
    .larger{
      width: 400px;
      height: 400px;
      position: absolute;
      top: 50px;
      left: 500px;
      float: left;
      overflow: hidden;
      display: none;
    }
    #big{
      width: 800px;
      height: 800px;
      position: absolute;
      left: 0;
      top: 0;
    }
    .shadow{
      width: 200px;
      height: 200px;
      background-color: rgba(145,200,200,.4);
      position: absolute;
      left: 0;
      top: 0;
      z-index: 10;
      display: none;
    }
  </style>

那么这个时候,开始写js样式,分布书写的话,第一步要考虑到左边的选项卡。选项卡我采用直接使用src赋值的方法,将滑过的图片对应的src给大图,代码呈现:

for(var i = 0;i<showli.length;i++){
    var showitem = showli[i];
    showitem.onmouseover =showitem.onclick = function(e){
      let evt = window.event||e;
      for(var j =0;j<showli.length;j++){
        showli[j].className = "";
      }
      var showimg = this.getElementsByTagName("img")[0];
      var imgsrc = showimg.src;
      small.src = imgsrc;
      var bigsrc = showimg.getAttribute("data-img");
      big.src = bigsrc;
      this.className = "selected";
    }
  }

这样就可以成功实现选项卡功能,比较简单粗暴的一种方式,当然,大家使用selected结合点击下标和大图下标相等的这一点,也一样可以做出来。

接下来要考虑到,鼠标在大图上移动时,遮罩层的移动效果。值得一提的时候,这个地方其实存在一个视觉上的误区,看起来是在滑动遮罩层,其实是鼠标的滑动,而遮罩层通过获取鼠标的clientX,clientY来确定自己的位置,遮罩层位置获取代码:

content.onmousemove = function (e) {
    var evt = window.event||e;

    larger.style.display = "block";
    shadow.style.display = "block";
    var clientX = evt.clientX;
    var clientY = evt.clientY;

    var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft;
    var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;

    var X = clientX+scrollLeft-chooseMarginL-shadowW/2;
    var Y = clientY+scrollTop-chooseMarginT-shadowH/2;

    if(X<=0){
      X = 0;
    }
    if(X>=maxX){
      X = maxX;
    }
    if(Y<=0){
      Y = 0;
    }
    if(Y>=maxY){
      Y = maxY;
    }
//    防止遮罩层粘滞,跟随鼠标一起滑出大图位置
    var bigX = X*bigW/contentW;
    var bigY = Y*bigH/contentH;
// bigX / bigW = X / contentW,主图和遮罩层之间存在两倍关系,放大图和原图之间也有两倍关系
    shadow.style.left = X+"px";
    shadow.style.top = Y+"px";

    big.style.left = -bigX+"px";
    big.style.top = -bigY+"px";

  }

在这里,计算较多,尤其要注意遮罩层阴影,主图以及放大图之间的倍数关系。

到这里,基本功能就实现了,这里面涉及的计算可以适当配图理解,尤其注意点击位置的获取。

以上所述是小编给大家介绍的js实现图片局部放大效果详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 事件记录使用说明
Oct 20 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
JavaScript的React框架中的JSX语法学习入门教程
Mar 05 Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
JS简单判断滚动条的滚动方向实现方法
Apr 28 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
vue实现记事本功能
Jun 26 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 #Javascript
vue动画效果实现方法示例
Mar 18 #Javascript
node.js实现微信开发之获取用户授权
Mar 18 #Javascript
学习node.js 断言的使用详解
Mar 18 #Javascript
React 使用Hooks简化受控组件的状态绑定
Mar 18 #Javascript
JavaScript显式数据类型转换详解
Mar 18 #Javascript
浅谈js中的bind
Mar 18 #Javascript
You might like
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
vue实现扫码功能
2020/01/17 Javascript
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
联村联户简报
2015/07/21 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
导游词之海南天涯海角
2019/12/05 职场文书