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 相关文章推荐
jQuery筛选器children()案例详解(图文)
Feb 17 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
JavaScript实现多种排序算法
Feb 24 Javascript
分类解析jQuery选择器
Nov 23 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
js实现一个简单的数字时钟效果
Mar 29 Javascript
详解ES6中的三种异步解决方案
Jun 28 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 Javascript
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
用VsCode编辑TypeScript的实现方法
May 07 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实现 上一篇、下一篇的代码
2012/09/29 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
在Python中使用判断语句和循环的教程
2015/04/25 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python面向对象 反射原理解析
2019/08/12 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
深入浅析python的第三方库pandas
2020/02/13 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
python元组拆包实现方法
2021/02/28 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
联谊会主持词
2014/03/26 职场文书
社区元宵节活动总结
2015/02/06 职场文书
辞职信的写法
2015/02/27 职场文书
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL