Должен ли я использовать тег <i> для иконок вместо <span>? [закрыто]

572

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

Кроме того, сегодня я заглянул в Bootstrap Twitter. Он также использует <i>тег для отображения значков.

Но,

Из спецификации HTML5 :

Элемент I представляет собой фрагмент текста альтернативным голосом или настроением или иным образом смещенный относительно обычной прозы, такой как таксономическое обозначение, технический термин, идиоматическая фраза из другого языка, мысль, название корабля или какой-либо другой проза, типичное изложение которой выделено курсивом.

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

Разве это не плохая практика?

Или я что-то здесь упускаю?

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

Обновить:

Bootstrap 3 теперь использует spanиконки. Официальный документ

Jashwant
источник
5
Пример: В ответе стрелка ниже твитов на Twitter: <i class="sm-reply"></i>.
Кей - SE злой
2
Почему не <span>следует использовать?
Jashwant
6
Мне кажется, что для семантики и доступности тег img всегда должен использоваться для значков с альтернативным текстом.
nroose
12
@nroose Мое предположение заключается в том, что изображения, используемые для иконок, являются не частью контента, а стилем страницы (в отличие, например, от изображения коровы на странице википедии о коровах). Поэтому они должны быть определены в CSS, а не как изображение в теге img.
CJStuart
6
Я не думаю, что семантические решения в HTML5 следует рассматривать как «основанные на мнении».
Аарон

Ответы:

597

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

Потому что это:

  • короткий
  • я обозначаю значок (хотя не в HTML)

Разве это не плохая практика?

Ужасная практика. Это триумф производительности над семантикой.

Quentin
источник
87
Это мой первый день, чтобы изучить бутстрап твиттера, и мне жаль, что они не следуют передовым методам.
Jashwant
25
некоторые люди даже идут дальше и неправильно используют другие элементы, такие как <tt>= подсказка и так далее ... хотите помочь мне найти ATSMOHE? «Против семантического неправильного использования HTML-элементов»
Кристоф
18
На этих сайтах просматриваются миллионы страниц каждый день. Если они сохраняют 100 байтов данных каждый раз, когда клиент запрашивает страницу с этой практикой, они экономят значительную часть полосы пропускания.
Далмас
62
Чтобы сохранить 100 байтов, они должны были бы включать 16 значков и не включать сжатие .
Квентин
7
При использовании лигатур использование iтега для отображения значков является семантическим. Фактически, Google предлагает использовать iтег с лигатурами в руководстве по значкам материалов .
Aust
269

Я тут немного запрыгнул, но наткнулся на эту страницу, когда обдумывал ее сам. Конечно, я не знаю, как Facebook или Twitter оправдали это, но вот мой собственный мыслительный процесс того, что он стоит.

В конце концов, я пришел к выводу, что эта практика не так уж бессмысленна (это слово?). На самом деле, помимо краткости и приятной ассоциации «я для иконы», я думаю, что это самый семантический выбор для иконы, когда простой <img>тег не практичен.

1. Использование соответствует спецификации.

Хотя это, возможно, и не то, что в основном имел в виду W3, мне кажется, что официальная спецификация <i>вполне может вместить иконку. В конце концов, символ стрелки ответа говорит «ответить» по-другому. Он выражает технический термин, который может быть незнаком для читателя и обычно выделяется курсивом. («Здесь, в Twitter, это то, что мы называем стрелкой ответа ».) И это термин из другого языка: символический язык.

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

Насколько я вижу, единственная часть спецификации, явно нарушенная использованием значков, - это фраза "span of text" (когда тег также не содержит текста). Понятно, что <i>тег в основном предназначен для текста, но это довольно маленькая деталь по сравнению с общим назначением тега. Важный вопрос для этого тега заключается не в том, какой формат содержимого он содержит, а в том, что означает этот контент.

Это особенно верно, если учесть, что грань между «текстом» и «значком» может практически отсутствовать на веб-сайтах. Текст может больше походить на иконку (как в примере с Японией), либо иконка может выглядеть как текст (как на кнопке jpg с надписью «Отправить» или фотография кошки с наложенной надписью), либо текст может быть заменен или расширен с помощью изображение с помощью CSS. Текст, изображение - кого это волнует? Это все содержание. До тех пор, пока все - люди с нарушениями, браузеры с нарушениями, поисковики и другие машины различного типа могут понять этот смысл, мы выполнили свою работу.

Таким образом, тот факт, что авторы спецификации не думали (или не решили) уточнить это, не должны связывать нам руки с тем, что имеет смысл и соответствует духу тега. Первоначально <a>тег был предназначен для того, чтобы перевести пользователя куда-то еще, но теперь он может появиться в лайтбоксе. Большой возглас, верно? Если бы кто-то выяснил, как открыть лайтбокс при нажатии, прежде чем спецификация вступила в действие, ему все равно следовало бы использовать <a>тег, а не a <span>, даже если он не полностью соответствовал текущему определению - потому что он подошел ближе всего и был по-прежнему соответствует духу тега («что-то произойдет, когда вы нажмете здесь»). То же самое с <i>любым типом вещи, которую вы положили в нее, или как бы творчески вы ее не использовали,

2. <i>Тег добавляет смысловой смысл к элементу значка.

Альтернативный вариант для переноса класса значков сам по себе <span>, который, конечно, не имеет никакого семантического значения. Когда машина спрашивает, <span>что в ней содержится, она говорит: «Я не знаю. Может быть что угодно». Но <i>тег говорит: «У меня есть другой способ сказать что-то, чем обычный, или, может быть, незнакомый термин». Это не то же самое, что «У меня есть значок», но это гораздо ближе к этому, чем <span>получил!

3. В конце концов, общее использование делает правильно.

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

Более того, если это использование станет широко распространенным, оно, вероятно, будет включено в спецификацию в будущем. Затем вы будете проходить через ваш код, заменяя <span>s <i>на s! Поэтому, возможно, имеет смысл принять на вооружение то, что кажется направлением спецификации, особенно когда это явно не противоречит текущей спецификации. Общее использование имеет тенденцию диктовать языковые правила больше, чем наоборот. Если вы достаточно взрослый, помните ли вы, что "веб-сайт" был официальным написанием, когда слово было новым? Словари настаивают на том, что должно быть место, а сеть должна быть написана заглавными буквами. Для этого были семантические причины. Но обычное использование говорит: «Что угодно, это глупо. Я использую« сайт », потому что он более лаконичен и выглядит лучше». И вскоре

4. Так что я иду вперед и использую это.

Таким образом, <i>дает больше смысла машинам из-за спецификаций, он дает больше смысла людям, потому что мы легко связываем «i» со «значком», а длина его всего одна буква. Выиграть! И если вы обязательно включите эквивалентный текст либо внутри <i>тега, либо прямо рядом с ним (как это делает Твиттер), тогда программы чтения с экрана поймут, куда нажимать, чтобы ответить, ссылку можно использовать, если CSS не загружается, и читатели-люди с хорошим зрение и приличный браузер видят симпатичную иконку. Учитывая все это, я не вижу обратной стороны.

падуб
источник
33
Но есть способы сделать это уже без злоупотреблений <i>: используйте любой текстовый элемент, включая кнопки или ссылки, и добавьте значок, используя фоновую графику и некоторые отступы, так же, как это делается с помощью <i>. HTML-код будет выглядеть <a ...>Reply</a>, что является семантическим, стилизованная страница дополнительно отображает значок. Если значок является единственным основным элементом, он должен быть <img src="..." alt="Reply">.
deceze
36
@Holly, ты взял это на совершенно другую сторону, но извини, я не согласен с каждой отдельной строкой, которую ты сказал.
Jashwant
11
Пустота (даже значок) - это не текст, а текст - это то, что специально написано в спецификации.
Ry-
17
Специально написано в спецификации означает домкрат. Вы знаете это, и все остальные знают это. Это руководство. Ничего больше. Как вы думаете, IE заботится о спецификации? Они становятся лучше. Как вы думаете, каждый браузер пытается усовершенствовать спецификацию? Как вы думаете, все ли на планете правильно используют <code> nav, header, footer, section, aside, ... 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и делает их доступными для пользователей с нарушениями зрения. Это семантика и не злоупотребление (взлом) любого тега.

Jashwant
источник
6
@ GeorgeMauer, все уважающие себя html / веб-дизайнеры заботятся о alt-тегах. спецификация есть по причине. Подобно пандусам в зданиях, существуют причины, по которым существуют теги alt, title и aria.
Осирис
3
@osiris теперь держись, спецификации постоянно меняются. Я согласен, что хорошо следовать, но вы должны принять во внимание основные намерения. Это сказанное, так как, ища это, я согласен с Вами, поскольку это не только для скринридеров / отсутствующих изображений / всплывающих подсказок - там фактически есть семантика, о которой я не знал. MDN: «Пропуск этого атрибута указывает на то, что изображение является ключевой частью содержимого, но текстовый эквивалент недоступен. Установка этого атрибута в пустую строку указывает на то, что это изображение не является ключевой частью содержимого; невизуальные браузеры могут пропустите это от рендеринга. "
Джордж Мауэр
3
Как примечание стороны, я полагаю, что правильная роль арии для символа - представление . Не img .
Сильвен Леру
2
@SylvainLeroux, я думаю, если значок используется в кнопке вместе с текстом, то роль - это презентация. Но если в кнопке используется только значок (без текста), то его роль - img.
Jashwant
2
ЭТО НЕ СДЕЛАЕТ ЭТО ДОСТУПНО! Вы проверяли это с помощью программ чтения с экрана ?! Замена изначально доступного решения <img alt="...">с <span role="img">делает все хуже. Не используйте aria-labelна SPAN, не фокусируемый элемент. Это не всегда будет работать, как ожидалось. Не используйте, roleесли вы не знаете, что делаете. Злоупотребление ARIA делает все хуже для всех. Делать продукт недоступным, а код труднее читать и поддерживать. А как насчет SEO? ARIA - это хорошо, но используйте с умом - accessibility-developer-guide.com/knowledge/aria/bad-practices
Hrvoje Golcic
12

Мое предположение: поскольку Twitter видит необходимость поддерживать устаревшие браузеры, в противном случае они будут использовать :before/ :afterpseudo-elements.

Устаревшие браузеры не поддерживают те псевдоэлементы, о которых я упоминал, поэтому им нужно использовать фактический HTML-элемент для иконок, и, поскольку иконки не имеют «эксклюзивного» тега, они просто идут с <i>тегом, и все браузеры поддерживают этот тег.

Они, конечно, могли бы использовать <span>, как и вы (что ПОЛНОСТЬЮ), но, вероятно, по той причине, о которой я упоминал выше, а также по причинам, упомянутым Квентином , Bootstrap также использует этот <i>тег.

Это плохая практика , когда вы используете дополнительную разметку для укладки основания, поэтому псевдо-элементы были изобретены, чтобы отделить содержание от стиля ... но когда вы видите необходимость поддержки устаревших браузеров, иногда вы вынуждены делать такого рода вещи.

PS. Тот факт, что значки начинаются с «i» и что есть <i>тег, совершенно случайно.

Рикардо Зеа
источник
3
Не совсем, если вы посмотрите на код внутри элемента I, это элемент before
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

Чтобы поддержать мой аргумент, и в Angular Directives 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">

Таким образом, у меня все иконки в одном классе, поэтому любые изменения, которые я делаю, влияют на все иконки (скажем, я хотел, чтобы они были больше или меньше, или закругленные границы и т. д.), альтернативный текст дает читателям экрана возможность сказать человеку, что значок вместо того, чтобы получать просто «текст курсивом, конец курсивом» (я точно не знаю, как программы чтения с экрана читают экраны, но я думаю, что-то вроде этого), а название также дает пользователю возможность навести курсор мыши изображение и получите всплывающую подсказку с сообщением о значке на тот случай, если они не смогут его понять. Гораздо лучше, чем использовать <i>- и он также соответствует стандарту W3C.

TheKLF99
источник
7
<i>не считается устаревшим
user2867288 16.09.15
3
Тег img не работает для значков шрифтов. Я имею в виду, что это так, но ваш браузер отправляет запрос на ваш сайт каждый раз, когда он анализируется.
Навин
1
Вместо этого <span style="font-style:italic" />вы могли бы просто использовать его более новую альтернативу<strong />
ewino
@ewino Я полагаю, вы имеете в виду <em> </ em>, который является семантической заменой
выделения
Вы действительно правы :-)
ewino
2

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

<img>Сначала я подумал о теге, но стиль по умолчанию для этих тегов внутри ссылок обычно имеет стиль рамки и / или эффекты тени. Кроме того, неправильно использовать <img>тег без определения атрибута «src», тогда как я использую объявление таблицы стилей фонового изображения, чтобы изображение не появлялось и не перетаскивалось.

На данный момент вы думаете о тегах, таких как <span>или <i>- в этом случае <i>имеет такой же смысл, как значок этого типа.

В целом, я думаю, что его преимущество, помимо интуитивности, заключается в том, что для того, чтобы этот тег работал в качестве значка, требуются минимальные корректировки таблицы стилей.

Эмери Кинг
источник
Хорошо. Вот почему я думаю, что это плохая практика. Исторически <B> было для Bold, а <I> - для курсива. Поэтому, если вы использовали <i>, вы создаете пустой тег itallic, который не предназначен для этого. Они были заменены на <strong> и <em>. Поэтому, я полагаю, что в древних браузерах вы не хотели бы размечать страницу пустыми курсивными тегами, а как насчет программ чтения с экрана для слепых, не должны ли эти значки внутри ссылки быть скажем, текст. Так что <span> - лучший выбор, так как вы можете установить нулевой размер шрифта и значок.
user1712691 30.09.16
1
@ user1712691 Это распространенный миф, что <b>и <i>были заменены на <strong>и <em>соответственно. Но правда, <b>и <i>не осуждается, и взяли на себя новые смысловые значения. Читайте официальные спецификации, чтобы узнать больше.
Чарви