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

 效果图:

HTML结构如下:

<div id="preview">
                    <div id="mediumDiv">
                        <img id="mImg" src="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="images\products\product-s1.jpg" /></li>
                                <li><img src="images\products\product-s2.jpg" /></li>
                                <li><img src="images\products\product-s3.jpg" /></li>
                                <li><img src="images\products\product-s4.jpg" /></li>
                                <li><img src="images\products\product-s1.jpg" /></li>
                                <li><img src="images\products\product-s2.jpg" /></li>
                                <li><img src="images\products\product-s3.jpg" /></li>
                                <li><img src="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";
    }    
时间: 2024-12-28 11:14:16

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

js的FileReader实现图片文件上传、预览

js的FileReader实现图片文件上传.预览 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Data URL的好处是,您不需要额外再发出一个HTTP 请求到服务器端取得额外的资料:而缺点便是,网页的大小可能会变大.它适合应用在内嵌小图片,不建议将大图像文件编码成Data URL来使用.您的图像文件不能够超过浏览器限定的大小,否则无法读取图像文件.1

js 实现全屏预览(F11功能)--转

js代码 1 function fullScreen(el) { 2 var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullScreen, 3 wscript; 4 5 if(typeof rfs != "undefined" && rfs) { 6 rfs.call(el); 7 return; 8 } 9 1

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

需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网  http://viewerjs.org/ 使用PDFJS,官网  https://mozilla.github.io/pdf.js/ 结论: 通过研究发现,Viewer JS预览pdf文件,其pdf文件只能url地址,不支持获取文件流到客户端,生成blob地址预览.而PDFJS能够支持 代码实践: <div class="modal inmodal fade" id="previewMod

js单线程和js异步操作的几种方法

一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM. 这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 单线程就意味着,所有任务需要排队,前一个任务结束,才会执

js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > .katex-html { display: block; } .katex-display > .katex > .katex-html > .tag { position: absolute; right: 0px; } .katex { font-style: normal; font

原生js上传 加预览 兼容ie

前提条件: ie浏览器模式下,用户要允许ie默认的加载项:以下兼容ie的方法才会生效 *********************************************************************** /*图片上传预览 IE是用了滤镜*/ function previewImage(file) { var MAXWIDTH = 60; var MAXHEIGHT = 60; var div = document.getElementById('preview'); i

兼容好的JS图片上传预览代码

在上传图片前预览图片的功能,可提高你网站的用户体验,让用户清楚所要上传的图片是不是选对了.本代码无JS插件,纯JavaScript结合HTML来实现,是一个很不错的例子,比较完整: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&

面向对象的js编程 Call和apply方法

JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj  可选项.将被用作当前对象的对象. arg1, arg2,  , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.  

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函