jQuery 로 TabPanel 효과 코드 만 들 기

21123 단어 jQueryTabPanel
예 를 들 어 대량의 정 보 를 보면 웹 페이지 의 다 중 창 프레임 워 크 등 이 모두 사 용 됩 니 다.지금 은 인터넷 에서 jquery Tab 컨트롤 을 바탕 으로 하 는 것 도 많 습 니 다.제 가 예전 에 사 용 했 던 idtabs 은 비교적 간단 하고 실 용적 이 며 유연 하지만 복잡 한 상황 에 대해 인 코딩 을 많이 해 야 합 니 다.너무 간단 합 니 다.그리고 jquery UI 안에 있 는 tab 컨트롤(사용 해 본 적 이 없어 요.jquery ui 에 별로 감기 에 걸 리 지 않 았 어 요)입 니 다.그리고 최근 에 불 이 좀 붙 은 easyui 의 tab 컨트롤 입 니 다.최초 로 자바 아이 위 에서 본 것 은 화면 이 예 쁜 편 입 니 다.원본 이 켜 지지 않 아서 계속 따라 가지 못 했 습 니 다.(최근 에 오픈 한 것 같 습 니 다.며칠 전에 다운 로드 를 해 봤 는데 인 코딩 스타일 이 prototype 같 습 니 다.jquery 의 그림자 가 보이 지 않 습 니 다.왜 jquery easyui 인지 모 르 겠 습 니 다.그렇게 많은 말 을 했 으 니 우 리 는 주제 로 돌아 가 야 한다.여러 가지 이유 로 자신 이 하 나 를 개발 할 수 밖 에 없다.그래서 이 편 이 생 겼 어 요.먼저 효 과 를 보 세 요.
아래 그림 은 단일 페이지 다 중 창 프레임 워 크 의 효과 그림 입 니 다.
 
다음 그림 은 문장 끝 에 호출 예 시 를 제공 하 는 효과 캡 처 입 니 다.
 
보 실 수 있 습 니 다.역시 ExtrJs 를 사용 하 는 효과 입 니 다.사실 CSS 는 기본적으로 그것 을 직접 복사 합 니 다.나 는 그것 이 매우 예쁘다 고 생각한다.물론 실제로 사용 할 때 모두 가 자신의 모습 을 충분히 볼 수 있 는 능력 이 있다.
첫 번 째,HTML 부터 시작 하 겠 습 니 다.
주:제 가 먼저 컨트롤 하 는 사 고 는 HTML 구 조 를 먼저 확정 하 는 것 이 고 그 다음은 스타일 이 며 최종 적 으로 js 가 실현 하 는 사건 방법 등 입 니 다.
사실 그림 을 보면 우 리 는 기본적으로 확인 할 수 있 습 니 다.tab 컨트롤 은 주로 두 부분의 html 하 나 는 머리 이 고 tab 옵션 카드 를 놓 는 데 사 용 됩 니 다.또 하 나 는 몸 이 고 내용 의 용기 다.그러면 두 개의 Div 용기 입 니 다.tab 컨트롤 은 header 와 body 두 부분 으로 나 뉘 어 있 습 니 다.
그 중에서 header 부분 은 여러 옵션 이 포함 되 어 있어 서 l+li 의 조합 을 쉽게 생각 할 수 있 습 니 다.header 의 실제 html 구 조 를 살 펴 보 겠 습 니 다.
 
그 중에서 li 는 하나의 옵션 카드 입 니 다.첫 번 째 a 는 닫 기 단추 이 고 두 번 째 a 야 말로 실제 내용 입 니 다.새 겨 진 탭 을 통 해 좌우 배경 그림 설정 을 실현 합 니 다.(이 방법 은 비교적 많 습 니 다)물론 좋 은 효과 가 있 을 수 있 으 니 CSS 지원 에 의존 해 야 한다.CSS 에 대해 어느 정도 알 아야 합 니 다.
바디 의 구 조 는 더욱 간단 하 다.
제2 CSS 스타일 시트
CSS 가 copy EXTJS 니까 더 이상 소개 안 할 게 요.여러분 은 코드 를 보고 안의 실제 코드 를 다운로드 할 수 있 습 니 다.문제 가 있 으 면 다시 의사 소통 을 할 수 있 습 니 다.
셋째:JS 작성 시작
예전 의 규칙 에 따라 먼저 완전한 JS 코드 를 만 듭 니 다.약 500 줄 정도 의 코드 가 있 습 니 다.사실은 제 가 줄 을 바 꾸 는 것 이 비교적 부지런 하고 실제 코드 의 양 이 비교적 적 습 니 다.
 
; (function ($) {
$.fn.tabpanel =function(option){
var dfop ={
items:[], // {id,text,classes,disabled,closeable,content,url,cuscall,onactive}
width:500,
height:400,
scrollwidth:100,// ,
autoscroll:true //
};
var headerheight=28;
$.extend(dfop, option);
var me =$(this).addClass("x-tab-panel").width(dfop.width);
innerwidth = dfop.width-2;
// Tab Html
var tcs= dfop.autoscroll?"x-tab-scrolling-top":"";
var header = $("<div class='x-tab-panel-header x-unselectable "+tcs+"' unselectable='on' style='width:"+innerwidth+"px;MozUserSelect:none;KhtmlUserSelect:none;'></div>");
var stripwrap = $("<div class='x-tab-strip-wrap'/>");
var scrollerright = $("<div class='x-tab-scroller-right x-unselectable' style='height: 24px; visibility: hidden; mozuserselect: none; khtmluserselect: none;' unselectable='on'/>");
var scrollerleft = $("<div class='x-tab-scroller-left x-unselectable' style='height: 24px; visibility: hidden; mozuserselect: none; khtmluserselect: none;' unselectable='on'/>");
var ulwrap = $("<ul class='x-tab-strip x-tab-strip-top'></ul>");
var stripspacer = $("<div class='x-tab-strip-spacer'/>");
var litemp =[];
for(var i=0,l=dfop.items.length; i<l ;i++)
{
var item =dfop.items[i];
builditemlihtml(item,litemp);
}
litemp.push("<li class='x-tab-edge'/><div class='x-clear'></div>");
ulwrap.html(litemp.join(""));
litemp =null;
stripwrap.append(ulwrap);
if(dfop.autoscroll)
{
header.append(scrollerright).append(scrollerleft);
}
header.append(stripwrap).append(stripspacer);
var bodyheight=dfop.height-headerheight;
var bodywrap = $("<div class='x-tab-panel-bwrap'/>");
var body = $("<div class='x-tab-panel-body x-tab-panel-body-top'/>").css({width:innerwidth,height:bodyheight});
var bodytemp=[];
for(var i=0,l=dfop.items.length; i<l ;i++){
var item =dfop.items[i];
builditembodyhtml(item,bodytemp);
}
body.html(bodytemp.join("")).appendTo(bodywrap);
me.append(header).append(bodywrap);
initevents();
function builditemlihtml(item,parray)
{
parray.push("<li id='tab_li_",item.id,"' class='",item.isactive?"x-tab-strip-active":"",item.disabled?"x-tab-strip-disabled":"",item.closeable?" x-tab-strip-closable":"",item.classes?" x-tab-with-icon":"","'>");
parray.push("<a class='x-tab-strip-close' onclick='return false;'/>");
parray.push("<a class='x-tab-right' onclick='return false;' href='#'>");
parray.push("<em class='x-tab-left'><span class='x-tab-strip-inner'><span class='x-tab-strip-text ",item.classes||"","'>",item.text,"</span></span></em>");
parray.push("</a></li>");
}
function builditembodyhtml(item,parray)
{
parray.push("<div class='x-panel x-panel-noborder",item.isactive?"":" x-hide-display","' id='tab_item_",item.id,"' style='width:",innerwidth,"px'>");
parray.push("<div class='x-panel-bwrap'>");
parray.push("<div class='x-panel-body x-panel-body-noheader x-panel-body-noborder' id='tab_item_content_",item.id,"' style='position:relative; width:",innerwidth,"px; height:",bodyheight,"px; overflow: auto;'>");
if(item.url){
parray.push("<iframe name='tab_item_frame_",item.id,"' width='100%' height='100%' id='tab_item_frame_",item.id,"' src='about:blank' frameBorder='0' />");
}
else if(item.cuscall){
parray.push("<div class='loadingicon'/>");
}
else{
parray.push(item.content);
}
parray.push("</div></div></div>");
}
function initevents()
{
//reset scoller
resetscoller();
scollerclick();
ulwrap.find("li:not(.x-tab-edge)").each(function(e){
inititemevents(this);
});
}
function inititemevents(liitem)
{
liswaphover.call(liitem);
liclick.call(liitem);
closeitemclick.call(liitem);
}
function scollerclick()
{
if(dfop.autoscroll)
{
scrollerleft.click(function(e){scolling("left")});
scrollerright.click(function(e){scolling("right")});
}
}
function resetscoller()
{
if(dfop.autoscroll)
{
var edge = ulwrap.find("li.x-tab-edge");
var eleft =edge.position().left;
var sleft = stripwrap.attr("scrollLeft");
if( sleft+eleft>innerwidth )
{
header.addClass("x-tab-scrolling");
scrollerleft.css("visibility","visible");
scrollerright.css("visibility","visible");
if(sleft>0)
{
scrollerleft.removeClass("x-tab-scroller-left-disabled");
}
else{
scrollerleft.addClass("x-tab-scroller-left-disabled");
}
if(eleft>innerwidth)
{
scrollerright.removeClass("x-tab-scroller-right-disabled");
}
else{
scrollerright.addClass("x-tab-scroller-right-disabled");
}
dfop.showscrollnow =true;
}
else
{
header.removeClass("x-tab-scrolling");
stripwrap.animate({"scrollLeft":0},"fast");
scrollerleft.css("visibility","hidden");
scrollerright.css("visibility","hidden");
dfop.showscrollnow =false;
}
}
}
//
function scolling(type,max)
{
//debugger;
if(!dfop.autoscroll || !dfop.showscrollnow)
{
return;
}
//debugger;
//var swidth = stripwrap.attr("scrollWidth");
var sleft = stripwrap.attr("scrollLeft");
var edge = ulwrap.find("li.x-tab-edge");
var eleft = edge.position().left ;
if(type=="left"){
if(scrollerleft.hasClass("x-tab-scroller-left-disabled"))
{
return;
}
if(sleft-dfop.scrollwidth-20>0)
{
sleft -=dfop.scrollwidth;
}
else{
sleft =0;
scrollerleft.addClass("x-tab-scroller-left-disabled");
}
if(scrollerright.hasClass("x-tab-scroller-right-disabled"))
{
scrollerright.removeClass("x-tab-scroller-right-disabled");
}
stripwrap.animate({"scrollLeft":sleft},"fast");
}
else{
if(scrollerright.hasClass("x-tab-scroller-right-disabled") && !max)
{
return;
}
//left + ;
if(max || (eleft>innerwidth && eleft-dfop.scrollwidth-20<=innerwidth))
{
//debugger;
sleft = sleft+eleft-(innerwidth-38) ;
scrollerright.addClass("x-tab-scroller-right-disabled");
// sleft = eleft-innerwidth;
}
else
{
sleft +=dfop.scrollwidth;
}
if(sleft>0)
{
if(scrollerleft.hasClass("x-tab-scroller-left-disabled"))
{
scrollerleft.removeClass("x-tab-scroller-left-disabled");
}
}
stripwrap.animate({"scrollLeft":sleft},"fast");
}
}
function scollingToli(liitem)
{
var sleft = stripwrap.attr("scrollLeft");
var lleft = liitem.position().left;
var lwidth = liitem.outerWidth();
var edge = ulwrap.find("li.x-tab-edge");
var eleft = edge.position().left ;
if(lleft<=0)
{
sleft +=(lleft-2) ;
if(sleft<0)
{
sleft=0;
scrollerleft.addClass("x-tab-scroller-left-disabled");
}
if(scrollerright.hasClass("x-tab-scroller-right-disabled"))
{
scrollerright.removeClass("x-tab-scroller-right-disabled");
}
stripwrap.animate({"scrollLeft":sleft},"fast");
}
else{
if(lleft+lwidth>innerwidth-40)
{
sleft = sleft+lleft+lwidth+-innerwidth+40; // 40 =scrollerleft and scrollerrightwidth;
if(scrollerleft.hasClass("x-tab-scroller-left-disabled"))
{
scrollerleft.removeClass("x-tab-scroller-left-disabled");
}
// , right;
if(eleft-(lleft+lwidth+-innerwidth+40)<=innerwidth)
{
scrollerright.addClass("x-tab-scroller-right-disabled");
}
stripwrap.animate({"scrollLeft":sleft},"fast");
}
}
liitem.click();
}
function liswaphover()
{
$(this).hover(function(e){
if(!$(this).hasClass("x-tab-strip-disabled"))
{
$(this).addClass("x-tab-strip-over");
}
},function(e){
if(!$(this).hasClass("x-tab-strip-disabled"))
{
$(this).removeClass("x-tab-strip-over");
}
});
}
function closeitemclick()
{
if($(this).hasClass("x-tab-strip-closable"))
{
$(this).find("a.x-tab-strip-close").click(function(){
deleteitembyliid($(this).parent().attr("id"));
});
}
}
function liclick()
{
$(this).click(function(e){
var itemid = this.id.substr(7);
var curr = getactiveitem();
if( curr !=null && itemid == curr.id)
{
return;
}
var clickitem = getitembyid(itemid);
if(clickitem && clickitem.disabled)
{
return ;
}
if(curr)
{
$("#tab_li_"+curr.id).removeClass("x-tab-strip-active");
$("#tab_item_"+curr.id).addClass("x-hide-display");
curr.isactive =false;
}
if(clickitem)
{
$(this).addClass("x-tab-strip-active");
$("#tab_item_"+clickitem.id).removeClass("x-hide-display");
if(clickitem.url)
{
var cururl = $("#tab_item_frame_"+clickitem.id).attr("src");
if(cururl =="about:blank")
{
$("#tab_item_frame_"+clickitem.id).attr("src",clickitem.url);
}
}
else if(clickitem.cuscall && !clickitem.cuscalled)
{
var panel = $("#tab_item_content_"+clickitem.id);
var ret = clickitem.cuscall(this,clickitem,panel);
clickitem.cuscalled =true;
if(ret) // ,
{
clickitem.content = ret;
panel.html(ret);
}
}
clickitem.isactive =true;
if(clickitem.onactive)
{
clickitem.onactive.call(this,clickitem);
}
}
});
}
//
function getactiveitem()
{
for(var i=0,j=dfop.items.length;i<j ;i++)
{
if(dfop.items[i].isactive)
{
return dfop.items[i];
break;
}
}
return null;
}
// ID Item
function getitembyid(id)
{
for(var i=0,j=dfop.items.length;i<j ;i++)
{
if(dfop.items[i].id == id)
{
return dfop.items[i];
break;
}
}
return null;
}
function getIndexbyId(id)
{
for(var i=0,j=dfop.items.length;i<j ;i++)
{
if(dfop.items[i].id == id)
{
return i;
break;
}
}
return -1;
}
//
function addtabitem(item)
{
var chkitem =getitembyid(item.id);
if(!chkitem){
var isactive =item.isactive;
item.isactive =false;
var lastitem = dfop.items[dfop.items.length-1];
dfop.items.push(item);
var lastli = $("#tab_li_"+lastitem.id);
var lastdiv = $("#tab_item_"+lastitem.id);
var litemp =[];
var bodytemp = [];
builditemlihtml(item,litemp);
builditembodyhtml(item,bodytemp);
var liitem = $(litemp.join(""));
var bodyitem= $(bodytemp.join(""));
lastli.after(liitem);
lastdiv.after(bodyitem);
//
var li = $("#tab_li_"+item.id);
inititemevents(li);
if(isactive)
{
li.click();
}
resetscoller();
scolling("right",true);
}
else{
alert(" tab !");
}
}
function openitemOrAdd(item,allowAdd)
{
var checkitem = getitembyid(item.id);
if(!checkitem && allowAdd )
{
addtabitem(item);
}
else{
var li = $("#tab_li_"+item.id);
scollingToli(li);
}
}
// tab
function deleteitembyliid(liid)
{
var id= liid.substr(7);
$("#"+liid).remove();
$("#tab_item_"+id).remove();
var index = getIndexbyId(id);
if(index>=0)
{
var nextcur;
if(index < dfop.items.length -1)
{
nextcur = dfop.items[index+1];
}
else if(index>0){
nextcur = dfop.items[index-1];
}
if(nextcur)
{
$("#tab_li_"+nextcur.id).click();
}
dfop.items.splice(index,1);
resetscoller();
scolling("right",true);
}
}
function resize(width,height)
{
if(width ==dfop.width && height ==dfop.height)
{
return;
}
if(width){ dfop.width=width};
if(height){ dfop.height =height;}
innerwidth = width-2;
bodyheight=dfop.height-headerheight;
me.css("width",dfop.width);
header.css("width",innerwidth);
body.css({width:innerwidth,height:bodyheight});
for(var i=0,j=dfop.items.length;i<j;i++)
{
var item =dfop.items[i];
$("#tab_item_"+item.id).css({width:innerwidth});
$("#tab_item_content_"+item.id).css({width:innerwidth,height:bodyheight});
}
resetscoller();
}
// disabled
function setdisabletabitem(itemId,disabled)
{
var chitem= getitembyid(itemId);
if(!chitem || chitem.disabled ==disabled)
{
return;
}
if(disabled)
{
chitem.disabled =true;
$("#tab_item_"+item.id).addClass("x-tab-strip-disabled");
}
else{
chitem.disabled =false;
$("#tab_item_"+item.id).removeClass("x-tab-strip-disabled");
}
}
me[0].tab = {
addtabitem:addtabitem,
opentabitem:openitemOrAdd,
resize:resize,
setdisabletabitem:setdisabletabitem
};
};
$.fn.addtabitem =function(item)
{
if(this[0].tab)
{
return this[0].tab.addtabitem(item);
}
return false;
}
$.fn.opentabitem =function(item,orAdd)
{
if(this[0].tab)
{
return this[0].tab.opentabitem(item,orAdd);
}
return false;
}
$.fn.resizetabpanel =function(w,h)
{
if(this[0].tab)
{
return this[0].tab.resize(w,h);
}
return false;
}
$.fn.setdisabletabitem =function(itemId,disabled)
{
if(this[0].tab)
{
return this[0].tab.setdisabletabitem(itemId,disabled);
}
return false;
}
})(jQuery);
에 이 어 저 희 는 제 실현 을 분석 하기 시 작 했 습 니 다.처음에 jQuery 컨트롤 의'템 플 릿'을 작 성 했 습 니 다.왜 이렇게 쓰 는 지 에 대해 서 는 이 설명 을 참고 하 십시오.
 
; (function ($) {
$.fn.tabpanel =function(option){
};
)(jQuery);
에 이 어 기본 매개 변 수 를 작 성 했 습 니 다.
var dfop ={ 
items:[], // {id,text,classes,disabled,closeable,content,url,cuscall,onactive}
width:500,
height:400,
scrollwidth:100,// ,
autoscroll:true //
};
기본 매개 변 수 는 비교적 간단 합 니 다.저 는 설명 을 추 가 했 습 니 다.그 중에서 item 배열 의 항목 이 귀 찮 습 니 다.그러나 저 는 여러분 이 글자 의 뜻 을 통 해 이미 절반 이상 알 고 있다 고 믿 습 니 다.저 는 설명 하 겠 습 니 다.id 즉 표시 입 니 다.유일 하 게 text 에 표 시 된 텍스트,classes 의 특정한 스타일 이 필요 합 니 다.예 를 들 어 효과 의 홈 페이지,저 는 아이콘 을 추 가 했 습 니 다.이 속성 을 통 해 disabled 가 비활성화 되 었 는 지,closeable 이 닫 을 수 있 는 지,콘 텐 츠 와 url,cuscall 세 가 지 는 그 중 하나 만 설정 하면 됩 니 다.콘 텐 츠 는 실제 내용 html,url 표시 내용 이 웹 페이지 이 고 내용 에 iframe 을 자동 으로 추가 합 니 다.cuscall 은 사용자 정의 입 니 다.즉,콘 텐 츠 가 어떤 cuscall 이 실 행 된 결 과 를 표시 하 는 지 결정 합 니 다.이 속성 을 통 해 비동기 콘 텐 츠 내용 을 실현 할 수 있 습 니 다.onactive 는 tab 항목 이 활성화 되 었 을 때 발생 하 는 사건 을 말 합 니 다.item 내용 을 받 아들 이 는 함수 입 니 다.demo 매개 변수 설정 이 완료 되 었 습 니 다.외부 에서 전달 하 는 매개 변 수 를 통 해 기본 매개 변 수 를 업데이트 합 니 다.$.extend(dfop,option);그 다음 에 html 를 구축 하 는 부분 입 니 다.이 부분 이 비교적 길 어서 저 는 코드 를 중복 붙 이지 않 겠 습 니 다.html 구축 이 완료 되면 html 요소 에 이 벤트 를 추가 해 야 합 니 다.옵션 카드 의 클릭 이벤트,왼쪽 이동 단추,오른쪽 이동 단추 의 클릭 이벤트,옵션 카드 의 마우스 hover 효과 이벤트 등 을 포함 합 니 다.
 

function initevents()
{
//reset scoller
resetscoller(); //
scollerclick(); // ,
ulwrap.find("li:not(.x-tab-edge)").each(function(e){
inititemevents(this); //
});
}
function inititemevents(liitem)
{
liswaphover.call(liitem); // hover
liclick.call(liitem); //
closeitemclick.call(liitem); //
}
사건 의 실현 에 대해 사실은 하나씩 하면 각자 격파 하 는 것 도 간단 하 다.스크롤 버튼 의 등장 과 사용 하지 않 기 등 을 제어 하 는 데 있어 서 다른 클릭 이벤트 등 은 간단 하 다.마지막 으로 공개 방법 과 이 방법 을 공개 하기 위해 내부 방법 을 작성 하 는 것 입 니 다.이 tabpanel 은 자 연 스 럽 게 사용 하기 쉽 고 확장 성 이 있 습 니 다.여러분 은 실제 수요 에 따라 조정 을 할 수 있 습 니 다.물론 현재 의 기능 도 대부분의 요 구 를 만족 시 킬 것 입 니 다.마지막 으로 어떤 방법 을 공 개 했 는 지 살 펴 보 자.1:동적 으로 tab 항목 을 추가 하 는 방법,즉 js 동적 으로 tab 항목 을 추가 하 는 것 이다.여 기 는 바로 items 데이터 에 대한 유지 보수 이 고 tabitem 의 출력 html 방법 을 다시 호출 하여 마지막 으로 이 벤트 를 따로 설정 하 는 것 이다.간단 2:선택 하거나 추가 합 니 다.이것 도 js 호출 방법 입 니 다.이전 방법 에 대한 확장 입 니 다.js 를 통 해 특정한 tab 항목 을 활성화 시 킬 수 있 습 니 다.이 항목 이 존재 하지 않 으 면 매개 변 수 를 통 해 이 옵션 카드 를 추가 합 니 다.3:tabpanel 의 크기 를 다시 설정 합 니 다.즉,js 를 통 해 tabpanel 의 크기 를 다시 설정 합 니 다.이것 은 창 크기 가 변 할 때 호출 되 어 매우 실 용적 입 니 다.4:어떤 항목 을 비활성화 로 설정 하고,js 방법 을 통 해 어떤 tabitem 상 태 를 비활성화 로 설정 합 니 다.마지막 으로 여러분 은 코드 를 통 해 이전 컨트롤 의 인 스 턴 스 를 포함 할 수 있 습 니 다.저 는 압축 패 키 지 를 제 공 했 지만 SVN 을 사용 하여 최신 코드 를 얻 는 것 을 추천 합 니 다.어떤 때 는 작은 변동 이 있 기 때문에 나 는 글 을 보 내지 않 고 알려 주 었 다.http://code.google.com/p/xjplugin/downloads/list http://xiazai.jb51.net/201005/yuanma/xjPlugin_addtabpanel.rar

좋은 웹페이지 즐겨찾기