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

استفاده از پنل چند سربرگی یا 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>
<!-- https://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>
پیش نمایشدسته بندی: آموزش کاربردی » JavaScript
برچسب ها: JavaScript - طراحی وب
« بعدی

ایجاد پنل جمع شونده با جاوا اسکریپت و فریم ورک Spry
ساخت دکمه رفتن به بالای صفحه (Scroll to Top) با جاوا اسکریپت
نمایش پیام در حال بارگذاری با جاوا اسکریپت (JavaScript)
چگونه لوگوی حمایتی برای نمایش در سایت یا وبلاگ بسازیم؟
نمایش کادر پیام شناور در سایت و وبلاگ با جاوا اسکریپت
دیدگاه


مهدی
۲۰:۱۲ ۱۳۹۳/۰۲/۲۲
با سلام و تشکر از سایت خوبتون
من این پنل رو درست کردم ولی وفتی سربرگ جدید ساختم و واردش شدم و میخوام به سربرگ دیگه ای برم سربرگی که ساخته بودم و قبل از اون باز کردم باز میمونه
من این پنل رو درست کردم ولی وفتی سربرگ جدید ساختم و واردش شدم و میخوام به سربرگ دیگه ای برم سربرگی که ساخته بودم و قبل از اون باز کردم باز میمونه
سلام
کد همراه پیش نمایش آنلاین ارائه شده، لذا قاعدتا اشتباهی در صفحه شما وجود دارد، باید سورس صفحه را دید و بررسی کرد.
کد همراه پیش نمایش آنلاین ارائه شده، لذا قاعدتا اشتباهی در صفحه شما وجود دارد، باید سورس صفحه را دید و بررسی کرد.
۱۶:۲۱ ۱۳۹۳/۰۲/۱۳
سوالی در خصوص مشکل اختلاط محتوای صفحات چند پنلی کرده بودم که با دقت در کدهای نوشته شده رفع گردید از شما متشکرم
elham
۱۰:۵۲ ۱۳۹۳/۰۱/۳۰
با سلام
ممنون مطلبتون عالی و مفید بود
امیدوارم موفق باشید
ممنون مطلبتون عالی و مفید بود
امیدوارم موفق باشید
۰۷:۱۸ ۱۳۹۳/۰۱/۲۰
با سلام
وبسایت واقعا مفیدی در آموزش برنامه نویسی دارید امیدوارم که هرروز شاهد پیشرفت روزافزون شما باشم
رحمت شریفی
مدیر وبسایت تکنولوژیفا
وبسایت واقعا مفیدی در آموزش برنامه نویسی دارید امیدوارم که هرروز شاهد پیشرفت روزافزون شما باشم
رحمت شریفی
مدیر وبسایت تکنولوژیفا
۱۶:۵۲ ۱۳۹۳/۰۱/۱۴
از روش پنل چند برگی استفاده نموده ام لیکن در هنگام مشاهده سایت محتویات برگه ها روی هم نمایش داده می شود. راه حل چیست؟
لطفا مثال و پیش نمایش آنلاین را با کدهای درج شده در سایتتان مقایسه کنید! طبق بررسی ما بخش اصلی کدها را درج نکرده اید!
۱۰:۵۵ ۱۳۹۳/۰۱/۰۴
در وب سایت خود از روش پنل چند سربرگی شما استفاده نموده ام لیکن وقتی تحت وردپرس بالا می آید همه مطالب گنجانده شده در هر سربرگی به طور یکجا نمایش داده شده و مطالب با هم ادغام می شود
باید ببینید آیا سورس های لازم برای اجرای پنل به درستی در صفحه وارد شده اند، به خصوص قسمت مربوط به کدهای جاوا اسکریپت، در هر صورت حل مشکل نیازمند بررسی بیشتر است.
۱۳:۴۶ ۱۳۹۲/۱۲/۱۹
سلام ، بسیار عالی بود موفق باشید
mavg
۱۹:۴۵ ۱۳۹۲/۱۲/۱۵
ممنون از آموزشهای جالب شما در مثال عنوان شده اگر بخواهیم بجای محتوای باکس یکسری از مطالب شامل پاراگراف و عکس و غیره نمایش داه شود چکار باید کنیم؟ و اصولا می توامن در یک فایل HTML فایل دیگری را صدا زده تا محتویات آن اجرا گردد اگر نه روش اصولی چیست؟
اگر با HTML آشنا باشید، می دانید که درون تگ های div می توانید هر نوع محتوای مد نظرتان را درج کنید، این محتوا هم می تواند شامل تگ ها (به طور مثال تصویر) باشد هم شامل متن ساده، در اینجا هم کافی است به جای عبارت های پیش فرض محتوای مد نظرتان را قرار دهید، در مورد بخش دوم سوال، در HTML امکان ورود اطلاعات فایل دیگر در صفحه وجود ندارد، البته با Ajax این کار ممکن است که آموزش های خاص خود را دارد.
۱۷:۴۶ ۱۳۹۲/۱۲/۱۵
مرسی مثل همیشه عالی بود
۱۳:۲۹ ۱۳۹۲/۱۲/۰۸
سلام سایتتون واقعا آموزش های مفیدی میزاره و خیلی چیزا از شما یاد گرفتم !
با تشکر - موفق باشید
با تشکر - موفق باشید
www.best-web.ir
شریف
۰۹:۵۷ ۱۳۹۲/۱۲/۰۸
با تشکر فراوان از سایت خوبتون
پیرو سوال دوستمون RapiD این رو نوشتم ولی کار نکرد
پیرو سوال دوستمون 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>
کد شما اصلاح شد!
وحید
۲۰:۴۱ ۱۳۹۲/۱۱/۱۶
سلام خسته نباشید
حتما دیدین بعضی از سایت ها یه قسمت دارن که دقایق حضور اون کاربر رو نشون میده
مثلا یه ساعت تو سایت انلاین باشی می نویسه :
دقایق فعال : 60 دقیقه
حتما تو پایگاه داده برای هر کاربر به صورت جدا محاسبه و ذخیره میشه.
میشه راهنمایی و یه مثال بزنید اگه امکانش هست
ممنون
حتما دیدین بعضی از سایت ها یه قسمت دارن که دقایق حضور اون کاربر رو نشون میده
مثلا یه ساعت تو سایت انلاین باشی می نویسه :
دقایق فعال : 60 دقیقه
حتما تو پایگاه داده برای هر کاربر به صورت جدا محاسبه و ذخیره میشه.
میشه راهنمایی و یه مثال بزنید اگه امکانش هست
ممنون
سلام
برای این کار باید چند مبحث مختلف را فرا بگیرید:
- بحث سشن ها و کوکی در PHP.
- بحث تاریخ و زمان در PHP.
- بحث تاریخ و زمان در جاوا اسکریپت (در صورتی که نیاز به نمایش به صورت زنده و... باشد).
مثال ساده ای برای این کار وجود ندارد، باید یک سیستم طراحی کنید که بسته به هدف شما کار ذخیره و به روزرسانی تاریخ در دیتابیس و همچنین نمایش به کاربر را انجام دهد.
برای این کار باید چند مبحث مختلف را فرا بگیرید:
- بحث سشن ها و کوکی در PHP.
- بحث تاریخ و زمان در PHP.
- بحث تاریخ و زمان در جاوا اسکریپت (در صورتی که نیاز به نمایش به صورت زنده و... باشد).
مثال ساده ای برای این کار وجود ندارد، باید یک سیستم طراحی کنید که بسته به هدف شما کار ذخیره و به روزرسانی تاریخ در دیتابیس و همچنین نمایش به کاربر را انجام دهد.
۱۸:۳۲ ۱۳۹۲/۱۱/۱۵
در مورد Captcha هم یه اموزش بذارید. واسه اشنایی بیشتر و افکت هایی که میشه به اعداد و حروف یا پس زمینه و این چیزا بهش داد
در کوتاه مدت امکانپذیر نیست، در صورت امکان در مطالب آینده منتشر خواهد شد.
الهام
۲۰:۲۵ ۱۳۹۲/۱۱/۱۳
سلام
من چهار تا فرم طراحی کرده بودم که می خواستم به شکل چند برگی در بیاد. به جای کلمه محتوای باکس ها کد های فرم هام را با head ,body مختص به خودش قرار دادم. هر فرمم دارای اعتبارسنجی مختص به خودش است. حالا فقط در پیش نمایشم فرم اول را نمایش میده با اعتبار سنجی های مربوط به صفحه آخرم. بقیه ی سربرگها هم هیچگونه نمایشی وجود نداره. چی کار کنم؟؟؟؟
من چهار تا فرم طراحی کرده بودم که می خواستم به شکل چند برگی در بیاد. به جای کلمه محتوای باکس ها کد های فرم هام را با head ,body مختص به خودش قرار دادم. هر فرمم دارای اعتبارسنجی مختص به خودش است. حالا فقط در پیش نمایشم فرم اول را نمایش میده با اعتبار سنجی های مربوط به صفحه آخرم. بقیه ی سربرگها هم هیچگونه نمایشی وجود نداره. چی کار کنم؟؟؟؟
سلام
نباید در یک صفحه HTML از چند تگ body و head استفاده کنید، هر چند به ظاهر سربرگ ها متفاوت هستند، اما این حالت فقط نمایشی است و در سورس صفحه مانند یک صفحه معمولی کدهای HTML تعریف می شوند، فرم ها نیز نباید چند گانه باشند (اگر باشند باید هر کدام یک دکمه ارسال داشته باشند که در این صورت چند سربرگی بودن خیلی ضرورتی ندارد و منطقی نیست).
نباید در یک صفحه HTML از چند تگ body و head استفاده کنید، هر چند به ظاهر سربرگ ها متفاوت هستند، اما این حالت فقط نمایشی است و در سورس صفحه مانند یک صفحه معمولی کدهای HTML تعریف می شوند، فرم ها نیز نباید چند گانه باشند (اگر باشند باید هر کدام یک دکمه ارسال داشته باشند که در این صورت چند سربرگی بودن خیلی ضرورتی ندارد و منطقی نیست).
۱۸:۴۸ ۱۳۹۲/۱۱/۰۵
من با واژه های پنل - افکت - باکس آشنایی ندارم میشه بیشتر توضیح بدهید ممنون میشم
لطفا در فرهنگ لغات انگلیسی - فارسی جستجو کنید!
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.