نظرسنجی
بیشترین استفاده شما از اینترنت در چه زمینه ای است؟






 
خروجی RSS

چگونگی ساخت تب (سربرگ) با CSS


21 تیر 1388
مطمئنا در سایت های مختلف قسمت هایی را دیده اید که به صورت تب کنار هم قرار گرفته اند. تب ها گزینه ای مناسب برای نمایش بخش های مختلف در یک سایت، در حین فشردگی و زیبایی می باشند. در این مقاله قصد دارم نحوه ی ساخت این نوع تب ها را به کمک CSS و اندکی جاوا اسکریپت آموزش بدم هرچند که نسبتا ساده است اما سعی کردم توضیخات کامل باشد. ناگفته نماند که این مقاله رو  سال قبل نوشتم و در انجمن برنامه نویس منتشر کردم، اما به دلیل اضافه شدن بخش css به سایت تصمیم گرفتم مقاله رو در اینجا هم قرار بدم.
 
tab05

این تب یا سربرگ ها به سادگی توسط تگ های ul-li ساخته می شوند. برای شروع، کد html زیر را که از یک div تشکیل شده و درونش تگ های ul-li هستند در نظر بگیرید:

<div id="TabContainer">
    <ul class="tab">
        <li><a href="#">محبوب ترين مطلب</a></li>
        <li><a href="#">آخرين مطالب</a></li>
        <li><a href="#">افراد آنلاين</a></li>
        <li><a href="#">وضعيت اعضاء</a></li>
    </ul>
</div>

قصد بر این است که با css کاری کنیم که هر تگ li به یک تب تبدیل شود، بنابراین کد های زیر را در فایل css خود قرار دهید:

#TabContainer
{
    margin: 30px 250px;
    padding: 0;
}
#TabContainer ul.tab
{
    list-style: none;
    border: 1px solid #000000;
    margin: 0;
    padding: 0;
}
#TabContainer ul.tab li
{
    float: right;
    margin-left: 5px;
}

در کد های بالا شناسه TabContainer برای نگهداری tab ها در نظر گرفته شده است و کلاس tab نیز به تگ ul نسبت داده شده که گزینه های آن واضح اند.
برای اینکه هر تگ li به صورت به یک تب تبدیل شود، لازم هست که li ها کنار هم قرار بگیرند، بنابراین خاصیت float:right  را برای تگ های li در نظر می گیریم تا به حالت شناور و در سمت راست ul قرار بگیرند. margin-left نیز برای ایجاد فاصله بین تب ها در نظر گرفته شده است. خوب تا اینجا کار به این شکل شده:

tab

اولین مشکلی که دیده می شود این است که با float کردن li ها ارتفاع ul صفر شده و مثل یک border در بالای li ها قرار گرفته است. برای اینکه این حاشیه در زیر تگ های li قرار گیرد، لازم است که مقداری برایpadding-bottom  تگ ul در نظر بگیریم، با اینکار ul مثل کادری دور تب ها را خواهد گرفت. با توجه به اینکه ما فقط به حاشیه پایینی نیاز داریم پس border را بهborder-bottom  تغییر دهید.
این را هم عرض کنم که padding-bottom را طوری در تگ ul مقدار دهی کنید که دقیقا حاشیه تگ ul روی حاشیه پایینی li ها قرار بگیرد. در این مثال من مقدار21 پیکسل برایpadding-bottom  در نظر گرفتم. در نهایت کلاس tab را به این شکل ویرایش کنید:

#TabContainer ul.tab
{
    list-style: none;
    border-bottom: 1px solid #000000;
    margin:  0;
    padding: 0 50px 21px 0;
}

بعد از انجام مراحل فوق به سراغ تعیین استایل برای تگ های a که درون تگ های li هستند می رویم:

#TabContainer li a:link,#TabContainer li a:visited
{
    display: block;
    font-family: tahoma;
    font-size: .75em;
    background-color: #fcd9af;
    color: #800000;
    border: 1px solid #000;
    padding: 3px;
    text-decoration: none;
}
#TabContainer li a:hover
{
    background-color: #ff9797;
}

فکر نمیکنم در کد های بالا چیزی نامفهوم باشد. فقط یک نکته کوچک اینکه به منظور نمایش تگ a به صورت جعبه ای، خاصیت display آن را برابر block قرار دادم.  با این کار تگ a تمام فضای درون li را می پوشاند و وقتی موس را در هر جای li قرار دهید، علامت دست ظاهر خواهد شد. بعد از آن هم کلاس کاذب hover را برای تغییر رنگ زمینه تگ a هنگام رفتن موس بر روی تگ، استایل دهی کردم.
تا اینجا تب های ما به این شکل شده که تقریبا تب ها آماده شده اند:

tab

