Чи слід використовувати <i> тег для піктограм замість <span>? [зачинено]


571

Я заглянув у джерело Facebook, вони використовують <i>тег для відображення піктограм.

Також сьогодні я заглянув у Twitter Bootstrap. Він також використовує <i>тег для відображення піктограм.

Але,

З специфікації HTML5 :

Елемент I являє собою проміжок тексту в альтернативному голосі чи настрої або іншим чином зміщений від звичайної прози, наприклад, таксономічне позначення, технічний термін, ідіоматична фраза з іншої мови, думка, ім'я корабля чи якась інша проза, типова типографічна презентація якої - курсивом.

Чому вони використовують <i>тег для відображення піктограм?

Це не погана практика?

Або я щось тут пропускаю?

Я використовую spanдля відображення піктограм і, здається, працює для мене досі.

Оновлення:

Bootstrap 3 зараз використовується spanдля піктограм. Офіційний док


5
Приклад: У відповіді стрілка нижче твітів на Twitter: <i class="sm-reply"></i>.
Кей - SE злий

2
Чому не <span>слід використовувати?
Jashwant

6
Мені здається, що для сематики та доступності тег img завжди повинен використовуватися для значків із текстом alt.
nroose

12
@nroose Я вважаю, що зображення, використовувані для значків, не є частиною вмісту, а стилем сторінки (на відміну, наприклад, від зображення корови на вікіпедії про корів). Тому їх слід визначати в css, а не як зображення в тезі img.
CJStuart

6
Я не думаю, що семантичні рішення в HTML5 слід вважати "заснованими на думці".
Аарон

Відповіді:


596

Чому вони використовують <i>тег для відображення піктограм?

Бо це:

  • Короткий
  • я розшифровується як значок (хоча не в HTML)

Це не погана практика?

Жахлива практика. Це тріумф продуктивності над семантикою.


87
Перший мій день, коли я вивчаю завантажувальний твіттер, і мені шкода, що вони не дотримуються кращих практик.
Jashwant

25
Деякі люди навіть йдуть далі і зловживають іншими елементами, на зразок <tt>= підказка тощо, хочете допомогти мені знайти ATSMOHE? "Проти смислового використання HTML-елементів"
Крістоф

18
На цих веб-сайтах щодня переглядаються мільйони сторінок. Якщо вони зберігають 100 байт даних кожного разу, коли клієнт запитує сторінку з цією практикою, вони зберігають значну кількість пропускної здатності.
Далмас

62
Для економії 100 байт вони повинні включати 16 піктограм і не включати стиснення .
Квентін

7
За допомогою лігатур використання iтегів для відображення піктограм є смисловим. Насправді Google пропонує використовувати iтег із лігатурами у своєму посібнику з матеріалів про іконки .
Авст

269

Я заскочу сюди трохи пізно, але натрапив на цю сторінку, коли сам розмірковував над нею. Звичайно, я не знаю, наскільки це виправдовували Facebook чи Twitter, але ось мій власний роздум щодо того, чого він вартий.

Врешті-решт я зробив висновок, що ця практика не така несемантична (це слово?). Насправді, окрім короткості та приємної асоціації «я - за ікону», я думаю, що насправді це самий семантичний вибір для ікони, коли прямий <img>тег не є практичним.

1. Використання відповідає специфікації.

Хоча це може бути не те, що W3 в основному мав на увазі, мені здається, офіційна специфіка для <i>могла вмістити іконку досить легко. Зрештою, символ-стрілка відповіді говорить "відповісти" по-іншому. Він виражає технічний термін, який може бути незнайомий читачеві і, як правило, курсивом. ("Тут у Twitter це називається стрілкою відповіді .") І це термін з іншої мови: символічної мови.

Якщо замість символу стрілки використовується Twitter <i>shout out</i>або <i>[Japanese character for reply]</i>(на англійській сторінці), це відповідало б специфікації. Тоді чому б і ні <i>[reply arrow]</i>? (Я говорю тут суто семантику HTML, а не доступність, до якої я дістанусь.)

Наскільки я можу бачити, єдина частина специфікації, явно порушена вживання значків, - це фраза "проміжок тексту" (коли тег також не містить тексту). Зрозуміло, що <i>тег в основному призначений для тексту, але це досить невелика деталь порівняно із загальним наміром тегу. Важливим питанням для цього тегу є не те, який формат вмісту він містить, а в чому сенс цього вмісту.

Особливо це актуально, якщо врахувати, що на веб-сайтах лінія між текстом і "піктограмою" може бути майже відсутня. Текст може бути схожим на піктограму (як у японському прикладі) або значок може виглядати як текст (як у кнопці jpg із написом "Надіслати" або фотографію кота з накладеним заголовком) або текст може бути замінений або покращений на зображення через CSS. Текст, зображення - кого це хвилює? Це все зміст. Поки всі - люди з порушеннями, браузери з порушеннями, павуки пошукових систем та інші машини різного роду можуть зрозуміти це значення, ми зробили свою роботу.

Тож той факт, що письменники спекуляції не думали (або не обирали) пояснювати це, не повинно зв'язати наші руки з тим, щоб робити те, що має сенс, і відповідає духу тегу. Спочатку <a>тег був призначений для того, щоб перевезти користувача десь в іншому місці, але тепер він може спливати у лайтбоксі. Великий кружок, правда? Якщо хтось придумав, як спливати лайтбокс при натисканні, перш ніж спец наздогнав, він все-таки повинен був би використати <a>тег, а не <span>, навіть якщо це не повністю відповідало поточному визначенню - тому що воно наблизилось і було все ще відповідає духу тегу ("щось відбудеться, коли ви натиснете тут"). Те саме стосується і <i>будь-якого типу речі, яку ви вкладаєте всередину, або як би ви творчо не використовували її,

2. <i>Тег додає семантичного значення елементу значка.

Альтернативний варіант перенести клас іконок сам по собі - це <span>, звичайно, не має семантичного значення. Коли машина запитує, <span>що в ній міститься, вона відповідає: "Я не знаю. Може бути що-небудь". Але <i>тег говорить: "Я містять інший спосіб сказати щось, ніж звичайний спосіб, або, можливо, незнайомий термін". Це не те саме, що "Я містять ікону", але вона набагато ближче до неї, ніж <span>отримана!

3. Зрештою, загальне використання робить правильним.

На додаток до сказаного, варто врахувати, що машинні зчитувачі (будь то пошукова система, зчитувач екрана чи будь-що інше) можуть у будь-який час почати враховувати, що Facebook, Twitter та інші веб-сайти використовують <i>тег для значків. Вони не піклуються про специфіку настільки, наскільки вони піклуються про вилучення сенсу з коду будь-якими необхідними засобами. Таким чином, вони можуть використовувати ці знання загального користування, щоб просто записати, що "тут може бути значок", або зробити щось більш досконале, як, наприклад, зазирнути в CSS для підказки до сенсу, або хто знає що. Отже, якщо ви вирішили використовувати <i>піктограми для значків на своєму веб-сайті, ви, можливо, надасте більше значення, ніж специфікація.

Більше того, якщо це використання набуде широкого поширення, воно, швидше за все, буде включено до специфікації в майбутньому. Тоді ви будете переглядати свій код, замінюючи <span>s на <i>s! Таким чином, можливо, є сенс брати до уваги те, що, здається, є напрямком специфікації, особливо коли це явно не суперечить поточній специфікації. Загальне використання має тенденцію диктувати мовні правила більше, ніж навпаки. Якщо ви досить дорослі, чи пам'ятаєте ви, що "Веб-сайт" був офіційним написанням, коли слово було новим? Словники наполягають на тому, що має бути пробіл, а Веб повинен мати великі літери. Для цього були смислові причини. Але загальне використання сказало: "Що б це не було, це глупо. Я використовую" веб-сайт ", тому що він більш стислий і виглядає краще". І невдовзі,

4. Тож я йду вперед і використовую його.

Отже, <i>надає машинам більше значення через специфікацію, він надає більше значення для людей, тому що ми легко асоціюємо "я" з "іконою", і це лише одна літера. Виграй! І якщо ви обов'язково включите еквівалентний текст або всередині <i>тегу, або прямо поруч із ним (як це робить Twitter), тоді читачі екрану розуміють, куди натиснути, щоб відповісти, посилання є корисним, якщо CSS не завантажується, а людські читачі - з хорошими зір і пристойний браузер бачать гарний значок. Зважаючи на це, я не бачу зворотного боку.


33
Але є способи зробити це вже без зловживань <i>: використовуйте будь-який текстовий елемент, включаючи кнопки чи посилання, і додайте піктограму за допомогою фонової графіки та деяких накладок, так само, як це робиться з використанням <i>. HTML виглядав би <a ...>Reply</a>як семантично, так і на стильовій сторінці додається значок. Якщо значок є єдиним, первинним елементом, він повинен бути an <img src="..." alt="Reply">.
деге

36
@Holly, Ви взяли це за зовсім інший бік, але вибачте, я не згоден з кожним вашим рядком.
Jashwant

11
Порожнеча (навіть ікона) , проте, це не текст, а текст - це те, що конкретно написано в специфікації.
Ри-

17
Спеціально написане в специфіці означає джек. Ви це знаєте, і всі інші це знають. Це посібник. Нічого більше. Як ви думаєте, IE піклується про специфікацію? Вони стають кращими. Як ви вважаєте, кожен браузер намагається домогтися досконалості специфікації? Чи вважаєте ви, що всі на планеті правильно використовують <code> nav, header, footer, section, side, ... n </code>? Ні. Я переходжу на сторінку за сторінкою, де вбік є заміна <code> <div class = "sidebar"> </code> І ви знаєте, що? Те, як люди продовжують використовувати, - це те, що буде визначатися "смисловим" у майбутньому.
o_O

17
Чудові аргументи, я думаю, ви мене переконали. Особливо переконливим є №3, "загальне використання робить правильним". Як і у загальній мові, якщо кожен починає вживати слово таким чином, це стає звичайним вживанням. Специфікація HTML вже деякий час є документом, що розвивається, і дотримуватися його догматично - просто нерозумно. На мою думку, дотримання загальної конвенції - більш стійкий шлях. Плюс <i> елемент у цьому моменті майже не є застарілим, тому я почуваю себе добре, коли йому дають нове, семантично насичене життя! Мені цікаво, як специфікація буде розвиватися з цим використанням, як я думаю, це, безсумнівно, буде.
Виконавець логіки

59

У відповіді Квентіна чітко зазначено, що iтег не слід використовувати для визначення піктограм.

Але Холлі припустила, що spanне має сенсу сама по собі, і проголосувала за, iа не spanтег.

Мало хто пропонував використовувати imgяк семантичний і містить altтег. Але ми також не повинні використовувати, imgоскільки навіть порожній srcнадсилає запит серверу. Прочитайте тут

Я думаю, правильний шлях був би,

<span class="icon-fb" role="img" aria-label="facebook"></span>

Це вирішує проблему без altтегів spanі робить її доступною для користувачів із порушеннями зору. Це смислово і не зловживає (не зламає) жодного тегу.


6
@GeorgeMauer, всі поважаючі html / веб-дизайнери дбають про теги Alt. специфіка там є чомусь. як пандуси в будинках, Alt, title та теги арії існують не просто так.
osiris

3
@osiris тепер тримайся, характеристики змінюються весь час. Я погоджуюсь, що це слід виконувати, але ви повинні враховувати основні наміри. Це було сказано, зважаючи на це, я погоджуюся з вами як його не лише для екранізаторів / відсутніх зображень / підказок - насправді це семантичне, про що я не знав. MDN: "Вимкнення цього атрибута вказує на те, що зображення є ключовою частиною вмісту, але текстовий еквівалент не доступний. Встановлення цього атрибута в порожній рядок вказує на те, що це зображення не є ключовою частиною вмісту; пропустити його від візуалізації ".
Джордж Мауер

3
Як бічна примітка, я вважаю, що правильна роль арії для ікони - це презентація . Не імг .
Сільвен Леру

2
@SylvainLeroux, я думаю, якщо значок використовується у кнопці разом із текстом, то роль - це презентація. Але якщо в кнопці використовується лише піктограма (без тексту), то її роль - img.
Jashwant

2
Це не робить його доступним! Ви протестували це з читачами екрану ?! Заміна спочатку доступного рішення <img alt="...">з <span role="img">робить все гірше. Не використовуйте aria-labelSPAN, не фокусується елемент. Це не завжди працюватиме так, як очікувалося. Не використовуйте, roleякщо ви не знаєте, що робите. Надмірне використання ARIA робить все гірше для всіх. Робить продукт недоступним, а код важче читати та підтримувати. А як щодо SEO? ARIA - це добре, але використовуйте з розумом - accessibility-developer-guide.com/knowledge/aria/bad-practices
Хрвойо Гольчич

12

Я здогадуюсь: оскільки Twitter бачить необхідність підтримувати застарілі веб-переглядачі, інакше вони будуть використовувати :before/ :afterpseudo-елементи.

Старі браузери не підтримують ті псевдоелементи, про які я згадував, тому їм потрібно використовувати фактичний HTML-елемент для піктограм, а оскільки піктограми не мають "ексклюзивного" тегу, вони просто перейшли з <i>тегом, і всі веб-переглядачі підтримують цей тег.

Вони, звичайно, могли б використовувати <span>, як і ви (що ВІДПРАВНО), але, мабуть, з тієї причини, яку я згадав вище плюс ті, згадані Квентіном , також є причиною того, що Bootstrap використовує <i>тег.

Це погана практика, коли ви використовуєте додаткову розмітку з міркувань стилю, саме тому були винайдені псевдоелементи , щоб відокремити вміст від стилю ... але коли ви бачите необхідність підтримувати застарілі браузери, іноді ви змушені робити такі види речі.

PS. Те, що піктограми починаються з «я» і що є <i>тег, є абсолютно випадковим.


3
Насправді, якщо ви подивитеся на код усередині I - це елемент до
DCdaz

12

Я взагалі інший підхід до відповідей всіх інших. Дозвольте мені зафіксувати своє рішення і заперечу, заявляючи, що іноді стандарти та угоди мають бути порушені, особливо в контексті стандартних визначень лексичних тегів HTML.

Ніщо не завадить вам створити спеціальні елементи, які є самоописовими для цього.

І сучасні браузери, і навіть IE 6+ (w / shim) можуть підтримувати такі речі, як:

<icon class="plus">

або

<icon-add>

Просто не забудьте нормалізувати тег:

 icon { display:block; margin:0; padding:0; border:0; ... }

і використовуйте прошивку, якщо вам потрібно підтримувати IE9 або раніше (див. пост нижче).

Перевірте цю публікацію StackOverflow:

Чи є спосіб створити власний тег html у HTML5

Для подальшого мого аргументу як у вузових директивах Google, так і в нових проектах Polymer використовується концепція спеціальних тегів HTML.


2
А потім ви переходите до валідатора W3C, входите <!doctype html> <html lang="en"> <head> <title>Hello</title> </head> <body> <icon></icon> </body> </html>і отримуєте одну помилку, кажучиError: Element icon not allowed as child of element body in this context.
Digital Ninja

