شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

ایجاد پنل جمع شونده با جاوا اسکریپت و فریم ورک Spry

javascript

از جمله امکانات مورد نیاز در طراحی رابط کاربری سایت ها و وبلاگ ها پنل های جمع شونده (Collapsible Panel) هستند که می توان از آنها برای نمایش امکاناتی نظیر منوی سایت یا دسته بندی محتوای طولانی و مواردی از این دست استفاده کرد، روش ایجاد این پنل ها نیز بسته به نیاز و هدف برنامه نویس صفحه وب می تواند متفاوت باشد از جمله استفاده از کتابخانه جاوا اسکریپتی جی کوئری (jQuery)، کتابخانه موتولز (Mootools)، استفاده از کدها و توابع خودنوشت و...  به هر صورت در این مطلب قصد داریم آموزش ایجاد پنل جمع شونده را به کمک جاوا اسکریپت (JavaScript) و فریم ورک Spry (که در برخی نسخه های برنامه ادوبی دریم ویور (Adobe Dreamweaver) نیز استفاده شده) ارائه کنیم، کد ارائه شده در این مطلب در عین سبکی (کم حجمی) از قابلیت سازگاری خوبی با مرورگرهای استاندارد برخوردار است و در کنار کدهای جاوا اسکریپت قابلیت ایجاد تغییرات سفارشی از طریق ویرایش فایل CSS نیز وجود دارد که می توانید بر اساس سلیقه خودتان آن را تنظیم کنید.

استفاده از فریم ورک Spry برای ایجاد پنل جمع شونده


Spry عنوان فریم ورک جاوا اسکریپتی است که توسط شرکت ادوبی (Adobe) به صورت متن باز (Open-source) توسعه یافته، از این فریم ورک می توان در ایجاد امکانات مورد نیاز در طراحی رابط کاربری صفحات وب استفاده کرد که یکی از این امکانات می تواند پنل های جمع شونده یا به اصطلاح Collapsible Panel باشد، در نمونه کد زیر نحوه ایجاد دو پنل جمع شونده به کمک این فریم ورک را ملاحظه می کنید:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ایجاد پنل جمع شونده با فریم ورک Spry</title>
<!-- Webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
</style>
<script src="SpryAssets/SpryCollapsiblePanel.js" type="text/javascript"></script>
<link href="SpryAssets/SpryCollapsiblePanel.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="CollapsiblePanel1" class="CollapsiblePanel">
  <div class="CollapsiblePanelTab">منو</div>
  <div class="CollapsiblePanelContent">نمایش محتوای شما!</div>
</div>
<div id="CollapsiblePanel2" class="CollapsiblePanel">
  <div class="CollapsiblePanelTab">منو</div>
  <div class="CollapsiblePanelContent">نمایش محتوای شما!</div>
</div>
<script type="text/javascript">
var CollapsiblePanel1 = new Spry.Widget.CollapsiblePanel("CollapsiblePanel1");
var CollapsiblePanel2 = new Spry.Widget.CollapsiblePanel("CollapsiblePanel2");
</script>
</body>
</html>
پیش نمایش
توضیح:
- به محل قرار گیری فایل ها و تگ های جاوا اسکریپت دقت کنید، فایل SpryCollapsiblePanel.js و SpryCollapsiblePanel.css را در قسمت head صفحه ایمپورت کرده و تکه کد مربوط به اسکریپت (تعریف متغیر CollapsiblePanel و فراخوانی متد) را پس از تگ div اصلی پنل قرار دهید.
- با ویرایش فایل SpryCollapsiblePanel.css می توانید تنظیمات ظاهری و استایل دلخواه خود را اعمال کنید.
- برای ایجاد پنل های مختلف در یک صفحه باید ابتدا به هر بلاک اصلی div، یک آی دی اختصاص دهید سپس در قسمت اسکریپت در زیر متغیر CollapsiblePanel1 آن آی دی را در متغیری جدید (به فرض CollapsiblePanel2) اضافه کنید (در نمونه کد دو پنل ایجاد شده که با پیروی از ترتیب شماره گذاری ها می توان به هر تعداد پنل در صفحه ایجاد کرد).

دانلود فایل های پنل جمع شونده با Spry


