227 lines
5.9 KiB
JavaScript
Executable File
227 lines
5.9 KiB
JavaScript
Executable File
(function($){
|
|
|
|
var fnName = 'magnifier';
|
|
var magnifier = {
|
|
magnifier : ".magnifier",//最外层的大容器
|
|
|
|
container : ".magnifier-container",//选择当前主图的承载容器
|
|
|
|
containerImg : '.images-cover',//图片的容器
|
|
|
|
view : ".magnifier-view",//图片放大后承载容器
|
|
|
|
width : 400,//图片放大后承载容器宽度
|
|
|
|
height : 400,//图片放大后承载容器高度
|
|
|
|
moveView : ".move-view",//跟随鼠标移动的容器
|
|
|
|
moveWidth : null,//如果设置了移动盒子的宽度,则不计算缩放比例
|
|
|
|
zoom : 4,//缩放比例
|
|
|
|
thumbnail : ".magnifier-line > ul",//缩略图容器
|
|
|
|
assembly : ".magnifier-btn",//按钮组
|
|
|
|
index : 0//当前图片的索引
|
|
};
|
|
|
|
|
|
window[fnName] = function(magnifierAttr){
|
|
|
|
//设置属性值
|
|
if(typeof(magnifierAttr) == "object"){
|
|
|
|
for( var n in magnifierAttr){
|
|
|
|
magnifier[n] = magnifierAttr[n];
|
|
}
|
|
}
|
|
|
|
var _this = this;
|
|
//绑定容器
|
|
_this.magnifier = $(magnifier.magnifier);
|
|
_this.container = _this.magnifier.find(magnifier.container);
|
|
_this.view = _this.magnifier.find(magnifier.view);
|
|
_this.moveView = _this.magnifier.find(magnifier.moveView);
|
|
_this.thumbnail = _this.magnifier.find(magnifier.thumbnail);
|
|
_this.assembly = _this.magnifier.find(magnifier.assembly);
|
|
_this.containerImg = _this.magnifier.find(magnifier.containerImg);
|
|
var imgBox = _this.containerImg;
|
|
|
|
//設置寬高
|
|
_this.magnifier.css({
|
|
"width" : magnifier.width
|
|
});
|
|
_this.container.css({
|
|
"width" : magnifier.width,
|
|
"height" : magnifier.height
|
|
});
|
|
_this.view.css({
|
|
"width" : magnifier.width,
|
|
"height" : magnifier.height
|
|
});
|
|
|
|
var boxMoveViewWidth,boxMoveViewHeight;
|
|
if(magnifier.moveWidth){
|
|
|
|
boxMoveViewWidth = magnifier.moveWidth;
|
|
}else{
|
|
|
|
boxMoveViewWidth = magnifier.width/magnifier.zoom;
|
|
}
|
|
boxMoveViewHeight = boxMoveViewWidth;
|
|
|
|
_this.moveView.css({
|
|
"width" : boxMoveViewWidth,
|
|
"height" : boxMoveViewHeight
|
|
});
|
|
|
|
//计算体积碰撞的变量
|
|
var deviationXl,
|
|
deviationXr,
|
|
deviationYt,
|
|
deviationYb,
|
|
imgWidth,
|
|
imgHieght,
|
|
multiple;
|
|
|
|
_this.eqImg = function(){
|
|
|
|
var img = new Image(),
|
|
src = _this.thumbnail.find("img").eq(magnifier.index).attr('src');
|
|
|
|
img.src = src;
|
|
|
|
//承载容器的宽高
|
|
containerWidth = magnifier.width;
|
|
containerHeight = magnifier.height;
|
|
|
|
_this.thumbnail.find('>*').removeClass('active').eq(magnifier.index).addClass('active');
|
|
|
|
function imgLoadEnd(){
|
|
|
|
if(img.width == 0){
|
|
|
|
img.onload = imgLoadEnd;
|
|
}
|
|
|
|
var styleCss;
|
|
if(img.width > img.height){
|
|
|
|
imgWidth = magnifier.width;
|
|
imgHieght = img.height / (img.width / magnifier.width);
|
|
styleCss = "top:50%;margin-top:"+(-imgHieght/2)+"px";
|
|
}else{
|
|
|
|
imgWidth = img.width / (img.height / magnifier.width);
|
|
imgHieght = magnifier.width;
|
|
|
|
styleCss = "left:50%;margin-left:"+(-imgWidth/2)+"px";
|
|
}
|
|
|
|
imgBox.empty().append('<img src="'+src+'" width="'+imgWidth+'" height="'+imgHieght+'" style="'+styleCss+'" />');
|
|
|
|
//重新计算移动盒子与图片的倍数
|
|
multiple = magnifier.width / boxMoveViewWidth;
|
|
|
|
//容器加载图片
|
|
_this.view.empty().append('<img src="'+src+'" width="'+imgWidth*multiple+'" height="'+imgHieght*multiple+'" />');
|
|
|
|
//偏移量
|
|
deviationXl = (magnifier.width - imgWidth) /2;
|
|
deviationXr = magnifier.width - deviationXl - boxMoveViewWidth + 1;//这里额外+1的是要计算容器的左边框
|
|
deviationYt = (magnifier.height - imgHieght) /2;
|
|
deviationYb = magnifier.height - deviationYt - boxMoveViewHeight + 1;//这里额外+1的是要计算容器的上边框
|
|
|
|
}
|
|
|
|
imgLoadEnd();
|
|
}
|
|
//完成后执行
|
|
_this.eqImg();
|
|
|
|
_this.moveFn = function(e){
|
|
|
|
var X = (e.clientX-_this.magnifier.offset().left)-boxMoveViewWidth/2,
|
|
Y = (e.clientY-_this.magnifier.offset().top + $(document).scrollTop())-boxMoveViewHeight/2;
|
|
|
|
endX = (X > deviationXl) ? (X < deviationXr) ? X : deviationXr : deviationXl;
|
|
endY = (Y > deviationYt) ? (Y < deviationYb) ? Y : deviationYb : deviationYt;
|
|
|
|
//当Y轴超出容器
|
|
endY = (endY > 0) ? (endY > (magnifier.width-boxMoveViewHeight)) ? (magnifier.height-boxMoveViewHeight) : endY : 0;
|
|
_this.moveView.css({
|
|
'left' : endX,
|
|
'top' : endY,
|
|
'display' : "block"
|
|
});
|
|
|
|
positionX = (endX - (magnifier.width-imgWidth)/2)*multiple;
|
|
positionY = (endY - (magnifier.height-imgHieght)/2)*multiple;
|
|
|
|
_this.view.css({
|
|
'display' : "block"
|
|
}).find('img').css({
|
|
'margin-left' : -positionX,
|
|
'margin-top' : -positionY
|
|
});
|
|
}
|
|
|
|
_this.container.on('mousemove',function(e){
|
|
|
|
_this.moveFn(e);
|
|
|
|
}).on('mouseleave',function(){
|
|
|
|
_this.moveView.hide();
|
|
_this.view.hide();
|
|
});
|
|
|
|
var thumbnailImg = _this.thumbnail.find('>*'),
|
|
lineLenght = thumbnailImg.length;
|
|
_this.imgMove = function(_boole){
|
|
|
|
(_boole) ? magnifier.index++ : magnifier.index--;
|
|
|
|
var _deviation = Math.ceil(magnifier.width / thumbnailImg.width() /2);
|
|
if(lineLenght < _deviation){
|
|
return false;
|
|
}
|
|
|
|
(magnifier.index < 0) ? magnifier.index = 0 : (magnifier.index > lineLenght-_deviation) ? magnifier.index = lineLenght - _deviation : magnifier.index;
|
|
|
|
var endLeft = (thumbnailImg.width() * magnifier.index) - thumbnailImg.width();
|
|
|
|
_this.thumbnail.css({
|
|
|
|
"left" : ((endLeft > 0) ? -endLeft : 0)+"px"
|
|
});
|
|
}
|
|
|
|
//按钮组动作
|
|
_this.assembly.find(">*").on('click',function(){
|
|
|
|
_this.imgMove($(this).index());
|
|
});
|
|
|
|
thumbnailImg.on('click',function(){
|
|
|
|
magnifier.index = $(this).index();
|
|
|
|
//显示图片
|
|
_this.eqImg();
|
|
|
|
//缩略图位置移动
|
|
_this.imgMove(magnifier.index);
|
|
});
|
|
|
|
_this.setIndex = function(n){
|
|
|
|
magnifier.index = (n) ? n : 0;
|
|
}
|
|
|
|
return _this;
|
|
}
|
|
})(jQuery); |