0Pricing
Tailwind CSS Academy · درس

تنويعات الأزرار وحالاتها

أنشئ تنويعات أزرار أساسية وثانوية ومحددة ومجرّدة، مع حالات hover وfocus وactive وdisabled باستخدام أدوات Tailwind.

تنويعات الأزرار وحالاتها درس مجاني في Tailwind CSS Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Tailwind CSS Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Tailwind CSS Academy 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

Why Button Variants Matter

Buttons are one of the most interactive elements on a page, and users rely on visual cues to understand their purpose. Button variants communicate intent: a primary button drives the main action, a secondary button provides an alternative, and an outline or ghost button offers a subtle option.

With Tailwind, you achieve all of these without writing any custom CSS. Each variant is just a different combination of utility classes applied to the same <button> element.

<button class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">
  Primary Button
</button>

The Primary Button Pattern

A primary button uses a solid background color to attract maximum attention. The pattern combines padding utilities, a background color, white text, and a rounded corner class.

Adding hover:bg-blue-700 darkens the button on hover, providing clear feedback that the element is interactive. The font-semibold class increases the visual weight of the label.

<button class="px-5 py-2.5 bg-blue-600 text-white font-semibold rounded-lg
           hover:bg-blue-700 active:bg-blue-800
           focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
           transition-colors duration-150">
  Get Started
</button>

Secondary and Outline Variants

A secondary button uses a lighter background to signal a less prominent action. An outline button drops the fill entirely and shows only a border, using border border-blue-600 text-blue-600 on a transparent background.

On hover, outline buttons can fill in with a light background like hover:bg-blue-50 to give visual feedback without overwhelming the primary button nearby.

<!-- Secondary -->
<button class="px-5 py-2.5 bg-blue-100 text-blue-700 font-semibold rounded-lg
           hover:bg-blue-200 transition-colors duration-150">
  Learn More
</button>

<!-- Outline -->
<button class="px-5 py-2.5 border border-blue-600 text-blue-600 font-semibold rounded-lg
           hover:bg-blue-50 transition-colors duration-150">
  View Details
</button>

The Ghost Button Variant

A ghost button has no background and no visible border by default, appearing as styled text until the user interacts with it. This variant is ideal for low-emphasis actions like cancel or dismiss.

Applying hover:bg-gray-100 reveals a subtle fill on hover, and using text-gray-700 keeps the label readable without drawing attention away from primary actions.

<button class="px-5 py-2.5 text-gray-700 font-semibold rounded-lg
           hover:bg-gray-100 active:bg-gray-200
           transition-colors duration-150">
  Cancel
</button>

Destructive and Danger Buttons

A destructive button uses red tones to warn users about irreversible actions like deleting data. The color signals danger without the user needing to read the label carefully.

Combine bg-red-600 with a strong hover state hover:bg-red-700 and always pair the button with a confirmation dialog to prevent accidental actions.

<button class="px-5 py-2.5 bg-red-600 text-white font-semibold rounded-lg
           hover:bg-red-700 active:bg-red-800
           focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2
           transition-colors duration-150">
  Delete Account
</button>

Disabled State Styling

When a button is not yet actionable — for example, while a form is being submitted — you should visually communicate this with a disabled state. Tailwind provides the disabled: variant prefix for exactly this purpose.

Apply disabled:opacity-50 disabled:cursor-not-allowed to dim the button and change the cursor, signaling that it cannot be clicked. Always use the HTML disabled attribute alongside these classes for proper accessibility.

<button
  disabled
  class="px-5 py-2.5 bg-blue-600 text-white font-semibold rounded-lg
         disabled:opacity-50 disabled:cursor-not-allowed
         hover:bg-blue-700 transition-colors duration-150">
  Submitting...
</button>

Loading State With Spinner

A common pattern is showing a loading spinner inside a button while an async operation completes. You can use Tailwind's animate-spin on an SVG icon placed before the label text.

Use inline-flex items-center gap-2 on the button to align the spinner and text side by side, and add pointer-events-none while loading to prevent double submissions.

<button class="inline-flex items-center gap-2 px-5 py-2.5
           bg-blue-600 text-white font-semibold rounded-lg
           pointer-events-none opacity-80">
  <svg class="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24">
    <circle class="opacity-25" cx="12" cy="12" r="10"
            stroke="currentColor" stroke-width="4"></circle>
    <path class="opacity-75" fill="currentColor"
          d="M4 12a8 8 0 018-8v8z"></path>
  </svg>
  Saving...
</button>

Button Sizes With Tailwind

