该插件似乎使用了一个动画循环,该循环一遍又一遍地调用_render() 函数来控制所持有图像的缩放和平移。渲染函数不断被调用——显然每秒多次:
function _render() {
for (var i = 0, count = $instances.length; i < count; i++) {
var data = $instances.eq(i).data("zoomer");
if (typeof data === "object") {
// Update image and position values
data = _updateValues(data);
data.lastAction = data.action;
// Update DOM
if (transformSupported) {
var scaleX = data.imageWidth / data.naturalWidth,
scaleY = data.imageHeight / data.naturalHeight;
data.$positioner.css(_prefix("transform", "translate3d(" + data.positionerLeft + "px, " + data.positionerTop + "px, 0)"));
data.$holder.css(_prefix("transform", "translate3d(-50%, -50%, 0) scale(" + scaleX + "," + scaleY + ")"));
} else {
data.$positioner.css({
left: data.positionerLeft,
top: data.positionerTop
});
data.$holder.css({
left: data.imageLeft,
top: data.imageTop,
width: data.imageWidth,
height: data.imageHeight
});
}
// Run callback function
if (data.callback) {
data.callback.apply(data.$zoomer, [
(data.imageWidth - data.minWidth) / (data.maxWidth - data.minWidth)
]);
}
}
}
}
_render() 函数使用data.imageWidth 和data.imageHeight 上定义的属性来设置每个动画循环的图像大小,这些属性本身由data.targetImageWidth 和data.targetImageHeight 定义。该插件会随着时间将 width/height 属性移向 targetWidth/targetHeight 属性以创建动画。
在插件中,尝试在_render() 中的行放置一个断点:
var scaleX = data.imageWidth / data.naturalWidth,
然后使用您的 javascript 控制台为 imageWidth、imageHeight、targetImageWidth 和 targetImageHeight 设置不同的值。你可以看到插件是如何工作的。
要创建“重置”按钮,您必须编写一些代码来操作缩放插件的 data 对象,而不是直接设置 css。你应该下载并扩展插件的源代码——也许从options下的controls对象开始:
var options = {
callback: $.noop,
controls: {
position: "bottom",
zoomIn: null,
zoomOut: null,
next: null,
previous: null
},
customClass: "",
enertia: 0.2,
increment: 0.01,
marginMin: 30, // Min bounds
marginMax: 100, // Max bounds
retina: false,
source: null
};