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 相关文章推荐
学习jquery之一
Apr 27 Javascript
关于JavaScript定义类和对象的几种方式
Nov 09 Javascript
javascript的offset、client、scroll使用方法详解
Dec 25 Javascript
JavaScript对象和字串之间的转换实例探讨
Apr 21 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
js+div实现文字滚动和图片切换效果代码
Aug 27 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
jquery仿微信聊天界面
May 06 jQuery
vue.js实现用户评论、登录、注册、及修改信息功能
May 30 Javascript
Vue隐藏显示、只读实例代码
Jul 18 Javascript
javascript实现考勤日历功能
Nov 29 Javascript
Vue学习笔记之计算属性与侦听器用法
Dec 07 Javascript
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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
一个好用的分页函数
2006/11/16 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
python多线程抽象编程模型详解
2019/03/20 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
sort命令的作用和用法
2013/08/25 面试题
劳资专员岗位职责
2013/12/27 职场文书
政风行风建设整改方案
2014/10/27 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
努力工作保证书
2015/02/28 职场文书
首次购房证明
2015/06/19 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
Python函数中apply、map、applymap的区别
2021/11/27 Python