parsgreen.com
article

ساخت پنل چند سربرگی (tabbed panel) با جاوا اسکریپت و CSS

javascript-tabbed-panel

استفاده از پنل چند سربرگی یا tabbed panel از جمله روش های متداول در طراحی وب با متدهای حرفه ای محسوب می شود که امروزه در اغلب برنامه های کاربردی تحت وب می توان نمونه ای از آن را مشاهده کرد، به طور خلاصه پنل های چند سربرگی، بلاک هایی هستند که با وجود مستقل و چندگانه بودن، به نحوی با رابطه ای تعاملی در کنار هم قرار می گیرند که از نظر کاربر، مجموعه ای مشترک دیده می شوند، طراحان وب معمولا از ترکیب قابلیت های جاوا اسکریپت و CSS این نوع پنل ها را خلق و در مواردی مانند سایت های خبری، سایت های دانلود، پنل مدیریت سیستم های مدیریت محتوا، نمایش آمار و نمودارها و... از آنها استفاده می کنند.

فواید استفاده از پنل چند سربرگی


استفاده از این نوع پنل ها به صرفه جویی در میزان فضای اشغال شده از صفحه، زیبایی و همچنین انسجام بخشی بیشتر به رابط کاربری (User Interface) سایت کمک می کند، در نتیجه کاربر نهایی تجربه بهتری از پایش در برنامه تحت وب شما خواهد داشت.

معایب استفاده از پنل چند سربرگی


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

نحوه ایجاد پنل چند سربرگی


همان طور که اشاره شد، برای ایجاد پنل چند سربرگی یا tabbed panel باید به صورت ترکیبی از جاوا اسکریپت و CSS استفاده کنیم، در اینجا نیز CSS نقش شکل دهنده و جاوا اسکریپت جهت ایجاد رفتار تعاملی به کار می رود، برای شروع کد HTML پنل را به صورت زیر می نویسیم.
<div class="tabbed-container">
<div class="tabbed-menu">
<div class="tabbed-button" id="tabbed-button-1">تیتر دکمه 1</div>
<div class="tabbed-button" id="tabbed-button-2">تیتر دکمه 2</div>
<div class="tabbed-button" id="tabbed-button-3">تیتر دکمه 3</div>
<div class="tabbed-button" id="tabbed-button-4">تیتر دکمه 4</div>
</div>
<div class="tabbed-wrapper">
<div id="tabbed-box-1">محتوای باکس 1</div>
<div id="tabbed-box-2">محتوای باکس 2</div>
<div id="tabbed-box-3">محتوای باکس 3</div>
<div id="tabbed-box-4">محتوای باکس 4</div>
</div>
</div>
همان طور که ملاحظه می کنید کد بالا از سه بلاک اصلی (tabbed-container، tabbed-menu و tabbed-wrapper) تشکیل شده، بلاک div با کلاس tabbed-container در واقع نقش نگهدارنده یا container سایر عناصر را داشته و در بالاترین سطح قرار می گیرد، tabbed-menu بلاکی است که دکمه مربوط به هر پنل در آن به نمایش در خواهد آمد و tabbed-wrapper بلاکی برای قرار گرفتن باکس محتوا است.
نکته کلیدی که در این کد به چشم می خورد نحوه تنظیم id در قسمت tabbed-button و tabbed-box است که در انتهای آنها یک شماره متناظر درج شده، از این شماره در هنگامی که قصد ایجاد رفتار تعاملی با جاوا اسکریپت را داریم استفاده خواهیم کرد؛ اکنون تکه کد جاوا اسکریپتی زیر را نیز به صفحه خود اضافه می کنیم.
<script type="text/javascript">
function closeBox(num){
    //بستن تمام باکس ها در اولین بارگذاری
    for(var i = 1; i <= num; i++){
        document.getElementById("tabbed-box-" + i).style.display = "none";    
    }
}
function openSelected(button, box){
    //باز کردن باکس انتخاب شده در اولین بارگذاری
    document.getElementById(button).className = ("tabbed-button-open");
    document.getElementById(box).style.display = "block";        
}
function openBox(button, box, num){
    var tabbed_div = document.getElementById(box).style.display;
    
    //بستن تمام باکس ها و باز کردن باکس انتخاب شده
    if(tabbed_div != "block"){
        for(var i = 1; i <= num; i++){
            document.getElementById("tabbed-box-" + i).style.display = "none";
            document.getElementById("tabbed-button-" + i).className = ("tabbed-button");
        }        
        document.getElementById(button).className = ("tabbed-button-open");
        document.getElementById(box).style.display = "block";        
    }        
}
</script>
این کد از سه تابع تشکیل شده، تابع closeBox تمام باکس های پنل را به حالت بسته (display:none) تغییر می دهد، این تابع در بارگذاری اولیه صفحه (یعنی زمانی که صفحه فراخوانی می شود) به کار می رود، تابع openSelected با دریافت id مربوط به دکمه و باکس انتخاب شده، آن را به حالت کلاس tabbed-button-open و block تبدیل می کند (دکمه انتخاب شده و باکس مربوط به آن نمایش داده می شود)، این تابع نیز در بارگذاری اولیه صفحه به کار می رود، تابع openBox نیز در واقع کار دو تابع closeBox و openSelected را به صورت داینامیک انجام می دهد، در نتیجه با انتخاب هر سربرگ، دکمه به حالت انتخاب شده و باکس نمایش داده می شود.
پس از درج کد بالا در قسمت head صفحه، قسمت HTML را نیز در قسمت زیر به صورتی که مشاهده می کنید ویرایش کنید.
<div class="tabbed-button" id="tabbed-button-1" onclick="openBox(this.id, 'tabbed-box-1', 4);">تیتر دکمه 1</div>
<div class="tabbed-button" id="tabbed-button-2" onclick="openBox(this.id, 'tabbed-box-2', 4);">تیتر دکمه 2</div>
<div class="tabbed-button" id="tabbed-button-3" onclick="openBox(this.id, 'tabbed-box-3', 4);">تیتر دکمه 3</div>
<div class="tabbed-button" id="tabbed-button-4" onclick="openBox(this.id, 'tabbed-box-4', 4);">تیتر دکمه 4</div>
این کار برای اختصاص دادن رویداد onclick به دکمه های پنل است (به شماره های متناظر توجه داشته باشید).
سپس در انتهای کدهای HTML مربوط به پنل، تکه کد جاوا اسکریپت زیر را نیز اضافه کنید.
<script type="text/javascript">
//بستن تمام باکس ها در اولین بارگذاری
closeBox(4);
//باز کردن باکس انتخاب شده در اولین بارگذاری
openSelected("tabbed-button-1", "tabbed-box-1");
</script>
در آخرین مرحله باید استایل CSS مربوط به پنل چند سربرگی را به صفحه خود اضافه کنیم، بنابراین استایل زیر را نیز ترجیحا در قسمت head صفحه درج می کنیم.
<style type="text/css">
.tabbed-container{
    position:relative;
    margin-top:12px;
    border:1px solid #FFF;
}
.tabbed-menu{
    margin-top:0px;
    margin-bottom:0px;
    line-height:14px;
    position:absolute;
}
.tabbed-wrapper{
    border:1px solid #E5E5E5;
    margin-top:25px;
    margin-bottom:12px;
    padding:12px;
}
.tabbed-button{
    display:inline-block;
    height:16px;
    width:auto;
    padding:4px;
    margin:0px;
    background:#F9F9F9;
    border-radius:5px 5px 0px 0px;
    -webkit-border-radius:5px 5px 0px 0px;
    border:1px #E5E5E5 solid;
    border-bottom:1px #E5E5E5 solid;    
    cursor:pointer;
    color:#999;
}
.tabbed-button:hover{
    background:#F5F5F5;    
    color:#999;        
}
.tabbed-button-open{
    display:inline-block;
    height:16px;
    width:auto;
    padding:4px;
    margin:0px;
    background:#FFF;
    border-radius:5px 5px 0px 0px;
    -webkit-border-radius:5px 5px 0px 0px;
    border:1px #E5E5E5 solid;
    border-bottom:1px #FFF solid;    
    color:#000;    
}
</style>
نکته کلیدی در این نوع موارد نحوه استفاده از خاصیت position با دو مقدار relative و absolute است، همان طور که ملاحظه می کنید، بلاک والد به صورت relative و بلاک فرزند به صورت absolute مقداردهی شده، این کار باعث می شود تا مرورگر خواص بلاک سطح پائین تر را به صورت تابعی از بلاک اصلی پردازش کند.

مثال و پیش نمایش آنلاین


در زیر مثال و پیش نمایش آنلاین پنل چند سربرگی کامل شده را ملاحظه می کنید.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | ایجاد پنل چند سربرگی در وب</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.tabbed-container{
    position:relative;
    margin-top:12px;
    border:1px solid #FFF;
}
.tabbed-menu{
    margin-top:0px;
    margin-bottom:0px;
    line-height:14px;
    position:absolute;
}
.tabbed-wrapper{
    border:1px solid #E5E5E5;
    margin-top:25px;
    margin-bottom:12px;
    padding:12px;
}
.tabbed-button{
    display:inline-block;
    height:16px;
    width:auto;
    padding:4px;
    margin:0px;
    background:#F9F9F9;
    border-radius:5px 5px 0px 0px;
    -webkit-border-radius:5px 5px 0px 0px;
    border:1px #E5E5E5 solid;
    border-bottom:1px #E5E5E5 solid;    
    cursor:pointer;
    color:#999;
}
.tabbed-button:hover{
    background:#F5F5F5;    
    color:#999;        
}
.tabbed-button-open{
    display:inline-block;
    height:16px;
    width:auto;
    padding:4px;
    margin:0px;
    background:#FFF;
    border-radius:5px 5px 0px 0px;
    -webkit-border-radius:5px 5px 0px 0px;
    border:1px #E5E5E5 solid;
    border-bottom:1px #FFF solid;    
    color:#000;    
}
</style>
<script type="text/javascript">
function closeBox(num){
    //بستن تمام باکس ها در اولین بارگذاری
    for(var i = 1; i <= num; i++){
        document.getElementById("tabbed-box-" + i).style.display = "none";    
    }
}
function openSelected(button, box){
    //باز کردن باکس انتخاب شده در اولین بارگذاری
    document.getElementById(button).className = ("tabbed-button-open");
    document.getElementById(box).style.display = "block";        
}
function openBox(button, box, num){
    var tabbed_div = document.getElementById(box).style.display;
    
    //بستن تمام باکس ها و باز کردن باکس انتخاب شده
    if(tabbed_div != "block"){
        for(var i = 1; i <= num; i++){
            document.getElementById("tabbed-box-" + i).style.display = "none";
            document.getElementById("tabbed-button-" + i).className = ("tabbed-button");
        }        
        document.getElementById(button).className = ("tabbed-button-open");
        document.getElementById(box).style.display = "block";        
    }        
}
</script>
</head>
<body>
<noscript>جاوا اسکریپت در مرورگر شما غیر فعال است یا پشتیبانی نمی شود!</noscript>
<div class="tabbed-container">
<div class="tabbed-menu">
<div class="tabbed-button" id="tabbed-button-1" onclick="openBox(this.id, 'tabbed-box-1', 4);">تیتر دکمه 1</div>
<div class="tabbed-button" id="tabbed-button-2" onclick="openBox(this.id, 'tabbed-box-2', 4);">تیتر دکمه 2</div>
<div class="tabbed-button" id="tabbed-button-3" onclick="openBox(this.id, 'tabbed-box-3', 4);">تیتر دکمه 3</div>
<div class="tabbed-button" id="tabbed-button-4" onclick="openBox(this.id, 'tabbed-box-4', 4);">تیتر دکمه 4</div>
</div>
<div class="tabbed-wrapper">
<div id="tabbed-box-1">محتوای باکس 1</div>
<div id="tabbed-box-2">محتوای باکس 2</div>
<div id="tabbed-box-3">محتوای باکس 3</div>
<div id="tabbed-box-4">محتوای باکس 4</div>
</div>
</div>
<script type="text/javascript">
//بستن تمام باکس ها در اولین بارگذاری
closeBox(4);
//باز کردن باکس انتخاب شده در اولین بارگذاری
openSelected("tabbed-button-1", "tabbed-box-1");
</script>
<hr>
با اندکی آشنایی با CSS و JavaScript می توانید پنل را به صورت سفارشی ویرایش کنید.
</body>
</html>
پیش نمایش
sectionدسته بندی: آموزش کاربردی » JavaScript
related مطالب بیشتر:
» ساخت افکت رنگی با جاوا اسکریپت (Javascript)
» ایجاد باکس جمع شونده با جاوا اسکریپت و دریم ویور
» نحوه ایجاد دکمه رفتن به بالای صفحه (go to top) با جاوا اسکریپت
» نمایش پیام در بالا یا پائین صفحات وبلاگ و سایت با جاوا اسکریپت
» کنترل و تغییر اندازه فونت صفحه با جاوا اسکریپت
commentنظرات (۳۶ یادداشت برای این مطلب ارسال شده است)
نویسنده: طراح جوان
زمان: ۱۶:۱۶:۲۷ - تاریخ: ۱۳۹۲/۱۰/۲۸
فوق العاده کاربردی ؛ مچکرم.
ممنون میشم اگه به سوالاتی که از فرم تماس ازتون میپرسیم جواب بدید.
با تشکر
پاسخ: 
در صورتی که سوالات موارد زیر را شامل نشود حتما به آنها پاسخ داده می شود:
- سوالات کلی و مشکلاتی که رفع آنها نیاز به صرف زمان خیلی زیادی است.
- مشکلاتی که برای رفع آن هیچ تلاشی نکرده باشید.
- سوالات حاوی کدها و اسکریپت های حجیم و خیلی طولانی.
- درخواست کد و اسکریپت آماده.
- درج ایمیل اشتباه.
نویسنده: حسین
زمان: ۱۸:۲۳:۴۹ - تاریخ: ۱۳۹۲/۱۱/۰۳
با سلام
من یه سوال داشتم در مورد این که چه طور صفحه اصلی سایت مان فقط در مرورگر های خاصی باز شود. مثلا در همه ی مرورگر ها به جز اینترنت اکسپلورر مشاهده شود.
از سایت خوبتون ممنونم خواهش می کنم جوابم رو بدید!!!
پاسخ: 
سلام
برای این کار باید از PHP استفاده کنید، مثال:
<?php
if(preg_match('/MSIE/i', $_SERVER['HTTP_USER_AGENT'])){
header("Location: http://webgoo.ir");
exit;
}
?>
نویسنده: RapiD
زمان: ۲۰:۵۴:۴۸ - تاریخ: ۱۳۹۲/۱۱/۰۳
عالی بود ممنون
یک آموزش هم برای انواع هاور کردن در CSS آموزش بدید مثلا یکی از آموزش هایی که در وب فارسی خیلی خیلی کمه هاور کردن از پایین به بالا مثلا یک عکس هستش که به این صورت که موقع هاور شدن عکس به بالا بره و عکس زیریش مشاهده بشه .. نمیدونم متوجه شدید منظورم رو یا نه ... ممنون
پاسخ: 
آموزش مد نظر شما مبحث زیادی ندارد که در یک مطلب جداگانه مطرح شود، کافی است یک بلاک با عرض و ارتفاع مشخص تعریف (به فرض div با عرض و ارتفاع 24 پیکسل) و برای پس زمینه آن یک عکس با ارتفاع دو برابر ارتفاع بلاک داشته باشید (یعنی عکسی با ابعاد 24 در 48 پیکسل) که تصویر حالت عادی (24 پیکسل) در بالا و تصویر حالت فعال در پائین باشد، سپس در استایل CSS مربوط به بلاک، در حالت عادی پس زمینه را به صورت نمونه زیر داشته باشید:
background:url(image/bg.png) top no-repeat;
و در حالت فعال پس زمینه را به صورت زیر تغییر دهید:
background:url(image/bg.png) bottom no-repeat;
نویسنده: حمید
زمان: ۰۱:۵۸:۴۱ - تاریخ: ۱۳۹۲/۱۱/۰۵
واقعا بحث خیلی کاربردی را مطرح کردید من خیلی خوش حال شدم.
ممنون.
نویسنده: رویا
زمان: ۱۸:۴۸:۱۶ - تاریخ: ۱۳۹۲/۱۱/۰۵
من با واژه های پنل - افکت - باکس آشنایی ندارم میشه بیشتر توضیح بدهید ممنون میشم
پاسخ: 
لطفا در فرهنگ لغات انگلیسی - فارسی جستجو کنید!
نویسنده: الهام
زمان: ۲۰:۲۵:۲۳ - تاریخ: ۱۳۹۲/۱۱/۱۳
سلام
من چهار تا فرم طراحی کرده بودم که می خواستم به شکل چند برگی در بیاد. به جای کلمه محتوای باکس ها کد های فرم هام را با head ,body مختص به خودش قرار دادم. هر فرمم دارای اعتبارسنجی مختص به خودش است. حالا فقط در پیش نمایشم فرم اول را نمایش میده با اعتبار سنجی های مربوط به صفحه آخرم. بقیه ی سربرگها هم هیچگونه نمایشی وجود نداره. چی کار کنم؟؟؟؟
پاسخ: 
سلام
نباید در یک صفجه HTML از چند تگ body و head استفاده کنید، هر چند به ظاهر سربرگ ها متفاوت هستند، اما این حالت فقط نمایشی است و در سورس صفحه مانند یک صفحه معمولی کدهای HTML تعریف می شوند، فرم ها نیز نباید چند گانه باشند (اگر باشند باید هر کدام یک دکمه ارسال داشته باشند که در این صورت چند سربرگی بودن خیلی ضرورتی ندارد و منطقی نیست).
نویسنده: مهسا
زمان: ۱۸:۳۲:۳۷ - تاریخ: ۱۳۹۲/۱۱/۱۵
در مورد Captcha هم یه اموزش بذارید. واسه اشنایی بیشتر و افکت هایی که میشه به اعداد و حروف یا پس زمینه و این چیزا بهش داد
پاسخ: 
در کوتاه مدت امکانپذیر نیست، در صورت امکان در مطالب آینده منتشر خواهد شد.
نویسنده: وحید
زمان: ۲۰:۴۱:۴۵ - تاریخ: ۱۳۹۲/۱۱/۱۶
سلام خسته نباشید
حتما دیدین بعضی از سایت ها یه قسمت دارن که دقایق حضور اون کاربر رو نشون میده
مثلا یه ساعت تو سایت انلاین باشی می نویسه :
دقایق فعال : 60 دقیقه
حتما تو پایگاه داده برای هر کاربر به صورت جدا محاسبه و ذخیره میشه.
میشه راهنمایی و یه مثال بزنید اگه امکانش هست
ممنون
پاسخ: 
سلام
برای این کار باید چند مبحث مختلف را فرا بگیرید:
- بحث سشن ها و کوکی در PHP.
- بحث تاریخ و زمان در PHP.
- بحث تاریخ و زمان در جاوا اسکریپت (در صورتی که نیاز به نمایش به صورت زنده و... باشد).
مثال ساده ای برای این کار وجود ندارد، باید یک سیستم طراحی کنید که بسته به هدف شما کار ذخیره و به روزرسانی تاریخ در دیتابیس و همچنین نمایش به کاربر را انجام دهد.
نویسنده: کاناپه بادی
زمان: ۱۱:۳۶:۵۳ - تاریخ: ۱۳۹۲/۱۱/۳۰
با تشکر از مطالب خوبتون
نویسنده: شریف
زمان: ۰۹:۵۷:۰۹ - تاریخ: ۱۳۹۲/۱۲/۰۸
با تشکر فراوان از سایت خوبتون
پیرو سوال دوستمون RapiD این رو نوشتم ولی کار نکرد
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ساخت منوی اینتراکتیو</title>
</head>

