JS实现图片局部放大或缩小的方法


Posted in Javascript onAugust 20, 2016

本文实例讲述了JS实现图片局部放大或缩小的方法。分享给大家供大家参考,具体如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Magnifier</title>
<style type="text/css">
#magnifier{
  width:500px;
  height:696px;
  position:absolute;
  top:100px;
  left:250px;
  font-size:0;
  border:1px solid #000;
}
#img{
  width:500px;
  height:696px;
}
#Browser{
  border:1px solid #000;
  z-index:100;
  position:absolute;
  background:#555;
}
#mag{
  border:1px solid #000;
  overflow:hidden;
  z-index:100;
}
</style>
<script type="text/javascript">
function getEventObject(W3CEvent) { //事件标准化函数
  return W3CEvent || window.event;
}
function getPointerPosition(e) { //兼容浏览器的鼠标x,y获得函数
  e = e || getEventObject(e);
  var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
  var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
  return { 'x':x,'y':y };
}
function setOpacity(elem,level) { //兼容浏览器设置透明值
  if(elem.filters) {
    elem.style.filter = 'alpha(opacity=' + level * 100 + ')';
  } else {
    elem.style.opacity = level;
  }
}
function css(elem,prop) { //css设置函数,可以方便设置css值,并且兼容设置透明值
  for(var i in prop) {
    if(i == 'opacity') {
      setOpacity(elem,prop[i]);
    } else {
      elem.style[i] = prop[i];
    }
  }
  return elem;
}
var magnifier = {
  m : null,
  init:function(magni){
    var m = this.m = magni || {
      cont : null,    //装载原始图像的div
      img : null,      //放大的图像
      mag : null,      //放大框
      scale : 15      //比例值,设置的值越大放大越大,但是这里有个问题就是如果不可以整除时,会产生些很小的白边,目前不知道如何解决
    }
    css(m.img,{
      'position' : 'absolute',
      'width' : (m.cont.clientWidth * m.scale) + 'px', //原始图像的宽*比例值
      'height' : (m.cont.clientHeight * m.scale) + 'px' //原始图像的高*比例值
      })
    css(m.mag,{
      'display' : 'none',
      'width' : m.cont.clientWidth + 'px',      //m.cont为原始图像,与原始图像等宽
      'height' : m.cont.clientHeight + 'px',
      'position' : 'absolute',
      'left' : m.cont.offsetLeft + m.cont.offsetWidth + 10 + 'px', //放大框的位置为原始图像的右方远10px
      'top' : m.cont.offsetTop + 'px'
      })
    var borderWid = m.cont.getElementsByTagName('div')[0].offsetWidth - m.cont.getElementsByTagName('div')[0].clientWidth; //获取border的宽
    css(m.cont.getElementsByTagName('div')[0],{      //m.cont.getElementsByTagName('div')[0]为浏览框
      'display' : 'none',                //开始设置为不可见
      'width' : m.cont.clientWidth / m.scale - borderWid + 'px', //原始图片的宽/比例值 - border的宽度
      'height' : m.cont.clientHeight / m.scale - borderWid + 'px', //原始图片的高/比例值 - border的宽度
      'opacity' : 0.5          //设置透明度
      })
    m.img.src = m.cont.getElementsByTagName('img')[0].src;      //让原始图像的src值给予放大图像
    m.cont.style.cursor = 'crosshair';
    m.cont.onmouseover = magnifier.start;
  },
  start:function(e){
    if(document.all){ //只在IE下执行,主要避免IE6的select无法覆盖
      magnifier.createIframe(magnifier.m.img);
    }
    this.onmousemove = magnifier.move; //this指向m.cont
    this.onmouseout = magnifier.end;
  },
  move:function(e){
    var pos = getPointerPosition(e); //事件标准化
    this.getElementsByTagName('div')[0].style.display = '';
    css(this.getElementsByTagName('div')[0],{
      'top' : Math.min(Math.max(pos.y - this.offsetTop - parseInt(this.getElementsByTagName('div')[0].style.height) / 2,0),this.clientHeight - this.getElementsByTagName('div')[0].offsetHeight) + 'px',
      'left' : Math.min(Math.max(pos.x - this.offsetLeft - parseInt(this.getElementsByTagName('div')[0].style.width) / 2,0),this.clientWidth - this.getElementsByTagName('div')[0].offsetWidth) + 'px' //left=鼠标x - this.offsetLeft - 浏览框宽/2,Math.max和Math.min让浏览框不会超出图像
      })
    magnifier.m.mag.style.display = '';
    css(magnifier.m.img,{
      'top' : - (parseInt(this.getElementsByTagName('div')[0].style.top) * magnifier.m.scale) + 'px',
      'left' : - (parseInt(this.getElementsByTagName('div')[0].style.left) * magnifier.m.scale) + 'px'
      })
  },
  end:function(e){
    this.getElementsByTagName('div')[0].style.display = 'none';
    magnifier.removeIframe(magnifier.m.img); //销毁iframe
    magnifier.m.mag.style.display = 'none';
  },
  createIframe:function(elem){
    var layer = document.createElement('iframe');
    layer.tabIndex = '-1';
    layer.src = 'javascript:false;';
    elem.parentNode.appendChild(layer);
    layer.style.width = elem.offsetWidth + 'px';
    layer.style.height = elem.offsetHeight + 'px';
  },
  removeIframe:function(elem){
    var layers = elem.parentNode.getElementsByTagName('iframe');
    while(layers.length >0){
      layers[0].parentNode.removeChild(layers[0]);
    }
  }
}
window.onload = function(){
  magnifier.init({
     cont : document.getElementById('magnifier'),
     img : document.getElementById('magnifierImg'),
     mag : document.getElementById('mag'),
     scale : 3
     });
}
</script>
</head>
<body>
<div id="magnifier">
<img src="lib/images/1.jpg" id="img" />
<div id="Browser"></div>
</div>
<div id="mag"><img id="magnifierImg" /></div>
<select style="position:absolute;top:200px;left:650px;width:100px;">
<option>select测试</option>
<option>是否能覆盖</option>
</select>
</body>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
事件模型在各浏览器中存在差异
Oct 20 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
js添加绑定事件的方法
May 15 Javascript
jquery实现ajax加载超时提示的方法
Jul 23 Javascript
Vue中的数据监听和数据交互案例解析
Jul 12 Javascript
JavaScript模块模式实例详解
Oct 25 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 Javascript
关于JavaScript数组去重的一些理解汇总
Sep 10 Javascript
JS获取及验证开始结束日期的方法
Aug 20 #Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 #Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 #Javascript
JS关闭窗口时产生的事件及用法示例
Aug 20 #Javascript
JS实现漂亮的时间选择框效果
Aug 20 #Javascript
JS简单设置下拉选择框默认值的方法
Aug 20 #Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 #Javascript
You might like
php链式操作的实现方式分析
2019/08/12 PHP
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
python开头的coding设置方法
2019/08/08 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
python中如何进行连乘计算
2020/05/28 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
小学毕业感言50字
2014/02/16 职场文书
我的老师教学反思
2014/05/01 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
导师工作推荐信
2015/03/27 职场文书
同乡会致辞
2015/07/30 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
Golang 对es的操作实例
2022/04/20 Golang