آکادمی بنو/آموزش Bootstrap

Buttons و Button Group در Bootstrap

بهنام نوبخت · ۱۴۰۵/۷/۱۲

دکمه‌ها تقریباً در تمام وب‌سایت‌ها و برنامه‌های تحت وب وجود دارند. از دکمه‌های ساده مانند «ثبت»، «ورود» و «لغو» گرفته تا دکمه‌های پیچیده‌تر مانند «افزودن به سبد خرید»، «ویرایش»، «حذف»، «دانلود» و «ارسال فرم». در Bootstrap مجموعه‌ای کامل از کلاس‌ها برای ساخت دکمه‌های استاندارد، رنگی، Outline، بزرگ، کوچک، غیرفعال و گروه‌بندی‌شده وجود دارد. در این مقاله ابتدا ساختار Button در Bootstrap را یاد می‌گیریم، سپس انواع رنگ‌ها، اندازه‌ها، Outline، لینک‌ها، حالت Disabled و Loading را بررسی می‌کنیم و در ادامه با Button Group و ساخت دکمه‌های کاربردی در پروژه‌های واقعی آشنا می‌شویم.

Button در Bootstrap چیست؟

در HTML معمولی می‌توانیم یک Button ساده ایجاد کنیم:

<button>
    Save
</button>

اما ظاهر آن به مرورگر و CSS پروژه وابسته خواهد بود.

Bootstrap یک کلاس اصلی برای Buttonها دارد:

btn

بنابراین یک Button ساده Bootstrap به شکل زیر است:

<button class="btn btn-primary">
    Save
</button>

در اینجا:

btn

ساختار پایه Button را ایجاد می‌کند.

و:

btn-primary

نوع رنگ و ظاهر Button را مشخص می‌کند.

ساختار کلی Button

ساختار رایج Button در Bootstrap:

<button class="btn btn-primary">
    Button Text
</button>

به صورت مفهومی:

btn
 |
 +-- Base Button Style
 |
 +-- btn-primary
       |
       +-- Button Color

معمولاً برای ساخت Button مناسب باید هر دو کلاس btn و یکی از کلاس‌های نوع Button را استفاده کنیم.

انواع رنگ Button

Bootstrap رنگ‌های مختلفی برای Button ارائه می‌کند.

مهم‌ترین آن‌ها:

btn-primary
btn-secondary
btn-success
btn-danger
btn-warning
btn-info
btn-light
btn-dark

مثال:

<button class="btn btn-primary">
    Primary
</button>

<button class="btn btn-secondary">
    Secondary
</button>

<button class="btn btn-success">
    Success
</button>

<button class="btn btn-danger">
    Delete
</button>

<button class="btn btn-warning">
    Warning
</button>

<button class="btn btn-info">
    Information
</button>

<button class="btn btn-light">
    Light
</button>

<button class="btn btn-dark">
    Dark
</button>

هر کدام از این رنگ‌ها می‌توانند برای مفهوم خاصی در رابط کاربری استفاده شوند.

Button Primary

btn-primary معمولاً برای مهم‌ترین Action صفحه استفاده می‌شود.

مثلاً:

<button class="btn btn-primary">
    Register
</button>

یا:

<button class="btn btn-primary">
    Continue
</button>

Button Success

برای عملیات موفق یا Actionهایی که با مفهوم موفقیت مرتبط هستند:

<button class="btn btn-success">
    Confirm
</button>

مثلاً در یک فرم:

<button type="submit" class="btn btn-success">
    Save Changes
</button>

Button Danger

برای عملیات حساس یا خطرناک استفاده می‌شود.

مثلاً حذف:

<button class="btn btn-danger">
    Delete
</button>

در یک پنل مدیریت می‌توان از آن برای حذف رکورد استفاده کرد.

Button Warning

<button class="btn btn-warning">
    Warning
</button>

برای Actionهایی که نیاز به توجه کاربر دارند مناسب است.

Button Dark

<button class="btn btn-dark">
    Dark Button
</button>

