jqzoom源码解读 2

下面是对上一篇之前的部分补充:(可以直接略过)


el打印出来为链接 实质为

Lens(英文名字也即是 透镜的意思 则其方法的作用就会显而易见了)
this.append 也即是在zoomPad上添加zoomPup

这里包括上面选取的元素都没有,这是为什么了 很显然这会和该方法生效的时间有关系的
el.scale.y
 $('<div/>').addClass('zoomPup');

this. node. = ( parseInt((settings. zoomWidth) / el. scale. x) > smallimage. ) ? smallimage. : ( parseInt(settings. zoomWidth / el. scale. x)) ;

也即是表明如果遮罩的高度大于图片的高度则则 遮罩的高度为图片的高度 否者为遮罩的高度

this. node. top = (smallimage. oh this. node. 2) /  2 ;
console. log( "smallimage.oh : "+smallimage. oh+ " this.node.h : "+ this. node. h) ;
this. node. left = (smallimage. ow this. node. 2) /  2 ;



至于this.node.top与this.node.lef究竟的作用有点奇怪

setcenter中
this. node. top = (smallimage. oh this. node. 2) /  2 ;
this. node. left = (smallimage. ow this. node. 2) /  2 ;

说实际点 就是 图片的高度加上border组成了oh  -遮罩的高度-border



在setposition 中
e.pageX/Y也即是获取鼠标的位置
      接下来是4个判断over的函数 注意此时的鼠标的位置灵活性 肯定是可以小于该参数的 当它正好与边相切的时候也就是正好的完成了 
注意坐标点是从左上角开始的


鼠标往右边滑动的时候是  往显示的是往左边进行滑动的 

stage是相对image来说的

$( '<div/>'). addClass( 'zoomPad') ;


  $("<div/>")表示生成一个div标签 但必须有添加的位置 获得div标签
此时是否需要该标签 待定 但是需要添加类 所以使用上面的方法来说更加好一点

el. zoomPad = $( '<div/>'). addClass( 'zoomPad') ;
img. wrap(el. zoomPad) ;

$( "body"). append( $( "<div></div>")) ;







在调用newjazoom之前获得this 也即是元素结点(1) a


可以看到最先生成的属性在的位置(将obj设置成全局的变量后 输出obj)

输出obj

在el中点开或


imgtitle




bind事件






     正式开始》



接下来主要讲解extend的分析:
if ($( ". zoomPad " el). length ==  0) {
    el. zoomPad = $( '<div/>'). addClass( 'zoomPad') ;
    img. wrap(el. zoomPad) ;
}

 如果el下(a)没有zoomPad类则 也即是所有该类的个数为0  则创建一个div且类名额外zoomPad的元素  之后经img放在里面

if ($( ".zoomPup" el). length ==  0) {
    lens. append() ;
}
如果没有zoomPup则创建  这里用的是lens.append() 
this. append function () {
    $( '.zoomPad' el). append($( this. node). hide()) ;
    if (settings. zoomType ==  'reverse') {
        this. image new  Image() ;
        this. image. src = smallimage. node. src // fires off async
        $( this. node). empty(). append( this. image) ;
    }
} ;


也即是创建zoomPup添加到zoomPad中     reverse的情况暂时不考虑

 zoomPad 
      -img
      -zoomPup

同样的
if ($( ".zoomWindow" el). length ==  0) {
    stage. append() ;
}
//creating Preload
if ($( ".zoomPreload" el). length ==  0) {
    loader. append() ;
}

