• 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";
        }    
  • 相关阅读:
    MySQL学习——操作表
    MySQL学习——数据类型
    MySQL学习——操作数据库
    MySQL学习——存储引擎
    Linux网络——配置防火墙的相关命令
    查询各分类中最大自增ID
    CentOS7下Rsync+sersync实现数据实时同步
    mysql的join连接查询优化经历
    搭建nginx代理支持前端页面跨域调用接口
    Centos查看系统CPU个数、核心数、线程数
  • 原文地址:https://www.cnblogs.com/sunyaaa/p/6711524.html
Copyright © 2020-2023  润新知