برای بدست آوردن نمونه سورس کد و فایل JS و CSS پنل، می توانید بر روی لینک پیش نمایش (در بالا) کلیک کرده سپس از سورس کد صفحه استفاده نمائید، همچنین کل فایل ها به صورت یکجا از لینک زیر قابل دریافت است:
دانلود فایل های پنل جمع شونده با Spry
دسته بندی: آموزش کاربردی » JavaScript
related مطالب بیشتر:
اعتبارسنجی فرم های وب با جاوا اسکریپت (JavaScript)
ساخت پنل چند سربرگی (Tabbed Panel) با جاوا اسکریپت و CSS
چگونه لوگوی حمایتی برای نمایش در سایت یا وبلاگ بسازیم؟
کنترل و تغییر اندازه فونت صفحه با جاوا اسکریپت
ساخت افکت رنگی با جاوا اسکریپت (JavaScript)
دیدگاه
more ۲۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
مصطفی
۱۱:۱۳ ۱۳۹۵/۰۶/۰۶
سلام. لطفا راهنمایی کنید که وقتی روی یک پنل کلیک میکنیم دیگر پنل ها بسته بشوند یا به عبارتی فقط یک پنل همیشه باز بشه؟
انجام این کار ساده نیست، باید متدهای موجود در فایل JS پنل را ویرایش کنید، به طور مثال متد زیر باید به این صورت تغییر داده شود:
Spry.Widget.CollapsiblePanel.prototype.onTabClick = function(a)
{
if (this.isOpen())
this.close();
else
{
CollapsiblePanel1.close();
CollapsiblePanel2.close();
CollapsiblePanel3.close();
CollapsiblePanel4.close();
CollapsiblePanel5.close();
CollapsiblePanel6.close();
CollapsiblePanel7.close();
CollapsiblePanel8.close();
this.open();
}

this.focus();
return this.stopPropagation(a);
};
افشین عربی
۱۲:۱۶ ۱۳۹۵/۰۵/۱۵
این در حالت پیشفرض بازه چجوری میشه حالت پیشفرض رو به بسته برگردوند
متاسفانه تغییر حالت پیش فرض این اسکریپت به راحتی میسر نیست و باید سورس کدهای آن با دقت و حوصله بررسی و ویرایش شوند!
علی
۱۶:۱۱ ۱۳۹۴/۰۳/۱۷
سلام
ممنون از مطالب خوبتون
محمد
۱۵:۳۲ ۱۳۹۳/۱۰/۲۸
سلام خسته نباشید میخواستم بپرستم برای ایجاد باتن های که این صفحه وب شما وقتی موس روش قرار میگیره خود کار باز و بسته می شوند چه کار کنم مثل آموزش مقدماتی که وقتی موس روی اون قرار میگره خود به خود باز میشه و زیر مجموعش نمایش داده میشه تر خدا کمکم کنید خیلی لازم دارم ممنون
اینها باتن نیستند! به اینها در وب منوی آبشاری گفته می شود، لطفا عبارت "ساخت منوی آبشاری با تگ ul li و CSS" را در وب جستجو کنید، آموزش های جداگانه ای وجود دارد.
مهدی
۲۲:۴۶ ۱۳۹۳/۰۲/۲۷
ممنونم مشکلم حل شد
مهدی
۲۱:۰۷ ۱۳۹۳/۰۲/۲۶
ميشه يکم بيشتر توضيح بديد
هيچ جا متغير يا نامي مثل CollapsiblePanel نيست
لطفا نمونه سورس کدها را بررسی کنید، به تعداد زیاد از عبارت "CollapsiblePanel" استفاده شده!
مهدی
۱۲:۱۰ ۱۳۹۳/۰۲/۲۵
با سلام
چطوری میتونم منوها رو اضافه کنم بطوری که مثل دو تای اولی باز و بسته بشه
اخه الان ساختم ولی باز و بسته نمیشن
از الگوی منوها استفاده کنید، در دو بخش باید منوی جدید را تعریف کنید، یکی در قسمت تعریف بلاک div با آی دی منحصر بفرد (به فرض CollapsiblePanel3) و یکی در کدهای جاوا اسکریپت و به فرض var CollapsiblePanel3، اگر هر دو حالت را درست انجام دهید، منو کار خواهد کرد.
davood
۱۰:۱۶ ۱۳۹۳/۰۱/۲۰
سلام دم شما گرم آموزش خوبی بود
TNX
۱۶:۲۴ ۱۳۹۲/۱۰/۰۷
این قسمت رو تو برنامه پیدا نکردم..!
از منوی Insert گزینه Spry ابزار Spry Accordion را انتخاب کنید.
۱۹:۳۴ ۱۳۹۲/۱۰/۰۶
میشه لطف کنید کدهای javascript و css رو قرار بدید تا بصورت داخلی توی سایت بذاریم؟ تشکر
متاسفانه به دلیل طولانی بودن بیش از حد کدهای جاوا اسکریپت این آموزش، امکان درج آنها به صورت مستقیم فراهم نیست، لطفا از نرم افزار دریم ویور یا فایل هایی که در سورس کد پیش نمایش وجود دارد استفاده کنید.
افشین
۰۱:۵۶ ۱۳۹۲/۰۹/۲۵
چرا وقتی کلید منو بالای قسمت باز شونده است کار می کند
ولی اگر کلید منو را زیر قسمت باز شونده بگذاریم کار نمیکند
هسته اسکریپت طوری نوشته شده که از این لحاظ خیلی قابل تغییر و سفارشی سازی نیست (حداقل در بررسی های اولیه این طور به نظر می رسد).
نیما
۲۰:۳۰ ۱۳۹۲/۰۸/۰۷
خیلی ممنون استاد ، بابت پاسختون واقعا کلافه شده بودم
نیما
۲۱:۳۰ ۱۳۹۲/۰۸/۰۶
سلام ، خیلی ممون از سایت خوبتون
من یه سوال داشتم ، چطور میتونم وقتی Combobox رو انتخاب میکنم مثلا وقتی گزینه اول باشه یه عنصری رو مخفی کنه و دومی نمایش بده ، میشه کمکم کنین استاد ؟
این مورد را باید با JavaScript کدنویسی کنید، به تگ select رویداد onchange اختصاص دهید و با this.value مقادیر تگ را به عنوان آرگومان به یک تابع بدهید:
<script type="text/javascript">
function changeIt(value, num){
//بستن تمام باکس ها
for(var i = 1; i <= num; i++){
document.getElementById('box-' + i).style.display = 'none';
}
//نمایش انتخاب شده
document.getElementById('box-' + value).style.display = 'block';
}
</script>
<select onchange="changeIt(this.value, 3);">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<div id="box-1">متن 1</div>
<div id="box-2">متن 2</div>
<div id="box-3">متن 3</div>
مسعود
۲۲:۰۹ ۱۳۹۲/۰۵/۲۸
با سلام . ببخشید استاد من اگه خواسته باشم وقتی روی دکمه "منو" کلیک می کنم که صفحه باز و بسته میشه ، وقتی روش کلیک شد (منو) مثلا نوشته منو عوض بشه به یه کلمه دیگه مثلا "باز" چی کار باید بکنم ؟
برای این کار باید ابتدا یک id به عنوان منوها اختصاص دهید، سپس با رویدادهایی مانند onclick در جاوا اسکریپت یک تابع را فراخوانی کنید که به فرض با متد innerHTML مقادیر عنوان منو را به صورت داینامیک تغییر دهد، نوشتن این تابع نیاز به صرف مدت زمانی است که متاسفانه به دلیل کمبود فرصت از انجام آن معذوریم.
مسعود
۲۱:۳۶ ۱۳۹۲/۰۵/۲۸
با سلام .
استاد ببخشید من این کد رو می خواستم استفاده کنم جوری که مثلا چند تا باکس باشه . بعد شما گفتین که آیدیش باید تغییر کنه فقط و مثلا 1 و 2 هست تو باکس بعدی بشه 3 و 4 .
این کد منو یه نگاه بندازین خواهشا ببینید باید چی کار کنم!
<?php
if (mysql_num_rows($man) > 0)
{
$i=0 ;
$j= 1 ;
while ($row_manage = mysql_fetch_array($man))
{
$matn .= '

<div class="div">
<div class="title_s">
<div class="date_sms"> 1392/05/27 </div>
<div class="title_sms">'
.$row_manage['subject'].' </div>
</div>
<div class="line"> </div>
<br />
<br />
'
.$row_manage['description'].'
<div id="CollapsiblePanel1" class="div2">
<a class="CollapsiblePanelTab">ادامه مطلب</a>
<div class="div1">
<br />
<br />
'
.$row_manage['con_description'].'
</div>
</div>
</div>
<script type="text/javascript">
var CollapsiblePanel'
.$i.' = new Spry.Widget.CollapsiblePanel("CollapsiblePanel'.$i.'",{contentIsOpen:false, openClass:"CollapsiblePanelClose"});
var CollapsiblePanel'
.$j.' = new Spry.Widget.CollapsiblePanel("CollapsiblePanel'.$j.'");
</script>

'
;

$i = $i + 2 ;
$j = $i + 1 ;
}
}
?>
نباید کدها را حساب نشده بنویسید! ابتدا به خروجی مورد انتظار نگاه کنید، در قسمت تب ها نیاز به تکرار بلاک های CollapsiblePanel با شماره id متفاوت دارید، این مورد را می توان در حلقه while خروجی گرفت، اما اگرچه قسمت داخل تگ script باید به همین صورت تکرار شود، اما خود تگ اسکریپت تنها یک بار باید چاپ گردد، لذا باید با شرط در حلقه باشد، نکته دیگر اینکه باید متغیری داشته باشید که در هر دور حلقه تنها یک واحد افزایش پیدا کند:
<?php
if (mysql_num_rows($man) > 0)
{
$i=1 ;
while ($row_manage = mysql_fetch_array($man))
{
$matn .= '<div class="div">
<div class="title_s">
<div class="date_sms"> 1392/05/27 </div>
<div class="title_sms">'
.$row_manage['subject'].' </div>
</div>
<div class="line"> </div>
<br />
<br />
'
.$row_manage['description'].'
<div id="CollapsiblePanel'
. $i .'" class="div2">
<a class="CollapsiblePanelTab">ادامه مطلب</a>
<div class="div1">
<br />
<br />
'
.$row_manage['con_description'].'
</div>
</div>
</div>'
;
if($i <= 1){
$matn .= '<script type="text/javascript">';
}

$matn .= 'var CollapsiblePanel'.$i.' = new Spry.Widget.CollapsiblePanel("CollapsiblePanel'.$i.'",{contentIsOpen:false, openClass:"CollapsiblePanelClose"});';

if($i == mysql_num_rows($man)){
$matn .= '</script>';
}

$i++;
}
}
?>
نکته: کد تست نشده اما قاعدتا باید طبق چنین الگویی خروجی مورد نظر را چاپ کنید.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
9 × 7
20 × 20
=