6

Я подумав, що це виглядало досить погано - тому що я нещодавно працював над шаблоном Joomla, і я продовжував отримувати шаблон з ладом W3C, тому що він використовував <i>тег, і це застаріло, оскільки його первісне використання було в курсі чогось, що зараз робиться через CSS не більше HTML.

Це дійсно погана практика, тому що, побачивши це, я пройшов шаблон і змінив усі <i>теги, <span style="font-style:italic">а потім поцікавився, чому весь шаблон виглядає дивним.

Це головна причина, що погано використовувати <i>тег таким чином - ви ніколи не знаєте, хто буде потім дивитись на вашу роботу і "припускати", що те, що ви насправді намагалися зробити, - це курсив тексту, а не показ зображення значок. Я просто розмістив кілька іконок на веб-сайті, і я зробив це з наступним кодом

<img class="icon" src="electricity.jpg" alt="Electricity" title="Electricity">

таким чином у мене є всі мої піктограми в одному класі, тому будь-які зміни, які я вношу, впливають на всі значки (скажімо, я хотів, щоб вони були більшими чи меншими, або закругленими рамками тощо), текст alt дає читачам екрану можливість сказати людині, що піктограма швидше, ніж можливо, отримує просто "текст курсивом, кінцем курсивом" (я точно не знаю, як читачі екрану читають екрани, але, мабуть, це щось подібне), а заголовок також дає користувачеві можливість перевести курсор миші зображення та знайдіть підказку, яка розповість їм, що таке значок, якщо вони не зможуть розібратися. Набагато краще, ніж використовувати<i> - і також він проходить стандарт W3C.


7
<i>не застаріло.
користувач2867288

3
Тег "img" не працює для піктограм шрифту. Я маю на увазі, що це так, але ваш браузер надсилає запит на ваш сайт щоразу, коли він аналізується.
Навін

1
Замість цього <span style="font-style:italic" />ви могли просто використати нову альтернативу -<strong />
ewino

@ewino Я вважаю, ви маєте на увазі <em> </em>, що є семантичною заміною наголосу на словах (а не просто накладення курсивом)
amklose

Ви справді правильні :-)
ewino

2

Я також вважав це корисним, коли я хотів розмістити значок з абсолютним розміщенням всередині <a>тегу посилання .

<img>Спочатку я подумав над тегом, але стилізація за замовчуванням цих тегів всередині посилань зазвичай має стильову обробку та / або тіньові ефекти. Плюс до цього, невірно використовувати <img>тег, не визначаючи атрибут "src", тоді як я використовую декларацію аркуша фонового зображення, щоб зображення не зависало та перетягувалося.

На даний момент ви думаєте про теги типу, <span>або <i>- у цьому випадку <i>має такий сенс, як іконка цього типу.

Загалом, я думаю, що його користь, окрім того, що вона є інтуїтивно зрозумілою, полягає в тому, що вона вимагає мінімальних коригувань аркуша стилів, щоб цей тег працював як значок.


Ось чому я вважаю, що це погана практика. Історично <B> було для сміливого, а <I> - для курсивного. Отже, якщо ви використовували <i>, ви створюєте порожній курсив, який не є для чого. Вони були замінені <strong> та <em> Отже, для того, напевно, я вважаю, що стародавні браузери не хотіли б розмічати сторінку порожніми курсивними курсивами, а що стосується зчитувачів екрана для сліпих, чи не повинні ці значки всередині посилання скажімо, ТЕКСТ. Тож <span> - кращий вибір, оскільки ви можете зробити нульовий розмір шрифту та мати піктограму.
користувач1712691

1
@ User1712691 Це поширений міф , що <b>і <i>були замінені <strong>і <em>відповідно. Але правда є <b>і <i>не застаріла, і набула нових смислових значень. Прочитайте офіційні характеристики, щоб дізнатися більше.
chharvey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.