مولد علامات التبويب CSS

التالي

علامات التبويب موجودة في كل مكان، أجزاء الإعدادات، ومواقع التوثيق، ومعارض المنتجات. لا يحتوي HTML الأصلي على عنصر علامة تبويب مخصص، لذلك يقوم المطورون بإنشاء عناصر خاصة بهم. يبني هذا المولد شريط تبويبات بسيطًا بتنسيق HTML + CSS: لونًا مميزًا للتبويب النشط، وانحناءً لزوايا الأزرار، وحالة تمرير. الصق البنية في مشروعك واربط التبديل بين التبويبات بكود JavaScript الخاص بك.

كيفية بناء علامات التبويب

  1. 1

    اختر لونًا مميزًا

    لون خلفية ونص التبويب النشط. اختر لونًا يطابق علامتك التجارية.

  2. 2

    حدّد انحناء الزوايا

    يقرّب الزوايا العلوية لأزرار التبويب. القيم الأعلى تعطي مظهرًا أنعم.

  3. 3

    عدّل التسميات

    يتضمّن الناتج ثلاثة أزرار: "Overview" و"Details" و"Settings". أعِد تسميتها بما يناسب محتواك.

  4. 4

    انسخ الكود

    تأتي بنية التبويبات مع كتلة <style> خاصة بها. الصق الاثنين معًا في صفحتك.

  5. 5

    أضف التبديل بين التبويبات

    يُنتج المولد الجزء المرئي فقط. اربط الأزرار بكود JavaScript الخاص بك أو بمكتبة واجهة المستخدم لإظهار اللوحات وإخفائها.

الترميز الصحيح القابل للوصول

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

السمات الحاسمة:

  • role="tablist" يغلف الأزرار.
  • role="tab" على كل زر، مع aria-selected وaria-controls.
  • يستخدم tabindex نمط tabindex المتجول: علامة التبويب النشطة فقط هي 0، والبعض الآخر هو -1. تعمل مفاتيح الأسهم على نقل التركيز بينهما.
  • role="tabpanel" على كل لوحة، مع إشارة aria-labelledby إلى علامة التبويب الخاصة بها.
  • hidden على اللوحات غير النشطة (وليس display: none وحده، السمة هي ما تستخدمه AT).

عقد لوحة المفاتيح

المفتاح الإجراء
Tab الدخول إلى قائمة علامات التبويب / الخروج منها
ArrowLeft علامة التبويب السابقة (تلتف إلى الأخيرة)
ArrowRight علامة التبويب التالية (تلتف إلى الأولى)
Home علامة التبويب الأولى
End علامة التبويب الأخيرة
Enter / Space تفعيل علامة التبويب المركّز عليها (عند التفعيل اليدوي)

التنشيط التلقائي (تبديل علامة التبويب أثناء تحرك التركيز) مقابل التنشيط اليدوي (تحركات التركيز، وتنشيط علامة التبويب عند الإدخال) - يسمح WAI-ARIA بكليهما. التلقائي أسهل للمستخدمين المبصرين؛ يكون الدليل أفضل عندما يكون محتوى علامة التبويب ثقيلًا في العرض.

النمط الذي تحته خط

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

النمط الكبسولي

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

التركيز مرئي

ارسم دائمًا حلقة التركيز عندما يصل التركيز عبر لوحة المفاتيح:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

جافا سكريبت

تقريبًا:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

إجمالي ثلاثين سطرًا، بدون تبعيات.

علامات التبويب مقابل الأكورديون

على الشاشات الضيقة، تصبح صفوف علامات التبويب ضيقة. النمط الشائع: علامات التبويب على سطح المكتب، والأكورديون على الهاتف المحمول. استخدم استعلام حاوية أو استعلام وسائط لتبديل المعالجة المرئية دون تغيير أدوار ARIA.

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

بالنسبة لعلامات التبويب التي يمكن الوصول إليها، نعم. بدون role="tablist" وrole="tab"، تتعامل برامج قراءة الشاشة مع الأزرار كأزرار عادية ويفقد المستخدمون اصطلاح التنقل. البديل هو الأكورديون العادي <details> / <summary>، والذي يحتوي على دلالات مدمجة.

يعد التشغيل التلقائي (يتم تنشيط علامة التبويب أثناء تحرك التركيز) أمرًا جيدًا عندما يكون عرض محتوى كل علامة تبويب رخيصًا. يعد النقل اليدوي (حركات التركيز، وتنشيط الإدخال) أفضل عندما يؤدي تبديل علامات التبويب إلى تشغيل عمل شاق مثل جلب نموذج كبير أو عرضه.

بالنسبة لعلامات التبويب التي تحمل المحتوى (الوثائق وعلامات تبويب المنتج)، نعم - استخدم علامة التجزئة (#specs) أو معلمة الاستعلام حتى تتمكن الروابط من الارتباط العميق بعلامة تبويب معينة وتستمر علامة التبويب النشطة عبر عمليات إعادة التحميل. بالنسبة لعلامات تبويب واجهة المستخدم (أجزاء الإعدادات)، يكون عنوان URL اختياريًا.

فقط مع اختراق مربع الاختيار/الراديو، الذي يفتقر إلى التنقل باستخدام مفتاح الأسهم وحالات ARIA. من أجل تنفيذ يمكن الوصول إليه بشكل حقيقي، فإن مقتطف JS الصغير يستحق كل هذا العناء. إذا كنت بحاجة إلى إجراءات احتياطية مقدمة من الخادم، فاربط كل علامة تبويب بعنوان URL فريد واعرض اللوحة المقابلة من جانب الخادم.

أدوات ذات صلة

الأداة متاحة بلغات أخرى