JavaScript图片放大技术(放大镜)实现代码分享


Posted in Javascript onNovember 14, 2013
<!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>JavaScript图片放大技术(放大镜)实现代码分享 - 3water.com</title> 
<style type="text/css"> 
#magnifier{ 
    width:342px; 
    height:420px; 
    position:absolute; 
    top:100px; 
    left:250px; 
    font-size:0; 
    border:1px solid #000; 
} 
#img{ 
    width:342px; 
    height:420px; 
} 
#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="https://3water.com/images/20091107/fangda.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 23 Javascript
js自动生成对象的属性示例代码
Oct 28 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
vue init失败简单解决方法(终极版)
Dec 22 Javascript
ExtJs整合Echarts的示例代码
Feb 27 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
jquery 验证用户名是否重复代码实例
May 14 jQuery
Vue实现拖放排序功能的实例代码
Jul 08 Javascript
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
JS获取农历日期具体实例
Nov 14 #Javascript
提高jQuery性能的十个诀窍
Nov 14 #Javascript
优化Jquery,提升网页加载速度
Nov 14 #Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 #Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
Nov 14 #Javascript
JS正则表达式大全(整理详细且实用)
Nov 14 #Javascript
JS中typeof与instanceof之间的区别总结
Nov 14 #Javascript
You might like
phpinfo 系统查看参数函数代码
2009/06/05 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
JObj预览一个JS的框架
2008/03/13 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
bootstrap table实例详解
2017/01/06 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
使用python分析git log日志示例
2014/02/27 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
PyQt5每天必学之组合框
2018/04/20 Python
python使用knn实现特征向量分类
2018/12/26 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
Python求凸包及多边形面积教程
2020/04/12 Python
Python中的全局变量如何理解
2020/06/04 Python
党员转正申请报告
2015/05/15 职场文书
交通事故被告答辩状
2015/05/22 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
总结高并发下Nginx性能如何优化
2021/11/01 Servers
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA