コードをコピー コードは次のとおりです。
var ImageZoom = function(image, viewer, options) {
this._initialize( image, viewer, options );
this._initMode( this.options.mode ); ._oninit();
this._initLoad();
}
//Initializer
_initialize: function(image, viewer, options) {
this._image = $$(image);//元画像
this._zoom = document.createElement("img");//表示画像
this._viewer = $$(viewer);//表示box
this._viewerWidth = 0;//表示ボックスの幅
this._viewerHeight = 0;//表示ボックスの高さ
this._preload = new Image();//オブジェクトをプリロード
this. _rect = null;//元画像の座標
this._repairLeft = 0;//表示画像のx座標補正
this._repairTop = 0;//表示画像のy座標補正
this._rangeWidth = 0; //表示範囲の幅
this._rangeHeight = 0;//表示範囲の高さ
this._timer = null;//タイマー
this._loaded = false;//ロードするかどうか
this. _substitute = false;//
var opt = this._setOptions(options);
this._max = opt.max; = opt.min;
this._originPic = opt.zoomPic;
this._rangeHeight = opt.rangeHeight; 🎜>this.late = opt.late;
this.autoHide = opt.mouse;
this.rate = opt.rate; opt.onLoad;
this.onStart = opt.onStart;
this.onEnd = opt.onEnd;
this = this, END = function( ) { oThis._end() };
this._END = function(){ oThis._timer = setTimeout( END, oThis.delay ) };
this._START = $$F.bindAsEventListener( this . _start, this );
this._MOVE = $$F.bindAsEventListener( this._move, this );
this._MOUSE = $$F.bindAsEventListener( this._mouse, this ); _OUT = $$F.bindAsEventListener( function(e){
if ( !e.popularTarget ) this._END();
}, this ),
//デフォルトを設定します属性
_setOptions: function(options) {
this.options = {//デフォルト値
mode: "simple",//Mode
scale: 0,//Scale (大きい画像/オリジナル)画像)
max: 10,//最大比率
min: 1.5,//最小比率
originPic: "",//元の画像アドレス
zoomPic: "",//大きい画像アドレス
rangeWidth: 0,//表示範囲の幅
rangeHeight:0,//表示範囲の高さ
delay: 20,//遅延終了時間
autoHide: true,//自動的に非表示にするかどうか
mouse: false,//マウス スケーリング
rate: .2,//マウス スケーリング率
onLoad: $$.emptyFunction,//ロード完了時に実行
onStart: $$.emptyFunction, // ズームイン時に実行
onMove: $$.emptyFunction, // ズームインと移動時に実行
onEnd: $$.emptyFunction// ズームイン終了時に実行
}; $.extend(this .options, options || {});
},
//モードに従って関数属性を初期化します
_initMode: function(mode) {
mode = $$.extend ({
オプション :{},
init: $$.emptyFunction,
load: $$.emptyFunction,
start: $$.emptyFunction,
end: $$.emptyFunction,
move: $ $.emptyFunction,
dispose:$$.emptyFunction
}, (ImageZoom._MODE || {})[mode.toLowerCase() ] ||
this .options = $$.extend(mode.options, this.options );
this._onload = mode.start;
this._onend = mode.end;
this._onmove = mode.move;
this._ondispose = mode.dispose;
//初期ロード
_initLoad: function() {
var image = this._image,originPic = this._originPic,
useOrigin = !this._zoomPic && this._scale,
loadImage = $$F.bind( useOrigin ? this._loadOriginImage : this._loadImage, this );
//自動非表示を設定します
if ( this.autoHide ) { this._viewer.style.display = "none" }
// 最初に元の画像を読み込みます
if (originPic && OriginPic != image.src ) {//カスタム アドレスを使用します
image.onload =loadImage;
image.src =
} else if (image.src ) {/ /要素アドレスを使用します
if ( !image.complete ) {//ロードが完了していません
image.onload =loadImage;
} else {//すでにロードされています
loadImage();
} else {
return;//元の画像アドレスなし
}
//大きな画像をロード
if ( !useOrigin ) {
var preload = this._preload,zoomPic = this._zoomPic | image.src,
loadPreload = $$F.bind(this._loadPreload, this );
if (zoomPic != preload.src ) {//新しいアドレス
preload で再ロードします.onload =loadPreload ;
preload.src =zoomPic;
} else {//Loading
if ( !preload.complete ) {//ロードされていません
preload.onload =loadPreload; } else {//ロード済み
this._loadPreload();
}
}
},
//元画像拡大ローダー
_loadOriginImage: function( ) {
this._image.onload = null;
this._zoom.src = this._image.src;
},
//元の画像読み込みプログラム
_loadImage: function() {
this._image.onload = null;
if ( this._loaded ) {//大きな画像がロードされました
this._initLoaded(); } else {
this._loaded = true;
if ( this._scale ) {//カスタム スケールがある場合は、元の画像を使用して拡大し、大きい画像を置き換えます
this._substitute = true ;
this._zoom .src = this._image.src;
this._initLoaded()
}
},
//大きな画像のプリローダー
_loadPreload: function() {
this._preload.onload = null;
this._zoom.src = this._preload.src; ._loaded ) {//元の画像がロードされました
// 置換は使用されません
if ( !this._substitute ) { this._initLoaded() }
} else {
this. _loaded = true;
}
},
//読み込み設定を初期化します
_initLoaded: function(src) {
//表示画像を初期化します
this._initSize(); > //表示ボックスを初期化します
this._initViewer();
//データを初期化します
this._initData();
//実行を開始します
this._onload(); >this .onLoad();
this.start();
},
//表示画像サイズの初期化
_initSize: function() {
varzoom = this._zoom,画像 = this ._image, スケール = this._scale;
if ( !scale ) { スケール = this._preload.width / image.width }
this._scale = スケール = Math.min( Math.max; ( this. _min,scale ), this._max );
// 表示サイズを比例的に設定します
zoom.width = Math.ceil( image.width *scale );
zoom.height = Math. ceil( image.height *scale );
},
// 表示ボックスを初期化します
_initViewer: function() {
varzoom = this._zoom, viewer = this._viewer; >// スタイルを設定します
varstyles = {padding: 0, overflow: "hidden" }, p = $$D.getStyle( viewer, "position" );
if ( p != "relative" && p != "絶対" ){ スタイル.ポジション = "相対" };
$$D.setStyle( ビューア, スタイル );
zoom.style.position = "絶対";表示画像の挿入
if ( !$$D.contains( viewer,zoom) ){ viewer.appendChild(zoom) }
},
//初期化データ
_initData: function();
varzoom = this._zoom, image = this._image, viewer = this._viewer,
scale = this._scale, rangeWidth = this._rangeWidth, rangeHeight = this._rangeHeight
//元の画像座標
this._rect = $$D.rect( image );
//パラメータを修復します
this._repairLeft = image.clientLeft parseInt($$D.getStyle( image, "padding-left" ) );
this._repairTop = image.clientTop parseInt($$D.getStyle( image, "padding-top" ));
//範囲パラメーターと表示ボックス サイズを設定します
if ( rangeWidth > 0 && rangeHeight > ) {
rangeWidth = Math.ceil( rangeWidth );
this._viewerWidth = Math.ceil( rangeWidth *scale ); >this. _viewerHeight = Math.ceil( rangeHeight *scale );
$$D.setStyle( viewer, {
width: this._viewerWidth "px",
height: this._viewerHeight "px"
} );
} else {
var style;
if ( !viewer.clientWidth ) {//Hide
var style = viewer.styles = {
表示: スタイル .display,
位置: style.position,
可視性: style.visibility
};
$$D.setStyle( viewer, {
表示: "ブロック", 位置: "絶対 "、可視性: "隠し"
}
this._viewerWidth = viewer.clientWidth;
this._viewerHeight = viewer.clientHeight; $$D .setStyle( ビューア, スタイル ); }
rangeWidth = Math.ceil(this._viewerWidth /scale );
rangeHeight = Math.ceil(this._viewerHeight /scale ); >this._rangeWidth = rangeWidth;
this._rangeHeight = rangeHeight;
//Start
_start: function() {
clearTimeout( this._timer );ビューアー = this ._viewer、イメージ = this._image、スケール = this._scale;
this._onstart();
this.onStart(); 🎜>$ $E.removeEvent( image, "mouseover", this._START );
$$E.removeEvent( image, "mousemove", this._START );
$$E.addEvent( document, "mousemove" , this._MOVE );
$$E.addEvent( document, "mouseout", this._OUT );
this.mouse && $$E.addEvent( document, $$B.firefox ? "DOMMouseScroll" : "mousewheel", this._MOUSE );
},
//Move
_move: function(e) {
clearTimeout( this._timer ); e.pageX 、 y = e.pageY、rect = this._rect;
if ( x rect.right || y rect. bottom ) {
this._END();//元の画像範囲外に移動
} else {
varzoom = this._zoom,
pos = this._repair(
x -rect.left - this ._repairLeft,
y -rect.top - this._repairTop
);
this._onmove( e, pos ); // 位置決め
ズームを設定します。 style.left = pos.left "px";
this.onMove()
},
//補正座標
_repair : function(x, y) {
varscale = this._scale、zoom = this._zoom、
viewerWidth = this._viewerWidth、
viewerHeight = this._viewerHeight //補正座標
x = Math.ceil( viewerWidth / 2 - x *scale );
y = Math.ceil(viewerHeight / 2 - y *scale ); >x = Math.min ( Math.max( x, viewerWidth -zoom.width ), 0 );
y = Math.min( Math.max( y, viewerHeight -zoom.height ), 0 ); >return { left: x , top: y };
},
//End
_end: function() {
this._onend();
this.onEnd();
if ( this .autoHide ) { this._viewer.style.display = "none" }
this.stop();
this.start();,
// 鼠标缩放
_mouse: function(e) {
this._scale = ( e.wheelDelta ? e.wheelDelta / (-120) : (e.detail || 0) / 3 ) * このレート;
var opt = this.options;
this._rangeWidth = opt.rangeWidth;
this._rangeHeight = opt.rangeHeight;
this._initSize();
this._initData();
this._move(e);
e.preventDefault();
},
//開始
start: function() {
if ( this._viewerWidth && this._viewerHeight ) {
var image = this._image, START = this._START;
$$E.addEvent(image, "マウスオーバー", START );
$$E.addEvent(image, "mousemove", START );
}
},
// 停止
stop: function() {
clearTimeout( this._timer );
$$E.removeEvent( this._image, "mouseover", this._START );
$$E.removeEvent( this._image, "mousemove", this._START );
$$E.removeEvent( document, "mousemove", this._MOVE );
$$E.removeEvent( document, "mouseout", this._OUT );
$$E.removeEvent( document, $$B.firefox ? "DOMMouseScroll" : "マウスホイール", this._MOUSE );
},
//修正設定
reset: function(options) {
this.stop();
var viewer = this._viewer、zoom = this._zoom;
if ( $$D.contains( viewer,zoom ) ) { viewer.removeChild(zoom);
var opt = $$.extend( this.options, options || {} );
this._scale = opt.scale;
this._max = opt.max;
this._min = opt.min;
this._originPic = opt.originPic;
this._zoomPic = opt.zoomPic;
this._rangeWidth = opt.rangeWidth;
this._rangeHeight = opt.rangeHeight;
// 重置プロパティ
this._loaded = this._substitute = false;
this._rect = null;
this._repairLeft = this._repairTop =
this._viewerWidth = this._viewerHeight = 0;
this._initLoad();
},
//销毁程序
dispose: function() {
this._ondispose();
this.stop();
if ( $$D.contains( this._viewer, this._zoom ) ) {
this._viewer.removeChild( this._zoom );
}
this._image.onload = this._preload.onload =
this._image = this._preload = this._zoom = this._viewer =
this.onLoad = this.onStart = this .onMove = this.onEnd =
this._START = this._MOVE = this._END = this._OUT = null
}
}
转下请注明出处: http://www.cnblogs.com/cloudgamer/
何らかの建議や疑念がある場合は、迎留め言论。