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 var变量隐式声明方法
Oct 19 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
Mar 16 Javascript
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
node.js中的fs.readlinkSync方法使用说明
Dec 17 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
Mar 01 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
Vue2.x通用编辑组件的封装及应用详解
May 28 Javascript
在layui下对元素进行事件绑定的实例
Sep 06 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
Nov 25 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
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
Python对象转JSON字符串的方法
2016/04/27 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
Python切片操作实例分析
2018/03/16 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
法制报告会主持词
2014/04/02 职场文书
优秀毕业生求职信
2014/06/05 职场文书
学校欢迎标语
2014/06/18 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
格林童话读书笔记
2015/06/30 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android