برای طراحی‌های تیره و بعضی Actionهای ثانویه کاربرد دارد.

Button Light

<button class="btn btn-light">
    Light Button
</button>

این Button معمولاً در Backgroundهای تیره یا برای Actionهای کم‌اهمیت‌تر استفاده می‌شود.

Button Info

<button class="btn btn-info">
    More Info
</button>

برای Actionهایی با مفهوم اطلاعاتی مناسب است.

Button Outline

Bootstrap نسخه Outline بسیاری از Buttonها را نیز ارائه می‌کند.

مثلاً:

<button class="btn btn-outline-primary">
    Primary
</button>

یا:

<button class="btn btn-outline-success">
    Success
</button>

و:

<button class="btn btn-outline-danger">
    Delete
</button>

تفاوت Solid و Outline

یک Button معمولی:

<button class="btn btn-primary">
    Save
</button>

و یک Button Outline:

<button class="btn btn-outline-primary">
    Save
</button>

در طراحی رابط کاربری، معمولاً Solid Button توجه بیشتری ایجاد می‌کند و Outline Button ظاهر سبک‌تری دارد.

ترکیب چند Button

می‌توان چند Button را کنار هم قرار داد.

<div class="d-flex gap-2">

    <button class="btn btn-primary">
        Save
    </button>

    <button class="btn btn-secondary">
        Cancel
    </button>

</div>

در اینجا از مفاهیمی که در مقالات قبلی یاد گرفتیم نیز استفاده کرده‌ایم:

d-flex
gap-2
btn

Button Size

Bootstrap سه اندازه رایج برای Buttonها در اختیار ما قرار می‌دهد:

btn-sm
btn
btn-lg

Button کوچک

<button class="btn btn-primary btn-sm">
    Small Button
</button>

Button معمولی

<button class="btn btn-primary">
    Normal Button
</button>

Button بزرگ

<button class="btn btn-primary btn-lg">
    Large Button
</button>

چه زمانی از Button کوچک استفاده کنیم؟

Button کوچک برای بخش‌هایی مانند:

  • Toolbar

  • جدول‌های مدیریتی

  • Actionهای کوچک

  • کارت‌های فشرده

مناسب است.

مثلاً:

<button class="btn btn-sm btn-outline-primary">
    Edit
</button>

<button class="btn btn-sm btn-outline-danger">
    Delete
</button>

چه زمانی از Button بزرگ استفاده کنیم؟

Button بزرگ معمولاً برای Actionهای مهم‌تر مانند:

  • Hero Section

  • Landing Page

  • CTA

  • صفحه ثبت‌نام

  • صفحه خرید

کاربرد دارد.

مثلاً:

<button class="btn btn-lg btn-primary">
    Start Now
</button>

Button تمام عرض

برای ایجاد Button با عرض کامل می‌توان از Utilityهای Width استفاده کرد:

<button class="btn btn-primary w-100">
    Login
</button>

در این حالت Button عرض والد خود را پر می‌کند.

مثال فرم:

<div class="container">

    <div class="col-md-6">

        <button class="btn btn-primary w-100">
            Login
        </button>

    </div>

</div>

Button و Responsive Width

گاهی می‌خواهیم Button در موبایل تمام عرض باشد ولی در صفحه بزرگ‌تر فقط به اندازه محتوای خودش باشد.

می‌توان از Responsive Utility استفاده کرد:

<button class="btn btn-primary w-100 w-md-auto">
    Continue
</button>

در اینجا باید دقت کنیم که Utilityهای Width در نسخه مورد استفاده Bootstrap را مطابق مستندات همان نسخه انتخاب کنیم. در صورت نیاز به رفتار دقیق Responsive می‌توان از کلاس‌های Grid یا CSS اختصاصی نیز کمک گرفت.

Button با Link

Button فقط برای تگ button نیست.

می‌توانیم یک لینک را شبیه Button نمایش دهیم:

<a href="/products" class="btn btn-primary">
    View Products
</a>

این روش برای Navigation بسیار کاربردی است.

