Offcanvas در بوتاسترپ یک مؤلفهی پویا و چندمنظوره است برای ایجاد پنلهای جانبی مخفی که میتوانند از چپ، راست، بالا یا پایین صفحه به نمایش درآیند. آن را مانند یک کشوی واکنشگرا در نظر بگیرید که بدون ایجاد اختلال در محتوای اصلی، بهصورت کشویی ظاهر میشود تا ناوبری اضافی، محتوای تکمیلی، پنلهای تنظیمات یا هر اطلاعات دیگری را نمایش دهد. برخلاف مدالها که تمام صفحه را پوشش میدهند، Offcanvas روشی زمینهمحور و کمتر مزاحم برای ارائهی رابطهای ثانویه است. این راهنمای جامع، به بررسی ساختار، گزینههای مکانیابی، ویژگیهای پیشرفته، ملاحظات دسترسیپذیری، و استراتژیهای پیادهسازی خلاقانهی Offcanvas میپردازد.
ساختار پایه Offcanvas (کلاس .offcanvas
)
مؤلفهی Offcanvas در بوتاسترپ شامل یک عنصر اصلی با کلاس .offcanvas
است که باید دارای شناسهای منحصربهفرد و ویژگیهایی برای کنترل و فعالسازی باشد:
.offcanvas
: کانتینر اصلی. باید دارایid
منحصر بهفرد، ویژگیtabindex="-1"
برای دسترسیپذیری، وaria-labelledby
برای ارجاع به عنوان پنل باشد..offcanvas-header
: معمولاً شامل عنوان پنل با کلاس.offcanvas-title
و یک دکمهی بستن است..offcanvas-body
: بخش اصلی برای قرار دادن لینکها، فرمها، یا دیگر عناصر.
نمونه HTML:
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Offcanvas Right</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the right-sliding offcanvas.
</div>
</div>
<div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel" style="height: 50vh;">
<div class="offcanvas-header">
<h5 id="offcanvasTopLabel">Offcanvas Top</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the top-sliding offcanvas. The `height` can be adjusted with inline styles or CSS.
</div>
</div>
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel" style="height: 50vh;">
<div class="offcanvas-header">
<h5 id="offcanvasBottomLabel">Offcanvas Bottom</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the bottom-sliding offcanvas. The `height` can be adjusted.
</div>
</div>

موقعیت پنل (کلاسهای .offcanvas-*
)
چهار موقعیت اصلی وجود دارد:
.offcanvas-start
: از سمت چپ وارد میشود..offcanvas-end
: از سمت راست وارد میشود..offcanvas-top
: از بالا وارد میشود..offcanvas-bottom
: از پایین وارد میشود.
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 id="offcanvasRightLabel">Offcanvas Right</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the right-sliding offcanvas.
</div>
</div>
<div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel" style="height: 50vh;">
<div class="offcanvas-header">
<h5 id="offcanvasTopLabel">Offcanvas Top</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the top-sliding offcanvas. The `height` can be adjusted with inline styles or CSS.
</div>
</div>
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel" style="height: 50vh;">
<div class="offcanvas-header">
<h5 id="offcanvasBottomLabel">Offcanvas Bottom</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the bottom-sliding offcanvas. The `height` can be adjusted.
</div>
</div>

کنترل پسزمینه (ویژگی data-bs-backdrop
)
این ویژگی مشخص میکند که آیا هنگام نمایش پنل، بکدراپ (پردهی نیمهشفاف) ظاهر شود یا خیر:
true
(پیشفرض): پرده نیمهشفاف اضافه میشود.false
: بدون پرده. کلیک بیرون پنل تأثیری ندارد.static
: پرده نمایش داده میشود، اما کلیک بیرون پنل آن را نمیبندد.
<div class="offcanvas offcanvas-start" data-bs-backdrop="false" tabindex="-1" id="offcanvasNoBackdrop" aria-labelledby="offcanvasNoBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasNoBackdropLabel">Offcanvas with no backdrop</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Click outside this offcanvas, and it won't close.
</div>
</div>
<div class="offcanvas offcanvas-start" data-bs-backdrop="static" tabindex="-1" id="offcanvasStaticBackdrop" aria-labelledby="offcanvasStaticBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasStaticBackdropLabel">Offcanvas with static backdrop</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Clicking outside this offcanvas won't close it. You have to use the close button.
</div>
</div>

کنترل تعامل با کیبورد (ویژگی data-bs-keyboard
)
true
(پیشفرض): فشردن کلید Esc پنل را میبندد.false
: کلید Esc بیاثر خواهد بود.
<div class="offcanvas offcanvas-start" data-bs-keyboard="false" tabindex="-1" id="offcanvasNoKeyboard" aria-labelledby="offcanvasNoKeyboardLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasNoKeyboardLabel">Offcanvas - no keyboard close</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Pressing the Escape key won't close this offcanvas.
</div>
</div>

API جاوااسکریپت و رویدادها
رویدادهای قابل شنود:
show.bs.offcanvas
: پیش از نمایش.shown.bs.offcanvas
: پس از نمایش کامل.hide.bs.offcanvas
: پیش از بسته شدن.hidden.bs.offcanvas
: پس از بسته شدن کامل.
مثال:
const myOffcanvas = document.getElementById('offcanvasExample');
myOffcanvas.addEventListener('show.bs.offcanvas', () => {
console.log('Offcanvas is about to be shown.');
});
myOffcanvas.addEventListener('shown.bs.offcanvas', () => {
console.log('Offcanvas is now fully visible.');
});
ملاحظات دسترسیپذیری
برای تضمین دسترسی مناسب:
- از تگ
<aside>
برای محتوای مکمل استفاده کنید. - از
aria-labelledby
برای ارجاع به عنوان استفاده کنید. aria-modal="true"
وrole="dialog"
برای توصیف نوع پنل.tabindex="-1"
برای قابلیت فوکوس.- دکمهی بستن با
aria-label="بستن"
حتماً لحاظ شود. - فوکوس باید پس از باز شدن پنل، روی اولین عنصر تعاملی داخل آن قرار گیرد.
استفادههای خلاقانه
Offcanvas فقط برای منوهای جانبی نیست. میتوان از آن برای موارد زیر نیز استفاده کرد:
- منوهای موبایل
- پنلهای فیلتر (در فروشگاهها)
- تنظیمات کاربر
- نمایش سبد خرید
- پنلهای اطلاعاتی
- نوار ابزار کناری
- روندهای چندمرحلهای
نکات و بهترین شیوهها
- استفادهی زمینهای: محتوای پنل باید مرتبط با کار جاری کاربر باشد.
- عنوان واضح: عنوان پنل باید هدف آن را مشخص کند.
- قابلیت بستن آسان: دکمهی بستن باید در دسترس باشد.
- تست واکنشگرایی: بررسی کنید که پنل در تمامی اندازهها به درستی نمایش داده میشود.
- اولویت دسترسیپذیری: برای همه کاربران از جمله کاربران با ناتوانی، قابل استفاده باشد.
نتیجهگیری
Offcanvas در بوتاسترپ یک راه حل پویا و کاربردی برای ارائهی محتوای مکمل است بدون اینکه فضای اصلی را مختل کند. با درک ساختار آن، بهرهگیری از امکانات پیشرفته، و رعایت اصول طراحی قابل دسترسی، میتوانید تجربهای کاربرپسند و حرفهای در پروژههای وب خود ارائه دهید. از قابلیتهای کشویی بهره ببرید و پنلهای جانبی را به ابزارهای تعاملی مؤثر تبدیل کنید.