(function(){ var sina = { $ : function(objName){if(document.getElementById){return eval('document.getElementById("'+objName+'")')}else{return eval('document.all.'+objName)}}, //Event addEvent : function(obj,eventType,func){if(obj.attachEvent){obj.attachEvent("on" + eventType,func);}else{obj.addEventListener(eventType,func,false)}}, delEvent : function(obj,eventType,func){ if(obj.detachEvent){obj.detachEvent("on" + eventType,func)}else{obj.removeEventListener(eventType,func,false)} }, // 鑾峰彇涓嬩竴涓潪绌鸿妭鐐 next : function(el){ var next = el.nextSibling; while(next && next.nodeType != 1){ next = next.nextSibling; } return next; }, extend : function(o,t){ for (var p in t){ o[p] = t[p]; } return o; }, /** * 璁剧疆鍏冪礌鐨刢ss鏍峰紡 */ css : function(o,s){ var t = o.style; for (var p in s){ t[p] =s[p]; } return o; }, getCurrIndex : function(len,curr){ if(curr >= len) curr -= len; if(curr <0) curr += len; return curr; }, // 鑾峰彇鏁扮粍鐨勬煇涓厓绱 getArrEl : function(arr,curr){ return arr[this.getCurrIndex(arr.length,curr)]; }, supportTransition : (function(){ // 杩欓噷鍙槸绠€鍗曠殑鍒ゆ柇涓€涓槸鍚︽槸webkit鍐呮牳 return window.navigator.userAgent.toLowerCase().indexOf("webkit")>=0; })(), /* * 鍔ㄧ敾宸ュ叿锛屽厓绱爀lem浠庡綋鍓嶇姸鎬佽繍琛屽埌to鏍峰紡鐘舵€侊紝鑺辫垂time鍜屾椂闂 * 娉細闇€瑕佷娇鐢╯etTimeout 0 鏄负浜嗕互涓妀avascript鎵ц鍣ㄤ竴鐩村崰鐢║I绾跨▼锛屽鑷村厓绱犵殑CSS鍔ㄧ敾寰椾笉鍒版墍闇€瑕佺殑鏁堟灉銆傚叾涓竴涓緥瀛愬氨鏄細褰撹缃瓺uration涓?鏃讹紝濡傛灉鍚庨潰鐨勪唬鐮佸啀鏈夎缃瓺uration涓嶄负0鐨勶紝鍒欐墽琛屾椂CSS鐨凞uration涓?涓嶇敓鏁堛€傝繖鏄敱浜巎s鎵ц鏃堕暱鏃堕棿鍗犵敤UI绾跨▼锛屽鑷撮〉闈㈡覆鏌撳墠WebkitTransitionDuration宸茬粡涓嶄负0浜嗐€ */ transition : function(elem,to,time){ setTimeout(function(){ sina.css(elem,{ display : "", WebkitTransform : "translate3d(0,0,0)", //WebkitTransitionTimingFunction : "linear", WebkitTransitionDuration : time }); sina.css(elem,to); sina.css(elem.imgObj,{ WebkitTransform : "translate3d(0,0,0)", //WebkitTransitionTimingFunction : "linear", WebkitTransitionDuration : time }); sina.css(elem.imgObj,to.imgObj); },0); } }; var d = document,w = this, b = d.body, h = d.documentElement; var scrollPic3D = function(){}; scrollPic3D.prototype = { boxId : '', //瀹瑰櫒id width : 500, //瀹瑰櫒瀹藉害 height : 100, //瀹瑰櫒楂樺害 imgWidth : 90, //鍥剧墖瀹藉害 imgHeight : 120, //鍥剧墖楂樺害 descHeight : 100, descClass : "picdesc", showsNumber : 7, //鏄剧ず鏁伴噺 zoom : 0.8, //灏忓浘缂╂斁姣 data : [], position : [], timeLimit : 200, //鍔ㄧ敾鏃堕棿锛?00姣 leftIndex : 0,//鏈€宸﹁竟鍥剧墖鐨勬暟鎹笅鏍 autoPlay : false, //鏄惁鑷姩鎾斁 autoPlayTime : 5, //鑷姩鎾斁鏃堕棿闂撮殧 version : "1.0", author : "mengjia", init : function(){ this.initData(); if(this.data.length < this.showsNumber){alert('閿欒锛氭粴鍔ㄥ浘鐗囨暟鎹皬浜庢樉绀烘暟鎹?);return}; if(this.showsNumber % 2 == 0){this.showsNumber++}; //淇濊瘉鏄鏁 var boxEl = sina.$(this.boxId); boxEl.style.width = this.width + 'px'; boxEl.style.height = this.height + 'px'; boxEl.style.position = 'relative'; boxEl.style.overflow = 'hidden'; boxEl.style.zoom = 1; this.setLeftIndex(0); this.showDesc(this.index);// 鏄剧ず鍒濆鍖栨ā鍧楃殑淇℃伅 this.ifDestory(); }, /* * 閿€姣侀〉闈㈡椂鐨勬暟鎹垹闄ゅ鐞嗭紝闃叉鍐呭瓨娉勯湶 */ ifDestory : function(){ var thisObj = this; sina.addEvent(w,"unload",function(){ delete thisObj.data; }); }, /* * 鍒濆鍖栨暟鎹紝鎶婄洰鏍囩獥鍙his.boxId涓殑鎵€鏈塱mage鍏冪礌鍋氫负闇€瑕佸姩鎬佹樉绀虹殑鍥剧墖鍏冪礌锛屾瘡涓€涓厓绱犵殑涓嬩竴涓妭鐐规槸鍏舵弿杩颁俊鎭紝浼氭坊鍔犲埌鏂板垱寤虹殑鑺傜偣涓仛鏄剧ず澶勭悊銆傚鏋滆繖涓浘鐗囨病鏈夋弿杩颁俊鎭紝鍒欐坊鍔犵┖鑺傜偣 * */ initData : function(){ // 澶勭悊鎵€鏈塱mg鍏冪礌 var boxEl = sina.$(this.boxId); // 娣诲姞鐩稿簲鐨勬搷浣滃厓绱犲拰鏄剧ず鎻忚堪鐨勫厓绱 var descEl = d.createElement("div"); descEl.id = this.descId = "descEL-"+ (+new Date()); descEl.className = "imgDesc_"; descEl.style.position = "absolute"; descEl.style.height = this.descHeight + "px"; descEl.style.bottom = 0; descEl.style.width = "100%"; boxEl.appendChild(descEl); var objs = boxEl.childNodes,obj,imgObj; var imgObjs = boxEl.getElementsByTagName("img"),imgObj,tempThis = this; for (var i = 0,j=0,len = objs.length; i < len; i++){ obj = objs[i]; if(obj.tagName != "DIV")continue; //obj.num = i; obj.style.position = 'absolute'; imgObj = obj.getElementsByTagName("img")[0]; // 濡傛灉娌℃湁鍥剧墖锛屽垯璺宠繃 if(!imgObj)continue; obj.imgObj = imgObj; imgObj.num = obj.num = j++; imgObj.style.width = "100%"; imgObj.style.height = "100%"; // sina.addEvent(imgObj,"click",function(e){ // e = e || w.event; // var tar = e.target || e.srcElement; // // 濡傛灉褰撳墠椤甸潰姝f槸鐒︾偣鍥撅紝鍒欏彲寮瑰嚭椤甸潰 // tempThis.go(tar.num); // if(tempThis.index != tar.num){ // if ( e.preventDefault ) { // e.preventDefault(); // } // if ( e.stopPropagation ) { // e.stopPropagation(); // } // return false; // } // }); // 鎶婂鍥剧墖鐩稿簲鐨勬弿杩板唴瀹规斁缃埌descEl鍏冪礌涓 var next = this._getDescEl(obj); if(!next){ next = d.createElement("div"); } next.style.display = "none"; descEl.appendChild(next); this.data.push(obj); } }, /* * 鏄剧ず鍓嶄竴涓浘鐗囷紝鏈夊姩鐢 * */ pre : function(){ this.go(this.index - 1); }, /* * 鏄剧ず涓嬩竴涓浘鐗囷紝鏈夊姩鐢 * */ next : function(){ this.go(this.index + 1); }, /* * 鑷姩鎾斁鍑芥暟锛岄€氳繃this.autoPlay灞炴€ф帶鍒 * */ autoPlayFunc : function(){ if(this.autoPlay){ clearInterval(this._autoPlay); var tempThis = this; this._autoPlay = setInterval(function(){tempThis.next();},this.autoPlayTime*1000); }; }, /* * css3鐨勭Щ鍔ㄥ埌涓嬩竴涓殑鍔ㄧ敾瀹炵幇鍑芥暟 * @param clockwise {Boolean} 鏄『鏃堕拡杩樻槸閫嗘椂閽堣繍鍔 * @param time {Number} 鎵ц杩欐鍔ㄧ敾鎵€闇€瑕佺殑鏃堕棿 * */ transNext : function(clockwise,time){ var datas = this.data,leftIndex = this.leftIndex,posArr = this.position,len = this.showsNumber,pos,elem, //鑾峰彇闇€瑕佹彁鍓嶅噯澶囩殑鍏冪礌 el = sina.getArrEl(datas,clockwise?leftIndex+len : leftIndex-1), // 鑾峰彇璇ュ厓绱犳墍瀵瑰簲鐨勬牱寮 s = sina.getArrEl(posArr,clockwise?posArr.length-1:0); // 绔嬪嵆搴旂敤璇ユ牱寮 sina.transition(el,s,"0s"); for (var i = 0; i <= len; i++){ // 鑾峰彇褰撳墠瀵瑰簲鐨勫厓绱 elem = sina.getArrEl(datas,clockwise?i+leftIndex:i-1+leftIndex); //缁欏搴旂殑鍏冪礌璁剧疆瀵瑰簲鐨勪綅缃俊鎭紝鍚屾椂鎸囧畾css鍔ㄧ敾鐨勬椂闂 pos = sina.getArrEl(posArr,clockwise?i:i+1); sina.transition(elem,pos,time+"ms"); } // 璁剧疆leftIndex鍜宨ndex鍊 this.leftIndex = sina.getCurrIndex(datas.length,clockwise?leftIndex+1:leftIndex-1); this.index = sina.getCurrIndex(datas.length,this.leftIndex + Math.floor(len / 2)); }, /* * 鎶婁腑闂寸殑鍥剧墖璁剧疆鎴愮涓嬫爣涓篿ndex鐨勫浘鐗囷紝鏈夊姩鐢 * @param index {Integer} 鐩爣鍥剧墖瀵瑰簲鐨勪笅鏍囧€ * @example * 渚嬪锛氶渶瑕佹樉绀虹2鍓浘鐨勬弿杩颁俊鎭紝鍒橗==> go(1)锛屽垯浼氫骇鐢熷姩鐢绘晥鏋 * */ go : function(index){ if(this.index == index){return;}; var start = this.index, end = index, len = this.data.length; clearTimeout(this._timeout); //鏈€鐭矾绋 if(Math.abs(end - start) > len / 2){ if(end > len / 2){ end = end - len; }else{ end = end + len; }; }; // 鏍规嵁鏄惁鏀寔css3鍔ㄧ敾 鍒嗗埆鍋氬鐞 this[sina.supportTransition?"_css3Animate":"_jsAnimate"](end); }, /* * css3 Transition鍔ㄧ敾瀹炵幇鍑芥暟锛屼紶鍏ョ粨鏉熷€?寮€濮嬩骇鐢熷姩鐢 * */ _css3Animate : function(end){ var obj = this,start = this.index, length = Math.abs(end - start), stepTime = this.timeLimit / length; this._timeout = setTimeout(function(){ if(!length--){//鏍规嵁璺▼鍋氬涓猼imeout璋冪敤 if(obj.onend){obj.onend(start,obj.index)}; return; } obj.transNext(end > start,stepTime); obj._timeout = setTimeout(arguments.callee,stepTime/2); },0); }, /* * js鍔ㄧ敾瀹炵幇鍑芥暟锛屼紶鍏ョ粨鏉熷€?寮€濮嬩骇鐢熷姩鐢 * */ _jsAnimate : function(end){ //姝ユ暟 var step = this.timeLimit / 20, obj = this, start = this.index, now = 0; this._timeout = setTimeout(function(){ var index = obj.index; if(now >= step){ if(index != Math.round(index)) obj.go(Math.round(index)); if(obj.onend){obj.onend(start,index)}; return; }; now ++; var t = now; // 璁剧疆鍔ㄧ敾杩愯鐗规晥锛屼笁娆℃柟鍑芥暟 var value = ((end - start)*((t=t/step-1)*t*t + 1))+ start; obj.setIndex(value); obj._timeout = setTimeout(arguments.callee,20); },20); }, /* * 鑾峰彇褰撳墠鍥剧墖瀵瑰簲鐨勬弿杩板厓绱 * @param {HTMLDomElement} 鍥剧墖鍏冪礌瀵瑰簲鐨凥TMLDomElement * */ _getDescEl : function(obj){ var nodes = obj.childNodes,node; for (var i = 0,len = nodes.length; i < len; i++){ node = nodes[i]; if(node && node.className &&銆€node.className.indexOf(this.descClass) >= 0) return node; } return null; /*var pNode = imgEl.parentNode, next = sina.next(pNode.tagName.toLowerCase() == "a"?pNode :imgEl), tagName = next?next.tagName.toLowerCase():""; // 闇€瑕佹樉绀烘柊鍥剧墖鐨勬弿杩颁俊鎭 if(!next || (next && (tagName == "img" || tagName == "a" || next.id == this.descId))){ // 娌℃湁鎻忚堪鍏冪礌锛岃繑鍥炵┖ return null; } return next; */ }, /* * 鍙樉绀哄綋鍓嶄笅鏍囧浘鐗囧搴旂殑鎻忚堪淇℃伅 * @param {Integer} 褰撳墠鍥剧墖瀵瑰簲鐨勪笅鏍囧€ * @example * 渚嬪锛氶渶瑕佹樉绀虹2鍓浘鐨勬弿杩颁俊鎭紝鍒橗==> showDesc(1) * */ showDesc : function(currIndex){ var children = sina.$(this.descId).childNodes; for (var i = 0,len = children.length; i < len; i++){ children[i].style.display = i == currIndex?"":"none"; } }, /* * 鍥剧墖杞浆瀹屾垚鍚庤Е鍙戠殑鍔ㄤ綔 * @param preIndex {Integer} 鍘熸潵鍥剧墖鐨勪笅鏍 * @param currIndex {Integer} 褰撳墠鍥剧墖鐨勪笅鏍 * TODO 鍙互鍋氫竴浜涘姩鐢绘晥鏋滐紝渚嬪鎻忚堪淇℃伅鐨勬贰鍏ユ贰鍑虹瓑 * */ onend : function(preIndex , currIndex){ // TODO 鍙互鍋氬姩鐢昏繃娓℃晥鏋 currIndex = Math.round(currIndex); if(currIndex >= this.data.length){ currIndex = currIndex - this.data.length; } this.showDesc(currIndex); }, /* * 璁剧疆褰撳墠涓嬫爣鐨勫€间綔涓轰腑闂村浘鐗囷紝鏃犲姩鐢 * @param index {Integer} 鍥剧墖鐨勪笅鏍 * */ setIndex : function(index){ this.setLeftIndex(index - Math.floor(this.showsNumber/2)); }, /* * 璁剧疆褰撳墠涓嬫爣鐨勫€间綔涓烘渶宸﹁竟鍥剧墖锛屾棤鍔ㄧ敾 * @param leftIndex {Integer} 鍥剧墖鐨勪笅鏍 * */ setLeftIndex : function(leftIndex){ var picLen = this.data.length,half = this.showsNumber/2,getIndex = sina.getCurrIndex; //閬垮厤娴偣杩愮畻鐨刡ug leftIndex = Math.round(leftIndex * 1000) / 1000; leftIndex = getIndex(picLen,leftIndex); this.leftIndex = leftIndex; var index = getIndex(picLen,Math.floor(half) + leftIndex); this.index = index; for(var i=0;i i? l : this.width - l - objW; obj.style.left = l + "px"; t = Math.round((this.height - objH - this.descHeight) / 2 ); obj.style.top = t + 'px'; obj.style.zIndex = z = Math.round(zIndex); //setTimeout(function(){ obj.style.zoom = 1; imgObj.style.zoom = 1; //},0); // 杩欓噷淇濆瓨鍒濆鏃舵墍鏈夌‘瀹氱殑鍥剧墖浣嶇疆澶у皬绛変俊鎭 if(sina.supportTransition && !this.position[i]){ this.position[i] = { zIndex:z*100,// 鏀惧ぇzindex left:l + "px", top:t+"px", width:imgW +"px", height:imgH+"px", imgObj : { width : w + "px", height : h + "px" } } }; } // 淇濆瓨鏄剧ず鍏冪礌鍓嶄竴涓拰鏈€鍚庝竴涓殑浣嶇疆 if(sina.supportTransition && this.position.length != this.showsNumber+2){ var temp = this.position[0]; this.position.unshift(sina.extend(sina.extend({},temp),{ left : "-"+temp.width, zIndex : 0 })); this.position[this.position.length-1] = sina.extend(sina.extend({},temp),{ left : this.width+"px", zIndex : 0 }); }; this.autoPlayFunc(); } }; w.scrollPic3D = scrollPic3D; })();