مثلاً:

<a href="/login" class="btn btn-outline-primary">
    Login
</a>

از نظر معنایی اگر هدف کاربر رفتن به یک URL باشد، استفاده از a مناسب‌تر است.

اگر هدف انجام یک Action در همان صفحه باشد، معمولاً button انتخاب مناسب‌تری است.

Button با Input

Bootstrap می‌تواند ظاهر Inputها را نیز با Buttonها هماهنگ کند.

مثلاً:

<input
    type="button"
    class="btn btn-primary"
    value="Click Me">

یا:

<input
    type="submit"
    class="btn btn-success"
    value="Save">

Button Type

در HTML بهتر است نوع Button را در فرم‌ها مشخص کنیم.

مثلاً:

<button type="submit" class="btn btn-primary">
    Submit
</button>

برای Button معمولی:

<button type="button" class="btn btn-secondary">
    Cancel
</button>

و برای Reset:

<button type="reset" class="btn btn-warning">
    Reset
</button>

این موضوع مخصوصاً هنگام کار با فرم‌ها اهمیت زیادی دارد.

Button Disabled

گاهی لازم است یک Button غیرفعال باشد.

در HTML:

<button
    type="button"
    class="btn btn-primary"
    disabled>
    Disabled
</button>

در این حالت کاربر نمی‌تواند Button را فعال کند.

مثلاً تا زمانی که فرم کامل نشده است:

<button
    type="submit"
    class="btn btn-primary"
    disabled>
    Continue
</button>

Disabled برای Link

برای لینک‌ها باید توجه بیشتری داشته باشیم.

این کد:

<a href="#" class="btn btn-primary disabled">
    Disabled Link
</a>

ظاهر Disabled ایجاد می‌کند، اما از نظر HTML همانند button disabled رفتار نمی‌کند.

اگر لینک واقعاً نباید قابل استفاده باشد، باید رفتار آن را نیز در JavaScript یا ساختار مناسب صفحه کنترل کنیم.

Button Active

Bootstrap امکان نمایش حالت Active را نیز دارد.

<button class="btn btn-primary active">
    Active
</button>

این حالت برای بعضی Interfaceها مانند Toggle یا Selection کاربرد دارد.

Button Focus

زمانی که کاربر با Keyboard روی Button حرکت می‌کند، مرورگر باید وضعیت Focus را مشخص کند.

این موضوع برای Accessibility بسیار مهم است.

به طور کلی نباید Focus Indicator را بدون دلیل حذف کنیم.

مثلاً حذف Outline با CSS مانند:

button {
    outline: none;
}

می‌تواند تجربه کاربران Keyboard را خراب کند.

Bootstrap بسیاری از حالت‌های Focus را به شکل مناسبی مدیریت می‌کند.

Button Group چیست؟

گاهی چند Button به یک مجموعه مرتبط هستند.

مثلاً:

+---------+---------+---------+
|   Day   |  Week   |  Month  |
+---------+---------+---------+

برای چنین حالتی Bootstrap یک Component به نام:

Button Group

دارد.

ساخت Button Group

ساختار ساده:

<div class="btn-group">

    <button type="button" class="btn btn-primary">
        One
    </button>

    <button type="button" class="btn btn-primary">
        Two
    </button>

    <button type="button" class="btn btn-primary">
        Three
    </button>

</div>

Buttonها به صورت یک گروه نمایش داده می‌شوند.

Button Group با Outline

<div class="btn-group">

    <button type="button" class="btn btn-outline-primary">
        Day
    </button>

    <button type="button" class="btn btn-outline-primary">
        Week
    </button>

    <button type="button" class="btn btn-outline-primary">
        Month
    </button>

</div>

این الگو برای Filterها بسیار کاربردی است.

Button Group در Toolbar

می‌توان چند گروه را در یک Toolbar قرار داد.