function  Stage() {
    var $obj =  this ;
    this. node = $( "<div class='zoomWindow'><div class='zoomWrapper'><div class='zoomWrapperTitle'></div><div class='zoomWrapperImage'></div></div></div>") ;

stage




总共有8行现在我们来分析每一行


1. 主要是将zoomWindow zoomWrapper zoomWrappTitle zoomWrapImage等加入zoomPad中

此时的基本层次结构如下
zoomPad
    -img
    -zoomPup
    -zoomWindow
       -zoomWrapper
           -zoomWrapperTitle
            -zoomWraperImage
       

2.添加样式
zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
       -zoomWrapper
           -zoomWrapperTitle
            -zoomWraperImage


3.暂时不论
4.

zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
       -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
           -zoomWrapperTitle
            -zoomWraperImage

5

zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
       -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
           -zoomWrapperTitle
            -zoomWraperImage (width:100% ,height: settings.zoomHeight)

6
zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
       -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
           -zoomWrapperTitle (width:100% position:absolute)   hide()
            -zoomWraperImage (width:100% ,height: settings.zoomHeight)
7.
if (settings. title && zoomtitle. length 0) {
    $( '.zoomWrapperTitle' this. node). html(zoomtitle). show() ;
}


zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
       -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
           -zoomWrapperTitle (width:100% position:absolute)   hide()---》zoomtitle  show()
            -zoomWraperImage (width:100% ,height: settings.zoomHeight)

8.
$obj. setposition() ;
此时的obj也即是该stage下的setposition方法


依然对innerzoom的情况暂时不考虑 总体的在5大行
加起来一个意思也即是对其样式 left top进行了设置
stage:

this.node.leftpos
this.node.toppos


回到create中 stage.append    添加了zoomWindow等一大类的东西在里面  并设置了其left和top为0


function  Loader() {
    var $obj =  this ;
    this. append function () {
        this. node = $( '<div/>'). addClass( 'zoomPreload'). css( 'visibility' 'hidden'). html(settings. preloadText) ;
        $( '.zoomPad' el). append( this. node) ;
    } ;


接下来为loader.append()
 也即是添加了zoomPreload 
zoomPad
    -img
    -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
        -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
            -zoomWrapperTitle (width:100% position:absolute)   hide()---》zoomtitle  show()
             -zoomWraperImage (width:100% ,height: settings.zoomHeight)
      -zoomPreload   (visibility:hidden   html setting.preloadText)

 
preloadText'Loading zoom' ,


接下来:
if (settings. preloadImages || settings. zoomType ==  'drag' || settings. alwaysOn) {
    obj. load() ;
}

default中默认如下:
zoomType'standard' ,
preloadImagestrue ,
alwaysOnfalse ,

也即是默认情况下为true,主要精力将放在load函数中


loadfunction () {
    if (el. largeimageloaded ==  false && el. largeimageloading ==  false) {
        var url = $(el). attr( 'href') ;
        el. largeimageloading true ;
        largeimage. loadimage(url) ;
    }
} ,



el. largeimageloading false //tell us if large image is loading
el. largeimageloaded false //tell us if large image is loaded

默认会执行
代码中获得大图片的链接 加载图片 更改zoomloading 为true





largeimage. loadimage(url) ;


function  Largeimage() {
    var $obj =  this ;
    this. node new  Image() ;
    this. loadimage function ( url) {
        //showing preload
        loader. show() ;
        this. url url ;
        this. node. style. position 'absolute' ;
        this. node. style. border '0px' ;
        this. node. style. display 'none' ;
        this. node. style. left '-5000px' ;
        this. node. style. top '0px' ;
        document. body. appendChild( this. node) ;
        this. node. src url // fires off async
    } ;






其中有
loader. show() ;


this. show function () {
    this. node. top = (smallimage. oh this. node. height()) /  2 ;
    this. node. left = (smallimage. ow this. node. width()) /  2 ;
    //setting position
    this. node. css({
        topthis. node. top ,
        leftthis. node. left ,
        position'absolute' ,
        visibility'visible'
    }) ;
} ;

设置zoomPreload的位置(大约在小图片中间的位置)

然后show()也即是其字体会显示










largeimage

this.url
this.node.style.position    absolute  
this.node.style.border          0
this.nonde.style.display        
this.nonde.style.left
this.nonde.style.top

注意此时在largeimage中的onload中在图片加载完后会触发



this. node.onload =  function () {
    //fetching data
    $obj. fetchdata() ;
    loader. hide() ;
    el. largeimageloading false ;
    el. largeimageloaded true ;
    if (settings. zoomType ==  'drag' || settings. alwaysOn) {
        lens. show() ;
        stage. show() ;
        lens. setcenter() ;
    }
} ;

$obj. fetchdata() ;

也即是在largeimage中的该函数



        
this. fetchdata function () {
    var image = $( this. node) ;
    var scale = {} ;
    this. node. style. display 'block' ;
    $obj. = image. width() ;
    $obj. = image. height() ;
    $obj. pos = image. offset() ;
    $obj. pos. = image. offset(). left ;
    $obj. pos. = image. offset(). top ;
    $obj. pos. = $obj. + $obj. pos. l ;
    $obj. pos. = $obj. + $obj. pos. t ;
    scale. = ($obj. / smallimage. w) ;
    scale. = ($obj. / smallimage. h) ;
    el. scale = scale ;
    document. body. removeChild( this. node) ;
    $( '.zoomWrapperImage' el). empty(). append( this. node) ;
    //setting lens dimensions;
    lens. setdimensions() ;
} ;


以上均为获取大图片的一些参数

scale. = ($obj. / smallimage. w) ;
scale. = ($obj. / smallimage. h) ;

缩放比例如上

$( '.zoomWrapperImage' el). empty(). append( this. node) ;

在zoomWrapperImage上添加上该节点,在body上移除该节点 主要是为了加载图片的方便(放在body)



lens. setdimensions() ;




也即是设置zoomPup的样式
 当图片大于300px(width/Height)的时候,以小图片的宽高为基准  否则以300px为基准,因为之前会传入option参数在使用该插件的时候 可以自己设置
this. node. css({
    top0 ,
    left0 ,
    widththis. node. 'px' ,
    heightthis. node. 'px' ,
    position'absolute' ,
    display'none' ,
    borderWidth'px'
}) ;

也即是将遮罩的大小位置进行的设定
 回到 perLoader已做完(onload)此时 loader.hide()
el. largeimageloading false ;
el. largeimageloaded true ;

设置loading与loaded




if (settings. zoomType ==  'drag' || settings. alwaysOn) {
    lens. show() ;
    stage. show() ;
    lens. setcenter() ;
}
alwaysOnfalse ,


也即是默认情况下不会,暂时放下



综合上也即是大图片的样式
-a   (absoulte boder:0 display:none left:-500px top:0)
  -zoomPad
      -img
      -zoomPup
    -zoomWindow   (position:absoulte  display:none    z-index:5001)
         -zoomWrapper   (width :Math,round(setting,.zoomWidth)  borderWidth:thickness)
             -zoomWrapperTitle (width:100% position:absolute)   hide()---》zoomtitle  show()
             -zoomWraperImage (width:100% ,height: settings.zoomHeight)
     -zoomPreload   (visibility:hidden   html setting.preloadText)

然后再document上加入该节点

obj. init() ;


create里面的init()



依然不考虑zoomType的其他情况


$( ".zoomPad" el). bind( 'mouseenter mouseover' function (event) {
    img. attr( 'title' '') ;
    $(el). attr( 'title' '') ;
    el. zoom_active true ;
    //if loaded then activate else load large image
    smallimage. fetchdata() ;
    if (el. largeimageloaded) {
        obj. activate(event) ;
   else {
        obj. load() ;
    }
}) ;


在zoomPad绑定鼠标进入/over的事件

img. attr( 'title' '') ;
$(el). attr( 'title' '') ;
el. zoom_active true ;

清空title将active设置成true

然后:
smallimage. fetchdata() ;
也即是初始化的时候获得图片的位置

由上面克制preloader的时候上面的loaded参数已经修改
obj. activate(event) ;



activatefunction (e) {
    clearTimeout(el. timer) ;
    //show lens and zoomWindow
    lens. show() ;
    stage. show() ;
} ,

也即是当鼠标进入的时候激活 lens和大图片,之前清除延时


if (settings. zoomType !=  'innerzoom' && (settings. lens || settings. zoomType ==  'drag')) {
    this. node. show() ;
}

也即是显示遮罩

this. show function () {
    switch (settings. showEffect) {
        case  'fadein':
            this. node. fadeIn() ;
            this. node. fadeIn(settings. fadeinSpeed function () {}) ;
            break ;
        default:
            this. node. show() ;
            break ;
    }


showEffect'show' ,
//show/fadein


默认为show (default) 为fadein的时候 要 fadeinSpeed 



也即是大图片预先加载后均显示,没有则继续加载



$( ".zoomPad" el). bind( 'mouseleave' function (event) {
    obj. deactivate() ;
}) ;


mouseover--mouseout
mouseenter---mouseleave(两者在于是否穿过元素)

也即是鼠标不在zoomPad的时候

deactivate: function (e) {
    switch (settings.zoomType) {
        case 'drag':
            //nothing or lens.setcenter();
            break;
        default:
            img.attr('title', el.imagetitle);
            $(el).attr('title', el.title);
            if (settings.alwaysOn) {
                lens.setcenter();
            } else {
                stage.hide();
                lens.hide();
            }
            break;
    }
    el.zoom_active = false;
},



this. node. left = (smallimage. ow this. node. width()) /  2 ;
也即是表示他要距离左边移动的距离



最后下面的这句的经典的开始 img【0】也即是小图片加载完成
if (img[0].complete) {
    //fetching data from sallimage if was previously loaded
    smallimage.fetchdata();
    if ($(".zoomPad", el).length == 0) obj.create();
}



文章只是总体略读了该插件,,有很多不足之处 ,对于平移的细节等以后将陆续更新!
YcUstc













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值