<body>
<head>
<style type="text/css">
<!--
#b a{
display:block;
width:100px;
height:75px;
background:url(images/sub_1.jpg) top no-repeat;
}
#b a:hover, #b a:focus{
background:url(images/sub_1.jpg) bottom no-repeat;
}
-->
</style>
</head>
<body>
<div id="b">
<a href="#">text</a>
</div>
</body>
</html>
پاسخ: 
کد شما اصلاح شد!
نویسنده: علی
زمان: ۱۳:۲۹:۴۴ - تاریخ: ۱۳۹۲/۱۲/۰۸
سلام سایتتون واقعا آموزش های مفیدی میزاره و خیلی چیزا از شما یاد گرفتم !
با تشکر - موفق باشید
www.best-web.ir
زمان: ۱۲:۲۷:۲۴ - تاریخ: ۱۳۹۲/۱۲/۱۲
با تشکر از مطالب خوبتون
زمان: ۱۲:۳۰:۵۸ - تاریخ: ۱۳۹۲/۱۲/۱۲
فوق العاده بود ممنون
نویسنده: میثم
زمان: ۱۷:۴۶:۵۳ - تاریخ: ۱۳۹۲/۱۲/۱۵
مرسی مثل همیشه عالی بود
نویسنده: mavg
زمان: ۱۹:۴۵:۵۱ - تاریخ: ۱۳۹۲/۱۲/۱۵
ممنون از آموزشهای جالب شما در مثال عنوان شده اگر بخواهیم بجای محتوای باکس یکسری از مطالب شامل پاراگراف و عکس و غیره نمایش داه شود چکار باید کنیم؟ و اصولا می توامن در یک فایل HTML فایل دیگری را صدا زده تا محتویات آن اجرا گردد اگر نه روش اصولی چیست؟
پاسخ: 
اگر با HTML آشنا باشید، می دانید که درون تگ های div می توانید هر نوع محتوای مد نظرتان را درج کنید، این محتوا هم می تواند شامل تگ ها (به طور مثال تصویر) باشد هم شامل متن ساده، در اینجا هم کافی است به جای عبارت های پیش فرض محتوای مد نظرتان را قرار دهید، در مورد بخش دوم سوال، در HTML امکان ورود اطلاعات فایل دیگر در صفحه وجود ندارد، البته با Ajax این کار ممکن است که آموزش های خاص خود را دارد.
paged صفحه 1 از 3




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

2 × 5
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...