[toc]
![](https://box.kancloud.cn/9dbb84566690f66bd14bb7dc1f676b47_613x323.png)
![](https://box.kancloud.cn/2534158207aca90ff9ee0e3eb58e3d6e_550x255.png)
## 放大镜原理
我们的mark横向是box的一半,纵向也是box的一半,那么右侧的大图横向(纵向)都应该是左侧小图的一倍
```
body,div,img{
margin:0;
padding:0
}
img{
display:block;
border:none;
}
#box{
position:absolute;
top:20px;
left:20px;
width:350px;
height:350px;
box-shadow:3px 3px 10px 0 #111111;
}
#box img{
width:100%;
height:100%;
}
#mark{
display:none;
position:absolute;
top:0;
left:0;
width:175px;
height:175px;
background:#000;
opacity:.5;
filter:alpha(opacity=50);
cursor:move;
border-radius:50%;
}
#boxRight{
position:absolute;
top:20px;
left:380px;
width:350px;
height:350px;
overflow:hidden;
border-radius:50%;
}
/* 我们右侧图片的大小是需要严格计算的:mark的width是box的width的一半,那么我们的大图宽度也应该是小图的2倍 */
#boxRight img{
position:absolute;
top:0;
left:0;
width:200%;
height:200%;
display:none;
}
```
```
<div id="box">
<img src="img/iphone.jpg"/>
<div id="mark"></div>
</div>
<div id="boxRight">
<img src="img/iphone_big.jpg"/>
</div>
```
```
var box = document.getElementById("box"),mark=document.getELementById("mark");
var boxRight = document.getElementById("boxRight");
//->设置mark这个盒子的位置信息
function setPosition(e){
//->正常情况下我们获取的top/left
var top = e.clientY - box.offsetTop - (mark.offsetHeight/2);
var left = e.clientX - box.offsetLeft - (mark.offsetWidth/2
//->需要做边界判断
var minL = 0,minT = 0,maxL = box.offsetWidth - mark.offsetWidth,maxT = box.offsetHeight - mark.offsetHeight;
if(left<minL){
mark.style.left = minL + 'px';
tempL = minL;
}else if(left>maxL){
mark.style.left = maxL + 'px';
tempL = maxL;
}else{
mark.style.left = left + 'px';
tempL = left;
}
if(top<minT){
mark.style.top = minT + 'px';
tempT = minT;
}else if(left>maxT){
mark.style.top = maxT + 'px';
tempT = maxT;
}else{
mark.style.top = top + 'px';
tempT = top;
}
//->让右侧的图片跟着动;左侧移动多少,右侧的大图正好移动它的两倍即可。
var oImg = boxRight.getElementsByTagName("img")[0];
oImg.style.left = -tempL*2 + 'px';
oImg.style.top = -tempT*2 + 'px';
}
box.onmouseenter = function(){
e = e||window.event;
mark.style.display = "block";
boxRight.style.display = "block";
};
var tempL = 0,tempT = 0;
box.onmouseleave = function(e){
e = e || window.event;
mark.style.display = "none";
boxRight.style.display = "none";
}
```
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历