// 获取左侧图片路径后赋值给右侧大图片 如果左侧有多张小图片 请将获取的ID改成class,然否使用for循环,不会的去社会猿提问,我会在答案区留下demo,地址:www.shehuiyuan.com
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"> * { margin:0; padding:0; } .w { width: 1190px; margin: 0 auto; } .fdj { margin-top: 20px; } .fdj .leftBox { width: 400px; height: 400px; border: 1px solid #ccc; float: left; position: relative; overflow: hidden; } .fdj .tool { width: 250px; height: 250px; background:gold; opacity:.5; filter:alpha(opacity=50); position: absolute; top:0; left: 0; cursor: move; /* 默认隐藏 */ display: none; } /* 给小黄加上active 就会显示 */ .fdj .tool.active { display: block; } .fdj .rightBox { width: 500px; height: 500px; border:1px solid #ccc; float: left; overflow: hidden; /* 隐藏 */ display: none; position: relative; } /* 加上active表示显示 */ .fdj .rightBox.active { display: block; } .fdj .rightBox img { position: absolute; } </style> </head> <body> <div class="w"> <div class="fdj"> <!-- 左侧 --> <div class="leftBox" id="_leftBox"> <!-- 小图 --> <img src="http://www.duanlonglong.com/images/defaultpic.gif" id="hqsrc" alt="" style="width: 100%;height: 100%;" /> <!-- 小黄盒子 --> <div class="tool" id="_tool"></div> </div> <!-- 右侧 --> <div class="rightBox" id="_rightBox" style="position: relative;"> <img id="_bImg" src="" alt=""/> </div> </div> </div> <script type="text/javascript"> //【准备:获取要操作的元素】 var _leftBox = document.querySelector('#_leftBox'); // 左侧盒子 var _tool = document.querySelector('#_tool'); // 小黄盒子 var _rightBox = document.querySelector('#_rightBox'); // 右侧盒子 var _bImg = document.querySelector('#_bImg'); // 右侧盒子中的大图片 var _hqsrc = document.querySelector('#hqsrc'); // 左侧盒子中的图片 //【功能1:鼠标进入/离开左侧盒子显示/隐藏小黄和右侧盒子】 // 1. 给_leftBox注册鼠标进入事件 onmouseenter _leftBox.onmouseenter = function () { // 1.1 显示小黄盒子,给小黄盒子添加类名 active _tool.className = 'tool active'; // 1.2 显示右侧盒子,给右侧盒子添加类名 active _rightBox.className = 'rightBox active'; // 以下两行是计算右侧盒子内图片的宽高 _bImg.style.width=((parseInt(_leftBox.clientWidth))/(parseInt(_tool.clientWidth))*100) + '%'; _bImg.style.height=((parseInt(_leftBox.clientHeight))/(parseInt(_tool.clientHeight))*100) + '%'; // 获取左侧图片路径后赋值给右侧大图片 如果左侧有多张小图片 请将获取的ID改成class,然否使用for循环,不会的去社会猿提问,我会在答案区留下demo,地址:www.shehuiyuan.com _bImg.src=_hqsrc.src; } // 2. 给_leftBox注册鼠标离开事件 onmouseleave _leftBox.onmouseleave = function () { // 2.1 显示小黄盒子,给小黄盒子去除类名 active _tool.className = 'tool'; // 2.2 显示右侧盒子,给右侧盒子去除类名 active _rightBox.className = 'rightBox'; } //【功能2:鼠标在左侧区域移动时,控制小黄和右侧盒子中图片的位置】 // 1. 给左侧盒子注册鼠标移动事件 onmosuemove _leftBox.onmousemove = function (e) { // 2. 通过事件对象获取鼠标相对元素的位置(x,y) var x = e.clientX - _leftBox.offsetLeft- _tool.offsetWidth/2; var y = e.clientY - _leftBox.offsetTop - _tool.offsetHeight/2; // 这里给x和y赋值时,不要用事件对象的offsetX和offsetY。 // 原因:因为【事件冒泡】,鼠标在移动时,有时会移动到小黄盒子上。若移动到小黄盒子上时,获取的值不是相对于左侧盒子元素,而是相对小黄盒子元素。所以当鼠标进入或离开小黄时,获取的坐标值时大时小,导致小黄盒子上下左右波动。 // 解决方案:在小黄移动事件中,停止冒泡。但是鼠标在移动时,就没有效果了。 // 最终解决方案:放弃使用事件对象offsetX/Y。 选择事件对象的clienX/Y 结合左侧盒子的位置计算出正确的位置。 // 2.1 对x和y限制 if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (x > _leftBox.offsetWidth - _tool.offsetWidth) { x = _leftBox.offsetWidth - _tool.offsetWidth; } if (y > _leftBox.offsetHeight - _tool.offsetHeight) { y = _leftBox.offsetHeight - _tool.offsetHeight; } // 3. 把计算好的位置 赋值给小黄 _tool.style.left = x + 'px'; _tool.style.top = y + 'px'; // 4. 设定右侧大图片的位置(设置的方向是相反的,比例关系是1:2) _bImg.style.left = -2 * x + 'px'; _bImg.style.top = -2 * y + 'px'; } </script> </body> </html>
效果:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!