自己动手丰衣足食之图片放大镜

本文介绍了一个简单的放大镜效果实现方案,通过HTML、CSS和JavaScript完成。利用鼠标移动事件调整小图上的透明框位置,并同步更新大图显示的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要两张图片,下载:http://download.youkuaiyun.com/detail/cometwo/9530731

这里写图片描述
这里写图片描述

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>放大镜练习</title>

        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }

            #small {
                width: 400px;
                height: 400px;
                overflow: hidden;
                margin-left: 10px;
                margin-top: 10px;
                z-index: 1;
                position: relative;
                border: 1px solid red;
            }

            #small img {
                position: absolute;
                top: 0;
                left: 0;
            }

            #float {
                display: block;
                width: 50px;
                height: 50px;
                background: green;
                opacity: 0.3;
                z-index: 2;
                position: absolute;
                display: none;
            }

            #big {
                width: 400px;
                height: 400px;
                overflow: hidden;
                margin-top: -400px;
                margin-left: 420px;
                position: relative;
                display: none;
                border: 1px solid blue;
            }

            #big img {
                position: absolute;
                left: 0;
            }
            p{
                margin-top: 10px;
                margin-left: 10px;
            }

        </style>
        <script type="text/javascript">
            window.onload = function() {
                window.onmousemove = function(e) {
                    document.getElementById('cl').innerHTML = "鼠标指针pageX,pageY坐标:" + e.pageX + "," + e.pageY;
                }
            }
        </script>
    </head>

    <body>
        <div id="small">
            <span id="float"></span>
            <img src="2.jpg">
        </div>
        <div id="big">
            <img id="no" src="1.jpg">
        </div>
        <p><span id="cl"></span></p>
        <p><span id="zb"></span></p>
        <script type="text/javascript">
            (function() {
                var oSmall = document.getElementById('small');
                var oFloat = document.getElementById('float');
                var oBig = document.getElementById('big');
                var oImg = oBig.getElementsByTagName('img')[0];
                oSmall.onmouseover = function() {
                    oBig.style.display = 'block';
                    oFloat.style.display = 'block';
                }
                oSmall.onmouseout = function() {
                    oBig.style.display = 'none';
                    oFloat.style.display = 'none';
                }
                oSmall.onmousemove = function(ev) {
                    var oEvent = ev || event;
                    /*****************/
                    var zb = document.getElementById('zb');
                    zb.innerHTML = "鼠标指针clientX,clientY的坐标:" + oEvent.clientX + "," + oEvent.clientY;
                    zb.innerHTML = zb.innerHTML + ",</br>oSmall的offsetLeft,offsetTop:" + oSmall.offsetLeft + "," + oSmall.offsetTop;
                    zb.innerHTML = zb.innerHTML + ",</br>oFloat的offsetWidth,offsetHeight:" + oFloat.offsetWidth + "," + oFloat.offsetHeight;
                    /*****************/
                    /*计算出滑块的left,top*/
                    var l = oEvent.clientX - oSmall.offsetLeft - oFloat.offsetWidth / 2;
                    var t = oEvent.clientY - oSmall.offsetTop - oFloat.offsetHeight / 2;
                    if (l < 0) {
                        l = 0
                    } else if (l > oSmall.offsetWidth - oFloat.offsetWidth) {
                        l = oSmall.offsetWidth - oFloat.offsetWidth
                    }
                    if (t < 0) {
                        t = 0
                    } else if (t > oSmall.offsetHeight - oFloat.offsetWidth) {
                        t = oSmall.offsetHeight - oFloat.offsetHeight;
                    }
                    oFloat.style.left = l + 'px';
                    oFloat.style.top = t + 'px';
                    zb.innerHTML = zb.innerHTML + "<br/>" + l + "," + t;
                    //计算出相对百分比
                    var percentX = l / (oSmall.offsetWidth - oFloat.offsetWidth);
                    var percentY = t / (oSmall.offsetHeight - oFloat.offsetHeight);
                    oImg.style.left = -percentX * (oBig.offsetWidth) + 'px';
                    oImg.style.top = -percentY * (oBig.offsetHeight) + 'px';
                }
            })();
        </script>
    </body>

</html>

拓展知识

主要使用了document对象关于窗口的一些属性,这些属性的主要功能和用法如下。

要 得到窗口的尺寸,对于不同的浏览器,需要使用不同的属性和方法:若要检测窗口的真实尺寸,在netscape下需要使用window的属性;在ie下需 要深入document内部对body进行检测;在dom环境下,若要得到窗口的尺寸,需要注意根元素的尺寸,而不是元素。

window对象的innerwidth属性包含当前窗口的内部宽度。window对象的innerheight属性包含当前窗口的内部高度。

document对象的body属性对应html文档的标签。document对象的documentelement属性则表示html文档的根节点。

document.body.clientheight表示html文档所在窗口的当前高度。document.body. clientwidth表示html文档所在窗口的当前宽度。

js获取屏幕高度var s = ""; 
s += " 网页可见区域宽:"+ document.body.clientwidth;
s += " 网页可见区域高:"+ document.body.clientheight; 
s += " 网页可见区域宽:"+ document.body.offsetwidth +" (包括边线和滚动条的宽)"; 
s += " 网页可见区域高:"+ document.body.offsetheight +" (包括边线的宽)"; 
s += " 网页正文全文宽:"+ document.body.scrollwidth; 
s += " 网页正文全文高:"+ document.body.scrollheight; 
s += " 网页被卷去的高:"+ document.body.scrolltop; 
s += " 网页被卷去的左:"+ document.body.scrollleft; 
s += " 网页正文部分上:"+ window.screentop; 
s += " 网页正文部分左:"+ window.screenleft; 
s += " 屏幕分辨率的高:"+ window.screen.height; 
s += " 屏幕分辨率的宽:"+ window.screen.width; 
s += " 屏幕可用工作区高度:"+ window.screen.availheight; 
s += " 屏幕可用工作区宽度:"+ window.screen.availwidth; 
s += " 你的屏幕设置是 "+ window.screen.colordepth +" 位彩色"; 
s += " 你的屏幕设置 "+ window.screen.devicexdpi +" 像素/英寸";

好文要顶 关注我 收藏该文  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Magnifier</title> <style type="text/css"> #magnifier{ width:320px; height:280px; position:absolute; border:1px solid #000; text-align:center; line-height:280px; overflow:hidden; } #img{ width:300px; height:260px; } #Browser{ border:1px solid #000; z-index:100; position:absolute; background:#555; } #mag{ border:1px solid #000; overflow:hidden; z-index:100; } </style> [removed] 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 +90 + '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 = '[removed]false;'; elem[removed].appendChild(layer); layer.style.width = elem.offsetWidth + 'px'; layer.style.height = elem.offsetHeight + 'px'; }, removeIframe:function(elem){ var layers = elem[removed].getElementsByTagName('iframe'); while(layers.length >0){ layers[0][removed].removeChild(layers[0]); } } } window.onload = function(){ magnifier.init({ cont : document.getElementById('magnifier'), img : document.getElementById('magnifierImg'), mag : document.getElementById('mag'), scale : 3 }); } [removed] </head>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值