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 01 Javascript
FireFox下XML对象转化成字符串的解决方法
Dec 09 Javascript
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
VUEJS实战之修复错误并且美化时间(2)
Jun 13 Javascript
web打印小结
Jan 11 Javascript
Angular2自定义分页组件
Apr 19 Javascript
vue-router单页面路由
Jun 17 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
vue下axios拦截器token刷新机制的实例代码
Jan 17 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
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
理解JavaScript中的事件
2006/09/23 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
营销与策划专业毕业生求职信
2013/11/01 职场文书
打架检讨书500字
2014/01/29 职场文书
高一军训的心得体会
2014/09/01 职场文书
机关作风建设自查报告
2014/10/22 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
java设计模式--七大原则详解
2021/07/21 Java/Android
Pillow图像处理库安装及使用
2022/04/12 Python