JS面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能
效果图:

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面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能的更多相关文章
- js基础进阶--图片上传时实现本地预览功能的原理
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...
- riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法
基本要求 一个riot标签,就是展现和逻辑的组合(也就是html和JS): 以下是编写riot标签最基本的规则: 先撰写HTML,再撰写JS,JS代码可以写在<script>标签内部,但这 ...
- 通过修改ajaxFileUpload.js实现多图片动态上传并实现预览
参考:http://smotive.iteye.com/blog/1903606 大部分我也是根据他的方法修改的,我也要根据name实现动态的多文件上传功能,但是有个问题使我一直无法实现多文件上传. ...
- 最好用的js前端框架、组件、文档在线预览插件
这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...
- JS通过使用PDFJS实现基于文件流的预览功能
需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网 http://viewerjs.org/ 使用PDFJS,官网 https://mozilla.github.io/ ...
- JS微信网页使用图片预览(放大缩小)
前言 需求在微信网页中客户点击图片可进行预览放大缩小功能,网上找了各种js方式实现, 唯一的麻烦就是不兼容或者和项目框架不兼容 次函数只只用于部分客户端,否则会出现 WeixinJSBridge is ...
- 4.2 面向对象分析(二) CRC方法标识概念类
CRC 又称为CRC索引卡片:CRC card 每张卡片代表一个类 Each card represents one class 每张卡片上写出这个类承担的职责.与其合作交互的其他类名 ...
- node.js实现国标GB28181流媒体点播(即实时预览)服务解决方案
背景 28181协议全称为GB/T28181<安全防范视频监控联网系统信息传输.交换.控制技术要求>,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100 ...
- Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)
介绍完FTP协议后,来看看该软件完成后的效果图 客户端的主界面如上图所示,主要是分为以下几个界面: 数据输入界面:用来让用户输入服务器的地址,用户名,密码,端口号等. 站点菜单.本地菜单.远程菜单以及 ...
随机推荐
- javascript面向对象技术基础总结
javascript面向对象和php不太一样,语法不太相同,总结如下 //cat 对象 function Cat(name,color){ this.name = name;//不确定的成员属性 th ...
- Windows窗口程序从创建到关闭产生的消息
Windows是消息驱动的,理解消息机制及消息循环是特别重要.知道在什么情况下产生什么消息会让我们对程序有更好的控制.Windows给应用程序发消息,有些会加入应用程序的消息队列,也是就是队列消息.有 ...
- Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem —— 贪心
题目链接:http://codeforces.com/contest/761/problem/D D. Dasha and Very Difficult Problem time limit per ...
- Linux常用命令之scp
目录 1.拷贝远程文件到本地 2.拷贝远程文件夹到本地 3.拷贝本地文件到远程 4.拷贝本地文件夹到远程 1.拷贝远程文件到本地 scp root@101.132.169.194:/home/wwwr ...
- double转int时精度不一致问题
float和double类型的主要设计目的是为了科学计算和工程计算.它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该 ...
- 用php描述二分查找法
//二分查找 $arr = array(0,1,2,3,4,5,6,7,8,9); function bin_sch($array, $low, $high, $k){ if ($low <= ...
- linux系统CentOS6.5下tokudb数据库引擎的安装
tokuDB是一个关于mysql数据引擎的开源项目,官网对其特点的描述主要有三点: 1.高压缩比,官方宣称可以达到1:12. 2.高insert性能,官方称至少比innodb高9倍. 3.可以在线添加 ...
- hdu-5776 sum(同余)
题目链接: sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Pro ...
- 并不对劲的loj3049:p5284:[十二省联考]字符串问题
题目大意 给出字符串\(S(|S|\leq2\times10^5)\), \(na(na\leq2\times 10^5)\)个区间\([l_i,r_i]\)表示\(S_{l_i},S_{l_i+1} ...
- SqlSession