<div class="btn-toolbar">

    <div class="btn-group me-2">

        <button type="button" class="btn btn-primary">
            Bold
        </button>

        <button type="button" class="btn btn-primary">
            Italic
        </button>

        <button type="button" class="btn btn-primary">
            Underline
        </button>

    </div>

    <div class="btn-group">

        <button type="button" class="btn btn-secondary">
            Undo
        </button>

        <button type="button" class="btn btn-secondary">
            Redo
        </button>

    </div>

</div>

ساختار کلی:

+------------------------------------------------+
| Bold | Italic | Underline   Undo | Redo       |
+------------------------------------------------+

Button Group عمودی

گاهی لازم است Buttonها به صورت عمودی قرار بگیرند.

برای این کار:

<div class="btn-group-vertical">

    <button type="button" class="btn btn-primary">
        Home
    </button>

    <button type="button" class="btn btn-primary">
        Products
    </button>

    <button type="button" class="btn btn-primary">
        Settings
    </button>

</div>

ساختار:

+-------------+
|    Home     |
+-------------+
|  Products   |
+-------------+
|  Settings   |
+-------------+

این Layout برای بعضی Sidebarها و Navigationهای کوچک کاربردی است.

Button Group با Radio

یکی از کاربردهای مهم Button Group، انتخاب یکی از چند گزینه است.

مثلاً:

<div class="btn-group" role="group">

    <input
        type="radio"
        class="btn-check"
        name="options"
        id="option1"
        autocomplete="off"
        checked>

    <label
        class="btn btn-outline-primary"
        for="option1">
        Option 1
    </label>


    <input
        type="radio"
        class="btn-check"
        name="options"
        id="option2"
        autocomplete="off">

    <label
        class="btn btn-outline-primary"
        for="option2">
        Option 2
    </label>


    <input
        type="radio"
        class="btn-check"
        name="options"
        id="option3"
        autocomplete="off">

    <label
        class="btn btn-outline-primary"
        for="option3">
        Option 3
    </label>

</div>

این الگو اجازه می‌دهد Radio Buttonها ظاهری شبیه Button داشته باشند.

btn-check چیست؟

کلاس:

btn-check

برای مخفی کردن ظاهر پیش‌فرض Input و استفاده از Label به عنوان Button استفاده می‌شود.

مثلاً:

<input
    type="checkbox"
    class="btn-check"
    id="check1"
    autocomplete="off">

<label
    class="btn btn-outline-success"
    for="check1">
    Select
</label>

با کلیک روی Label، Checkbox انتخاب می‌شود.

این روش برای ساخت Toggleهای ساده کاربردی است.

چند انتخاب با Checkbox

می‌توان چند Checkbox را به شکل Button نمایش داد:

<div class="btn-group" role="group">

    <input
        type="checkbox"
        class="btn-check"
        id="html"
        autocomplete="off">

    <label
        class="btn btn-outline-primary"
        for="html">
        HTML
    </label>


    <input
        type="checkbox"
        class="btn-check"
        id="css"
        autocomplete="off">

    <label
        class="btn btn-outline-primary"
        for="css">
        CSS
    </label>


    <input
        type="checkbox"
        class="btn-check"
        id="javascript"
        autocomplete="off">

    <label
        class="btn btn-outline-primary"
        for="javascript">
        JavaScript
    </label>

</div>

در این حالت کاربر می‌تواند چند گزینه را همزمان انتخاب کند.

Button Loading

Bootstrap به صورت مستقیم یک Component مستقل برای Loading Button ارائه نمی‌کند، اما می‌توانیم با Spinnerها و Utilityها یک Loading State ایجاد کنیم.

مثلاً:

<button
    class="btn btn-primary"
    type="button"
    disabled>

    <span
        class="spinner-border spinner-border-sm"
        aria-hidden="true">
    </span>

    <span role="status">
        Loading...
    </span>

</button>

این الگو در عملیات‌هایی مانند:

  • ارسال فرم

  • Login

  • ثبت سفارش

  • پرداخت

  • دریافت اطلاعات از API

کاربرد زیادی دارد.

Button همراه با Icon

در پروژه‌های واقعی معمولاً Buttonها فقط متن ندارند و همراه Icon استفاده می‌شوند.