برای ساخت قسمتی که آیتم های هر تب درون آن قرار گیرد از یک تگ div  استفاده می کنیم. در ابتدای کار تب ها را درون یک div  با آی دی TabContainer  قرار دادیم. بنابراین تب های ما دقیقا در بین این div مهار شده هستند. پس خیلی راحت با اضافه کردن یک div دیگر به عنوان محل قرار گیری آیتم ها و دادن border به آن می توانیم یک چهارچوب برای تب ها درست کنیم. کد html ما تا این لحظه به صورت زیر می باشد:

 <div id="TabContainer">
    <ul class="tab">
        <li><a href="#">محبوب ترين مطلب</a></li>
        <li><a href="#">آخرين مطالب</a></li>
        <li><a href="#">افراد آنلاين</a></li>
        <li><a href="#">وضعيت اعضاء</a></li>
    </ul>
    <div class="ContentArea">
        <p>test</p>
        <p>test</p>
        <p>test</p>
        <p>test</p>
    </div>
</div>

و این هم کد css برای div جدید:

#TabContainer div.ContentArea
{
    border: 1px solid #000;
    border-top: none;
    padding: 3px;
}

توجه کنید که border-bottom  تگul ، حاشیه بالایی در کلاس ContentArea  را تشکیل می دهد، بنابراین مقدار border-top را در این کلاس حذف کرده ایم.
تا اینجا کار ساخت تب ها به پایان رسیده است. در ادامه باید حالت فعال یا غیر فعال بودن تب ها را ایجاد کنیم، به شکلی که وقتی کاربر بر روی یک تب کلیک کرد، آن تب به حالت فعال در بیاید و فقط آیتم های همان تب نشان داده شود.

tab
برای فعال شدن هر تب از جاوا اسکریپت استفاده می کنیم، به طوری که با کلیک بر روی هر تب تابعی فراخوانی می شود و استایل تب مورد نظر را تغییر می دهد. همچنین در این مرحله آیتم های نمایشی مربوط به تمام تب ها را در تگی که با کلاس ContentArea در مرحله قبل ایجاد شد قرار می دهیم و با جاوااسکریپت خاصیت display آن ها را به گونه ای تغییر میدهیم که هنگام کلیک بر روی هر تب فقط آیتم های همان تب نمایش یابند. به این ترتیب برای هر تگ a یک آی دی در نظر می گیریم و به رویداد onclick  هر یک نیز نام تابع جاوا اسکریپت مورد نظر را اختصاص می دهیم.
<li><a href="#" id="MostVisited" class="active" onclick="tabselect(id);">محبوب ترین مطالب</a></li>
<li><a href="#" id="LastContent" onclick="tabselect(id);">آخرین مطالب</a></li>
<li><a href="#" id="OnlineUsers" onclick="tabselect(id);">افراد آنلاین</a></li>
<li><a href="#" id="UsersStatus" onclick="tabselect(id);">وضعیت اعضاء</a></li>

به div نگهدارنده آیتم ها هم چند تگ div که هرکدام مربوط به آیتم های یک تب هستند را اضافه کنید:

<div class="ContentArea">
    <div id="MostVisited_content">
        most visited
    </div>
    <div id="LastContent_content">
        last content
    </div>
    <div id="OnlineUsers_content">
        online user
    </div>
    <div id="UsersStatus_content">
        user status
    </div>
</div>

با توجه به اینکه تب فعال ما باید دارای استایل متفاوتی نسبت به سایر تب ها باشد، یک کلاس css با نام active را برای تب های فعال نیزدر نظر می گیریم:

#TabContainer ul.tab a.active , #TabContainer ul.tab a.active:hover
{
    background-color: #ffffff;
    border-bottom: 1px solid #ffffff;
}

در این کلاس فقط رنگ زمینه تب فعال و حاشیه پایینی آن را همرنگ با رنگ زمینه آیتم ها کنیم. در کد های html ئی که بالاتر قرار دادم به اولین تب، این کلاس رو نسبت دادم. همچنین چون قبلا برای کلاس hover استایل تعیین کرده بودیم، باید آن را نیزoverride  کنیم تا با رفتن موس روی تب فعال رنگ زمینه تب تغییر پیدا نکند. بنابراین چنین شکلی رو داریم:

tab

درنهایت تابع جاوا اسکریپت برای تغییر دادن استایل تب ها ها را به صورت کاملا ساده به این شکل نوشتم:

