效果图:

HTML结构如下:

<div id="preview">
<div id="mediumDiv">
<img id="mImg" src="data:images/products/product-s1-m.jpg"/>
<div id="mask"></div>
<div id="superMask"></div>
</div>
<div id="largeDiv"></div>
<h1>
<a class="backward_disabled"></a>
<a class="forward"></a>
<ul id="icon_list">
<li><img src="data:images\products\product-s1.jpg" /></li>
<li><img src="data:images\products\product-s2.jpg" /></li>
<li><img src="data:images\products\product-s3.jpg" /></li>
<li><img src="data:images\products\product-s4.jpg" /></li>
<li><img src="data:images\products\product-s1.jpg" /></li>
<li><img src="data:images\products\product-s2.jpg" /></li>
<li><img src="data:images\products\product-s3.jpg" /></li>
<li><img src="data:images\products\product-s4.jpg" /></li>
</ul>
</h1>
</div>

JS部分:

var pPhoto = {
LIWIDTH : 62, //每个小图片的li的固定宽度
moved : 0, //记录左移小图片的个数
count : 0, //记录小图片的总数
ul: null, //小图父元素ul
btnL: null, //左边按钮 控制右移
btnR : null,
superMark :null,
SUPERWIDTH : 350, //supermask的宽高
SUPERHEIGHT :350,
MASKWIDTH:175, //遮罩层mask的宽高
MASKHEIGHT:175,
inti : function (){ //初始化方法
this.ul = $("#icon_list")[0];
this.ul.onmouseover =this.changeMImg;
this.btnL = this.ul.parentNode.$("a")[0];
this.btnR = this.ul.parentNode.$("a")[1];
this.btnR.onclick=this.btnL.onclick=function () {
pPhoto.move(this); //将btn通过此时的this作为参数传入 move方法
//将move的this指向pPhoto对象
};
this.count = this.ul.$("li").length;
//图片放大效果遮罩层
this.supermask = $("#superMask")[0];
this.supermask.onmouseover=this.supermask.onmouseout=this.showMask;
this.supermask.onmousemove = function(){
var e = window.event || arguments[0];
pPhoto.zoom(e);
}
},
move : function (btn){//移动方法
if(!btn.className.endsWith("_disabled")) {
if (btn == this.btnR) { //判断当前btn的左右
this.ul.style.left = -(this.LIWIDTH * (++this.moved) - 20) + "px";
//-20 根据css原left属性进行修正
} else {
this.ul.style.left = -(this.LIWIDTH * (--this.moved) - 20) + "px";
}
this.btnEnable();
}
},
btnEnable : function (){//修改按钮状态方法 this-->pPhoto
if(this.moved==0){
this.btnL.className+="_disabled";
}else if(this.count-this.moved==5){
this.btnR.className+="_disabled";
}else{
this.btnL.className=this.btnL.className.replace("_disabled","");
//replace()方法并不能直接修改calssname的属性值 需要重新赋值
this.btnR.className=this.btnR.className.replace("_disabled","");
}
},
changeMImg :function (){ //this-->ul
//获取事件对象
var e = window.event || arguments[0];
//获取目标对象
var src=e.srcElemnt||e.target;
if(src.nodeName=="IMG"){
var path = src.src;
var i = path.lastIndexOf(".");
$("#mImg")[0].src=path.slice(0,i)+"-m"+path.slice(i);
}
},
showMask : function(){
var mask = $("#mask")[0];
var style = getComputedStyle(mask);
var largeDiv = $("#largeDiv")[0];
largeDiv.style.display=mask.style.display=style.display=="none"?"block":"none";
if(largeDiv.style.display=="block"){
var path = $("#mImg")[0].src;
var i=path.lastIndexOf(".");
$("#largeDiv")[0].style.backgroundImage="url('"+path.slice(0,i-1)+"l"+path.slice(i)+"')";
}
},
zoom :function (e){
var x=e.offsetX
var y=e.offsetY;
var mLeft = x-this.MASKWIDTH/2;
var mTop = y-this.MASKHEIGHT/2;
mLeft<0 && (mLeft=0);
mLeft>this.SUPERWIDTH-this.MASKWIDTH && (mLeft=this.SUPERWIDTH-this.MASKWIDTH);
mTop<0 && (mTop=0);
mTop>this.SUPERHEIGHT-this.MASKHEIGHT &&(mTop=this.SUPERHEIGHT-this.MASKHEIGHT);
var mask = $("#mask")[0];
mask.style.left=mLeft+"px";
mask.style.top=mTop+"px";
var largeDiv = $("#largeDiv")[0]
largeDiv.style.backgroundPosition=-mTop*2+"px "+-mLeft*2+"px";
}
}

Tips

  *面向对象方法在编写页面中某一块交互功能时,能有效的避免因代码过多而造成的变量污染,更有助于代码的可读性和重用性。

  *this 很好很强大 在面向对象方法中如果需要指定this的指向可以使用以下方法:

this.btnR.onclick=this.btnL.onclick=function () {
pPhoto.move(this); //将btn通过此时的this作为参数传入 move方法
//将move的this指向pPhoto对象
};

  *事件对象e 只能在事件绑定函数中获得 :

 this.supermask.onmousemove = function(){
var e = window.event || arguments[0];
//获取事件对象e 作为参数传递给 放大方法zoom;
pPhoto.zoom(e);
}
zoom :function (e){ //zoom函数类无法获得 sueromask元素的事件对象e
var x=e.offsetX
var y=e.offsetY;
var mLeft = x-this.MASKWIDTH/2;
var mTop = y-this.MASKHEIGHT/2;
mLeft<0 && (mLeft=0);
mLeft>this.SUPERWIDTH-this.MASKWIDTH && (mLeft=this.SUPERWIDTH-this.MASKWIDTH);
mTop<0 && (mTop=0);
mTop>this.SUPERHEIGHT-this.MASKHEIGHT &&(mTop=this.SUPERHEIGHT-this.MASKHEIGHT);
var mask = $("#mask")[0];
mask.style.left=mLeft+"px";
mask.style.top=mTop+"px";
var largeDiv = $("#largeDiv")[0]
largeDiv.style.backgroundPosition=-mTop*2+"px "+-mLeft*2+"px";
}

JS面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能的更多相关文章

  1. js基础进阶--图片上传时实现本地预览功能的原理

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...

  2. riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法

    基本要求 一个riot标签,就是展现和逻辑的组合(也就是html和JS): 以下是编写riot标签最基本的规则: 先撰写HTML,再撰写JS,JS代码可以写在<script>标签内部,但这 ...

  3. 通过修改ajaxFileUpload.js实现多图片动态上传并实现预览

    参考:http://smotive.iteye.com/blog/1903606 大部分我也是根据他的方法修改的,我也要根据name实现动态的多文件上传功能,但是有个问题使我一直无法实现多文件上传. ...

  4. 最好用的js前端框架、组件、文档在线预览插件

    这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...

  5. JS通过使用PDFJS实现基于文件流的预览功能

    需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网  http://viewerjs.org/ 使用PDFJS,官网  https://mozilla.github.io/ ...

  6. JS微信网页使用图片预览(放大缩小)

    前言 需求在微信网页中客户点击图片可进行预览放大缩小功能,网上找了各种js方式实现, 唯一的麻烦就是不兼容或者和项目框架不兼容 次函数只只用于部分客户端,否则会出现 WeixinJSBridge is ...

  7. 4.2 面向对象分析(二) CRC方法标识概念类

    CRC  又称为CRC索引卡片:CRC card  每张卡片代表一个类 Each card represents one class  每张卡片上写出这个类承担的职责.与其合作交互的其他类名   ...

  8. node.js实现国标GB28181流媒体点播(即实时预览)服务解决方案

    背景 28181协议全称为GB/T28181<安全防范视频监控联网系统信息传输.交换.控制技术要求>,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100 ...

  9. Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)

    介绍完FTP协议后,来看看该软件完成后的效果图 客户端的主界面如上图所示,主要是分为以下几个界面: 数据输入界面:用来让用户输入服务器的地址,用户名,密码,端口号等. 站点菜单.本地菜单.远程菜单以及 ...

随机推荐

  1. 03-树1 树的同构(25 point(s)) 【Tree】

    03-树1 树的同构(25 point(s)) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为 ...

  2. alsa 编程

    ALSA(Advanced Linux Sound Architecture)是由内核驱动,标准的API库和一系列实用程序组成.因为涉及到版权和BUG的问题Linux 2.6内核抛弃了旧的OSS,AL ...

  3. [RK3288][Android6.0] 调试笔记 --- 软硬键盘同时使用【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/78748313 Platform: RK3288 OS: Android 6.0 Kernel ...

  4. 最全的Android源码目录结构详解【转】

    本文转载自:http://blog.csdn.net/yangwen123/article/details/8055025 Android 2.1|-- Makefile|-- bionic     ...

  5. html5--3.5 input元素(4)

    html5--3.5 input元素(4) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  6. 提高scroll性能

    在DevTools中开始渲染,向下滑动一点点滚动条,然后停止滚动. 在结果中,注意frames总是在30ftps线上面,甚至都木有很接近69ftps线的(事实上帧执行的太缓慢以致于60ftps线在图上 ...

  7. LaTeX常用的符号

    推荐新手使用的网站:http://latex.codecogs.com/eqneditor/editor.php \(\sum _{d|n}{u(d)F(\frac{n}{d})}\) \sum _{ ...

  8. 数学题--On Sum of Fractions

    题目链接 题目意思: 定义v(n)是不超过n的最大素数, u(n)是大于n的最小素数. 以分数形式"p/q"输出 sigma(i = 2 to n) (1 / (v(i)*u(i) ...

  9. 洛谷 P1509 找啊找啊找GF(复习二维费用背包)

    传送门 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sq ...

  10. Python使用multiprocessing实现一个最简单的分布式作业调度系统

    Python使用multiprocessing实现一个最简单的分布式作业调度系统介绍Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机 ...