Different contexts call for different button sizes. A small button is useful in dense UIs like tables, while an extra-large button is effective as a hero CTA.

Define sizes by varying the px-*, py-*, and text-* values. A common scale is sm (px-3 py-1.5 text-sm), md (px-5 py-2.5 text-base), and lg (px-6 py-3 text-lg).

<!-- Small -->
<button class="px-3 py-1.5 text-sm bg-blue-600 text-white rounded-md">Small</button>

<!-- Medium (default) -->
<button class="px-5 py-2.5 text-base bg-blue-600 text-white rounded-lg">Medium</button>

<!-- Large -->
<button class="px-6 py-3 text-lg bg-blue-600 text-white rounded-xl">Large</button>

Icon Buttons and Icon-Plus-Text

Icon buttons use only an icon without a visible label, so they must have an accessible aria-label attribute. Style them as a square with equal padding: p-2 creates a compact clickable area around the icon.

For icon-plus-text buttons, use inline-flex items-center gap-2 to align the SVG icon vertically with the text label at any font size.

<!-- Icon only -->
<button aria-label="Delete" class="p-2 text-gray-500 hover:text-red-600 hover:bg-red-50 rounded-lg transition-colors">
  <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
          d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6M9 7h6m2 0H7"/>
  </svg>
</button>

<!-- Icon + text -->
<button class="inline-flex items-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg">
  <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
  </svg>
  Add Item
</button>

Full-Width and Group Buttons

A full-width button uses w-full to stretch across its container, common in mobile layouts and form submissions. Adding justify-center ensures the label stays centered.

A button group connects multiple buttons side by side. Remove the border radius from middle buttons and apply negative margins to merge borders: first:rounded-l-lg last:rounded-r-lg border-r-0 creates a unified pill appearance.

<!-- Full width -->
<button class="w-full flex justify-center px-5 py-2.5 bg-blue-600 text-white font-semibold rounded-lg">
  Sign In
</button>

<!-- Button group -->
<div class="inline-flex">
  <button class="px-4 py-2 border border-gray-300 text-gray-700 rounded-l-lg hover:bg-gray-50">Left</button>
  <button class="px-4 py-2 border-t border-b border-gray-300 text-gray-700 hover:bg-gray-50">Middle</button>
  <button class="px-4 py-2 border border-gray-300 text-gray-700 rounded-r-lg hover:bg-gray-50">Right</button>
</div>

Consistent Focus Rings for Accessibility

Every button variant needs a visible focus indicator for keyboard users. Tailwind's focus:ring-* utilities render a colored ring outside the button border without affecting layout.

A good pattern is focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2. The ring-offset-2 adds a small white gap between the button and the ring, making it pop on colored backgrounds. Use focus-visible:ring-2 to show the ring only when navigating with a keyboard.

<button class="px-5 py-2.5 bg-purple-600 text-white font-semibold rounded-lg
           focus:outline-none focus-visible:ring-2
           focus-visible:ring-purple-500 focus-visible:ring-offset-2
           hover:bg-purple-700 transition-colors">
  Accessible Button
</button>

Quick Check

Test your understanding of Tailwind CSS Mastery concepts from this lesson.

Lesson Recap

In this lesson you learned: primary, secondary, outline, and ghost button variants are built by combining background, border, and text color utilities; interactive states like hover, active, disabled, and loading are handled with Tailwind variant prefixes; and focus rings using focus-visible:ring-2 ensure keyboard accessibility without cluttering mouse interactions. Next up we explore card component patterns.

الأسئلة الشائعة

هل درس «تنويعات الأزرار وحالاتها» مجاني؟

نعم — نص درس «تنويعات الأزرار وحالاتها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Tailwind CSS Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Tailwind CSS Academy 4 دروس في المجموع.

ماذا ستتعلم في «تنويعات الأزرار وحالاتها»؟

أنشئ تنويعات أزرار أساسية وثانوية ومحددة ومجرّدة، مع حالات hover وfocus وactive وdisabled باستخدام أدوات Tailwind. تتمرن على Tailwind CSS Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Tailwind CSS Academy؟

لا تُشترط خبرة سابقة. Tailwind CSS Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «تنويعات الأزرار وحالاتها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Tailwind CSS Academy هذا؟

نعم. كل درس في Tailwind CSS Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تنويعات الأزرار وحالاتها
  2. أنماط مكوّنات البطاقات
  3. مكوّنات الشارات والوسوم
  4. دمج المكوّنات في واجهة المستخدم
← العودة إلى Tailwind CSS Academy