var activeId = "MostVisited";
function tabselect(id)
{   
    document.getElementById(activeId).className="";
    document.getElementById(id).className="active";
    document.getElementById(id).blur();
    
    document.getElementById(activeId + "_content").style.display="none";
    document.getElementById(id + "_content").style.display="";
    activeId = id;
}
نحوه کار تابع به این شکل است که با کلیک بر روی یک تب، آی دی آن تب به این تابع ارسال شده و براساس آن آی دی، خاصیت display و className آیتم ها و تگ های a تعیین می شود. متغیری به نام activeId هم در نظر گرفته شده که id هر تب فعال در آن قرار داده می شود و برا اساس این آی دی، تغییرات از روی تب قبلی برداشته شده و به تب جدید اختصاص میابد.
نکته ی انتهایی این مقاله: هنگامی که صفحه لود می شود، به دلیل اینکه تابع جاوااسکریپت فراخوانی نشده است، تمام آیتم ها همزمان نمایش داده می شوند. برای رفع این مورد به تگ div تک تک آیتم ها به غیر از آیتم اول خاصیت display: none را اضافه می کنیم. با اینکار در زمان لود صفحه فقط آیتم های تب اول نمایش داده می شوند.
فایل های این مقاله را می توانید از اینجا دانلود کنید. البته تغییراتی جزئی برای زیبا تر شدن درش دادم که برای جلوگیری از شلوغی و پیچیدگی در متن مقاله لحاظ نشدند. 
تعداد آراء: 16 رای
یادداشت ها
اشکان
1388/05/08 - 12:07:00
سلام. من واقعاً از شما بابت آموزش‌های عالیتون تشکر می‌کنم. هر چند دیر شده ولی واقعاً دنبال همچین چیزی توی CSS می‌گشتم.
مهبودی
1388/07/28 - 11:44:00
عالیه.ممنونم.
مدیر
1388/12/02 - 13:02:00
محشره سایت خیلی خوب دارید www.didani.net
سارا
1389/03/04 - 04:26:00
عالی بود
باران
1389/05/06 - 16:38:00
باید بگم واقعا دست شما درد نکنه این عالی بود اموزش های بسیار مفید و موثری رو گذاشتید www.chemi-mehr.blogfa.com
سلام
1389/06/20 - 16:31:00
به نام خدا سلام خیلی عالی بود انشا الله همیشه در راه خدا موفق باشی
سارا
1389/06/31 - 19:09:00
خیلی خوب بود ! میشه اموزش همین نوع رو در حالتی که عمودی باشه توضیح بدید ! خیلی برام مهمه چون برای انجام یه کار میخوام. مرسی
یاسر
1389/07/18 - 14:37:00
واقعاً کارم و راه انداخت. دستتون درد نکنه. :25
بهراد
1389/10/20 - 05:07:00
در IE تا بر روی پیغام allow blocked content کلیک نکنیم کار نمی کند برای سازگاری با مرورگرها چه کنیم
عماد:
پیامی رو موقع باز کردن فایل html در ie نمایش داده میشه رو می فرمایید؟ اگر همون هست که مشکلی نداره. بر روی لوکال اون پیام نمایش داده میشه، روی سروری مشکلی نیست.
محمد
1390/05/24 - 05:24:00
سایت خیلی عالی دارین. از آموزش هاتون ممنونم
جستجوگر
1390/06/06 - 00:14:00
خیلی ممنون از آموزش خوب و واضح تان. چهی می شد همه اینجوری بودن(البته هست نه زیاد). با آرزوی بهروزی و شادی برایتان
ehsan
1390/06/12 - 15:03:00
بسیار عالی
شیدا
1390/06/28 - 03:22:00
سلام من این سربرگها رو تو asp.net ایجاد کردم ولی الان button هایی که میذارم تو فرمم کار نمیکنه ولی اگه button ها تو یک فرم بدون سربرگ باشن کار میکنه !!!چرا؟
sara
1390/06/29 - 02:24:00
نمیدونید چقدر به من کمک کردین مرسی افرادی مثل شما خیلی کم هست بازم ممنون
آرش
1390/08/13 - 04:18:00
درود بر شرف شما
hassan
1390/11/14 - 12:21:14
اولین جامعه مجازی اختصاصی کامپیوتر افتتاح شد.سوالات و مشکلات مربوط به کامپیوتر را مطرح کرده و آنلاین جواب بگیرید.یا با استفاده از تخصص و استعداد خود سوالات دیگران را پاسخ دهید
- پی سی کلوب - http://pccloob.ir/

پایگاه مقدماتی و تخصصی کامپیوتر - آموزش عمومی و تخصصی کامپیوتر - http://pccamp.ir/
پیمان
1390/12/27 - 02:21:55
خیلی عالی بود ممنون
ali
1391/01/05 - 09:36:24
من ازمطالب سایت خیلی خوشم اومد اگه خواستین من میتونیم با هم کارکنیم درضمن
موبایل146471272
ali
1391/01/05 - 09:37:00
09146471272
یادداشت خود را ثبت کنید



کد امنیتی:    =
loader
در حال ارسال - چند لحظه صبر کنید...