jQuery 로 TabPanel 효과 코드 만 들 기
아래 그림 은 단일 페이지 다 중 창 프레임 워 크 의 효과 그림 입 니 다.
다음 그림 은 문장 끝 에 호출 예 시 를 제공 하 는 효과 캡 처 입 니 다.
보 실 수 있 습 니 다.역시 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ajax 이용시 로컬 파일이 CORS 에러가 되었을 때의 대응초보의 초보로 입문편의 참고서를 보면서 공부하고 있어, Ajax에서 로컬 파일을 호출하려고했지만 CORS 정책 오류로 인해 실패했습니다. 브라우저에서 로컬 파일(html)을 표시한 것뿐. 사용 브라우저는 chrome...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.