مثلاً اگر از Bootstrap Icons استفاده کنیم:

<button class="btn btn-primary">
    <i class="bi bi-plus-lg"></i>
    Add Product
</button>

در اینجا Icon به همراه متن Button نمایش داده می‌شود.

در ادامه دوره و مقاله مربوط به Bootstrap Icons، این موضوع را به شکل کامل‌تر بررسی خواهیم کرد.

Button با Icon در سمت دیگر

برای ایجاد فاصله مناسب:

<button class="btn btn-primary d-inline-flex align-items-center gap-2">

    <span>
        Download
    </span>

    <i class="bi bi-download"></i>

</button>

در این مثال از:

d-inline-flex
align-items-center
gap-2

نیز استفاده کرده‌ایم.

ساخت Action Buttons برای جدول

یکی از کاربردهای بسیار رایج Buttonها در پنل‌های مدیریتی، قرار دادن Action کنار هر رکورد است.

مثلاً:

<div class="d-flex gap-2">

    <button
        type="button"
        class="btn btn-sm btn-outline-primary">
        Edit
    </button>

    <button
        type="button"
        class="btn btn-sm btn-outline-danger">
        Delete
    </button>

</div>

در یک جدول:

+----------------------+----------------------+
| Product              | Actions              |
+----------------------+----------------------+
| Laptop               | Edit | Delete        |
+----------------------+----------------------+
| Keyboard             | Edit | Delete        |
+----------------------+----------------------+

ساخت CTA Section

Buttonها نقش مهمی در Landing Pageها دارند.

مثال:

<section class="py-5 bg-dark text-white">

    <div class="container text-center">

        <h2 class="display-5 fw-bold">
            Start Your Journey
        </h2>

        <p class="lead mt-3">
            Build modern websites with Bootstrap.
        </p>

        <div class="d-flex justify-content-center gap-3 mt-4">

            <a
                href="#"
                class="btn btn-primary btn-lg">
                Get Started
            </a>

            <a
                href="#"
                class="btn btn-outline-light btn-lg">
                Learn More
            </a>

        </div>

    </div>

</section>

این نمونه ترکیبی از چند مفهوم قبلی دوره است:

Container
Typography
Colors
Spacing
Flexbox
Buttons
Responsive Design

Buttonهای Responsive

فرض کنیم در موبایل فضای کمی داریم.

می‌توانیم Buttonها را در موبایل به صورت عمودی قرار دهیم:

<div class="d-flex flex-column flex-sm-row gap-2">

    <button class="btn btn-primary">
        Save
    </button>

    <button class="btn btn-outline-secondary">
        Cancel
    </button>

</div>

در موبایل:

+----------------------+
|       Save           |
+----------------------+
|       Cancel         |
+----------------------+

در صفحه بزرگ‌تر:

+---------+-------------+
|  Save   |   Cancel    |
+---------+-------------+

دسترسی‌پذیری Buttonها

Button فقط یک عنصر ظاهری نیست.

باید به Accessibility نیز توجه کنیم.

متن مناسب

بهتر است:

<button class="btn btn-primary">
    Save Changes
</button>

به جای:

<button class="btn btn-primary">
    Click
</button>

استفاده شود.

متن Button باید تا حد امکان مشخص کند چه اتفاقی رخ خواهد داد.

Icon-only Button

اگر Button فقط Icon داشته باشد، باید اطلاعات لازم برای کاربران Screen Reader نیز فراهم شود.

مثلاً:

<button
    type="button"
    class="btn btn-primary"
    aria-label="Delete product">

    <i class="bi bi-trash"></i>

</button>

aria-label در این مثال مشخص می‌کند Button چه کاری انجام می‌دهد.

مثال کامل: فرم ثبت اطلاعات

حالا یک فرم ساده همراه با Button ایجاد کنیم:

