Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Різниця між тегами strong та b в HTML». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`<strong>` проти `<b>`** - обидва роблять текст жирним, але `<strong>` також позначає вміст як важливий для скрінрідерів і пошукових систем. ```html <b>Назва продукту</b> <!-- жирний, без семантики --> <strong>Увага!</strong> <!-- жирний + важливе в дереві доступності --> ``` **Ключове:** `<strong>` - коли текст має смислове значення, CSS `font-weight: bold` - коли це тільки стиль.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**`<strong>` та `<b>`** обидва роблять текст жирним за замовчуванням, але тільки `<strong>` повідомляє браузеру, і всьому що його слухає, що цей текст справді важливий. ## Теорія ### TL;DR - `<b>` = виділення маркером на папері: змінює вигляд, нічого не говорить про значення - `<strong>` = зірочка на листі: змінює вигляд І позначає як важливе - Скрінрідери наголошують на вмісті `<strong>`; `<b>` читається рівно, як звичайний текст - Обидва теги отримують `font-weight: bold` з вбудованих стилів браузера, тому візуально виглядають однаково - Правило: смисловий наголос → `<strong>`. Тільки стиль → CSS `font-weight: bold` ### Швидкий приклад ```html <p>Звичайний текст, потім <b>жирний без значення</b>.</p> <!-- Скрінрідер читає "жирний без значення" рівно, без наголосу --> <p>Звичайний текст, потім <strong>важливий жирний</strong>.</p> <!-- Скрінрідер наголошує на "важливий жирний" --> ``` Відкрий це в браузері з NVDA або VoiceOver і різниця чутна одразу. Візуально? Однаково. ### Головна різниця `<b>` - презентаційний тег. Він додає жирний шрифт у render tree і на цьому зупиняється. `<strong>` іде далі: браузери додають його до дерева доступності (accessibility tree) з роллю важливості, яку зчитують AT API на кшталт MSAA та IAccessible2. Саме тому скрінрідери озвучують вміст `<strong>` з наголосом або префіксом типу "важливо", а `<b>` не отримує нічого додаткового. ### Коли що використовувати - Назва продукту або мітка в UI, де жирний - суто дизайнерське рішення → CSS `font-weight: bold`, або `<b>` в крайньому разі - Попередження, дедлайн або повідомлення про помилку, яке не можна пропустити → `<strong>` - Легасі-код де жирний потрібен тільки для вигляду → додай CSS-клас, уникай обох тегів - Пріоритет доступності або SEO → завжди `<strong>`, ніколи `<b>` ### Таблиця порівняння | Аспект | `<b>` | `<strong>` | |---|---|---| | Стиль за замовчуванням | Жирний | Жирний | | Семантика | Немає (презентаційний) | Важливість | | Скрінрідери | Читають рівно | Озвучують з наголосом | | Вплив на SEO | Нейтральний | Сигнал релевантності | | Дерево доступності | Не враховується | Роль важливості | | Коли використовувати | Рідко; тільки візуальні мітки | Попередження, ключові факти | ### Як браузер це обробляє Обидва теги отримують `font-weight: bold` з вбудованого CSS браузера, тому без кастомних стилів виглядають однаково. Розбіжність виникає в дереві доступності: `<strong>` отримує роль важливості, яку зчитують через OS-рівневий accessibility API; `<b>` залишається тільки в render tree. Один CSS-рядок (`strong { font-weight: normal; }`) прибирає візуальний жирний з `<strong>`, але семантична роль залишається. Скрінрідери все одно наголошують на ньому. ### Типові помилки **Використання `<b>` для попереджень або критичних повідомлень:** ```html <!-- Неправильно: скрінрідер читає це рівно --> <p>Увага: <b>зона високої напруги</b>. Не заходити.</p> <!-- Правильно: скрінрідер наголошує на попередженні --> <p>Увага: <strong>зона високої напруги</strong>. Не заходити.</p> ``` **Припущення, що `<strong>` завжди означає жирний стиль:** ```css /* Це прибирає візуальний жирний, але НЕ семантику */ strong { font-weight: normal; } ``` Якщо кастомна тема скидає стиль `<strong>`, скрінрідери все одно позначають його як важливе. Стиль прив'язуй до CSS-класу, а не до тегу. **Безпечне вкладення `<b>` всередину `<strong>`:** ```html <strong>Критично: <b>перевір це</b> перед деплоєм.</strong> ``` Зовнішній `<strong>` застосовує роль важливості до всього вмісту всередині, включно з частиною `<b>`. Сам `<b>` тільки додає візуальний хук. Це валідний HTML, але один `<strong>` зі стилем через CSS читається значно чіткіше. ### Де зустрічається - MDN Web Docs використовує `<strong>` для попереджень і повідомлень про застарілі API по всій документації - Документація React обгортає назви обов'язкових пропсів у `<strong>`, щоб позначити важливість - WordPress Gutenberg за замовчуванням вставляє `<strong>`, коли натискаєш кнопку жирного в редакторі - Bootstrap у розділі типографіки рекомендує `<strong>` замість `<b>` ### Питання на співбесіді **Q:** Чи може CSS зробити `<strong>` і `<b>` повністю ідентичними? **A:** Візуально - так. Але семантично - ні. Дерево доступності все одно позначає `<strong>` як важливе, і скрінрідери реагують на це незалежно від того, як тег виглядає на екрані. **Q:** Google справді по-різному ставиться до `<strong>` і `<b>` для SEO? **A:** Google підтвердив, що `<strong>` несе вагу як сигнал релевантності ключових слів. `<b>` вважається нейтральним стилем. Різниця відчутна для контенту з ключовими словами, за якими ти хочеш ранжуватися. **Q:** `<b>` досі валідний в HTML5? **A:** Так. HTML5 зберіг `<b>` і перевизначив його як тег для тексту, який "стилістично відрізняється" без вираження важливості. Тег валідний, але WCAG 4.1.2 рекомендує семантичні альтернативи там, де є смисловий контекст. **Q:** Як поводиться `<strong>` всередині контейнера з `aria-hidden`? **A:** Семантична роль пригнічується і допоміжні технології повністю пропускають вміст. Якщо `<strong>` знаходиться всередині елемента з `aria-hidden="true"`, скрінрідери не озвучать його незалежно від тегу. ## Приклади ### Базовий: візуальний проти семантичного жирного ```html <!DOCTYPE html> <html lang="uk"> <body> <p>Зберігай роботу частіше. <b>Автозбереження</b> вимкнено за замовчуванням.</p> <!-- "Автозбереження" виглядає жирним, скрінрідер читає рівно --> <p>Зберігай роботу частіше. <strong>Автозбереження вимкнено</strong> за замовчуванням.</p> <!-- Скрінрідер наголошує на "Автозбереження вимкнено" --> </body> </html> ``` `<b>` тут просто виділяє слово візуально. `<strong>` повідомляє користувачу, і кожному інструменту що читає сторінку, що на це треба звернути увагу. ### Середній рівень: React-компонент з семантичним наголосом ```jsx // OrderSummary.jsx function OrderSummary({ productName, deadline }) { return ( <article> <h2>Деталі замовлення</h2> <p> Ви обрали <b>{productName}</b>. {/* Візуальна мітка - семантична вага не потрібна */} </p> <p> Оплатіть до <strong>{deadline}</strong>, щоб уникнути скасування. {/* Дедлайн важливий - скрінрідер наголошує на ньому */} </p> </article> ); } ``` `<b>` для назви продукту - дизайнерське рішення. `<strong>` на дедлайні - це сигнал: якщо користувач навігує скрінрідером, він не повинен пропустити цю дату.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.