<div class="container py-5">

    <div class="row justify-content-center">

        <div class="col-12 col-md-8 col-lg-6">

            <div class="border rounded-4 p-4 shadow-sm">

                <h2 class="fw-bold mb-4">
                    Create Account
                </h2>

                <div class="mb-3">

                    <label class="form-label">
                        First Name
                    </label>

                    <input
                        type="text"
                        class="form-control">

                </div>

                <div class="mb-3">

                    <label class="form-label">
                        Email
                    </label>

                    <input
                        type="email"
                        class="form-control">

                </div>

                <div class="d-flex flex-column flex-sm-row gap-2">

                    <button
                        type="submit"
                        class="btn btn-primary">
                        Create Account
                    </button>

                    <button
                        type="reset"
                        class="btn btn-outline-secondary">
                        Reset
                    </button>

                </div>

            </div>

        </div>

    </div>

</div>

این نمونه علاوه بر Buttonها، از Grid و Spacing نیز استفاده می‌کند.

بهترین روش استفاده از رنگ Buttonها

نباید صرفاً بر اساس زیبایی رنگ Button را انتخاب کنیم.

رنگ باید تا حد امکان با مفهوم Action هماهنگ باشد.

برای مثال:

Primary
Main Action

Success
Successful / Confirm Action

Danger
Delete / Destructive Action

Warning
Attention Required

Secondary
Secondary Action

این موضوع باعث می‌شود Interface برای کاربر قابل فهم‌تر باشد.

تمرین عملی

یک بخش مدیریت محصولات ایجاد کنید.

برای هر محصول موارد زیر را نمایش دهید:

  • نام محصول

  • قیمت

  • وضعیت

  • دکمه Edit

  • دکمه Delete

  • دکمه View

نمونه ساختار:

+------------------------------------------------+
| Product          | Price     | Actions         |
+------------------------------------------------+
| Laptop           | $900      | View Edit Delete|
+------------------------------------------------+
| Keyboard         | $100      | View Edit Delete|
+------------------------------------------------+

شرایط:

  1. Buttonهای Action کوچک باشند.

  2. برای Edit از Outline استفاده کنید.

  3. برای Delete از Danger استفاده کنید.

  4. برای View از Primary یا Secondary استفاده کنید.

  5. بین Buttonها فاصله مناسب ایجاد کنید.

  6. در موبایل Buttonها بتوانند به شکل مناسب Wrap شوند.

  7. برای Buttonهای Icon-only از aria-label مناسب استفاده کنید.

چالش بیشتر

یک Toolbar برای ویرایشگر متن طراحی کنید.

Toolbar باید شامل موارد زیر باشد:

Bold
Italic
Underline
Align Left
Align Center
Align Right
Undo
Redo

از:

btn-toolbar
btn-group

استفاده کنید.

سپس یک Button Group دیگر برای انتخاب اندازه متن ایجاد کنید:

Small | Medium | Large

جمع‌بندی

در این مقاله با یکی از مهم‌ترین Componentهای Bootstrap یعنی Button آشنا شدیم.

یاد گرفتیم Button پایه را با کلاس‌های:

btn
btn-primary

ایجاد کنیم و سپس با رنگ‌های مختلف مانند:

btn-success
btn-danger
btn-warning
btn-info
btn-dark
btn-light

کار کردیم.

همچنین نسخه‌های Outline را بررسی کردیم:

btn-outline-primary
btn-outline-success
btn-outline-danger

سپس اندازه‌های مختلف Button را یاد گرفتیم:

btn-sm
btn
btn-lg

و با حالت‌های:

disabled
active

آشنا شدیم.

در ادامه Button Group و Button Toolbar را بررسی کردیم و یاد گرفتیم چگونه Buttonها را به صورت افقی یا عمودی گروه‌بندی کنیم.

همچنین با btn-check برای ساخت Radio و Checkboxهای ظاهری شبیه Button آشنا شدیم.

در پایان نیز نحوه ساخت Loading Button، Action Button برای جدول، CTA و Buttonهای Responsive را بررسی کردیم.

۱۰

نظرات

کد در دسترس نیست

هنوز نظری ثبت نشده است.