Czy powinienem używać znacznika <i> dla ikon zamiast <span>? [Zamknięte]

571

Zajrzałem do źródła Facebooka, używają <i>znacznika do wyświetlania ikon.

Również dzisiaj zajrzałem do Bootstrap na Twitterze. Używa także <i>znacznika do wyświetlania ikon.

Ale,

Ze specyfikacji HTML5 :

Element I reprezentuje rozpiętość tekstu naprzemiennym głosem lub nastrojem lub w inny sposób równoważony z normalną prozą, taką jak oznaczenie taksonomiczne, termin techniczny, idiomatyczne zdanie z innego języka, myśli, nazwy statku lub innego proza, której typowa prezentacja typograficzna jest pochylona.

Dlaczego używają <i>znaczników do wyświetlania ikon?

Czy to nie jest zła praktyka?

A może coś tu brakuje?

Używam spando wyświetlania ikon i wydaje mi się, że do tej pory działa.

Aktualizacja:

Bootstrap 3 używa teraz spanikon. Official Doc

Jashwant
źródło
5
Przykład: Odpowiedź strzałka poniżej tweety na Twitterze: <i class="sm-reply"></i>.
kay - SE is evil
2
Dlaczego nie <span>należy używać?
Jashwant,
6
Wydaje mi się, że w przypadku danych sematycznych i dostępności znacznik img powinien zawsze być używany w przypadku ikon z tekstem alternatywnym.
nroose
12
@nroose Podejrzewam, że obrazy używane do ikon nie są częścią treści, ale stylu strony (w przeciwieństwie do na przykład zdjęcia krowy na stronie wikipedii o krowach). Dlatego powinny być zdefiniowane w css, a nie jako obraz w znaczniku img.
CJStuart,
6
Nie sądzę, aby decyzje semantyczne w HTML5 były uważane za „oparte na opiniach”.
Aaron

Odpowiedzi:

596

Dlaczego używają <i>znaczników do wyświetlania ikon?

Ponieważ to jest:

  • Krótki
  • i oznacza ikonę (chociaż nie w HTML)

Czy to nie jest zła praktyka?

Okropna praktyka. To triumf wydajności nad semantyką.

Quentin
źródło
87
To mój pierwszy dzień, aby nauczyć się bootstrapu Twittera i szkoda, że ​​nie przestrzegają najlepszych praktyk.
Jashwant
25
niektórzy ludzie nawet idą dalej i niewłaściwie wykorzystują inne elementy, takie jak <tt>= etykietka itd. ... chcesz mi pomóc znaleźć ATSMOHE? „Przeciw semantycznemu niewłaściwemu wykorzystaniu elementów HTML”
Christoph
18
Strony te mają miliony stron przeglądanych każdego dnia. Jeśli zaoszczędzą 100 bajtów danych za każdym razem, gdy klient zażąda strony dzięki tej praktyce, oszczędzają znaczną część przepustowości.
Dalmas
62
Aby zaoszczędzić 100 bajtów, musieliby zawierać 16 ikon i nie włączać kompresji .
Quentin
7
Przy użyciu ligatur użycie iznacznika do wyświetlania ikon jest semantyczne. W rzeczywistości Google sugeruje użycie iznacznika z ligaturami w przewodniku po ikonach materiałów .
Aust
269

Wskakuję tu trochę za późno, ale sam natknąłem się na tę stronę. Oczywiście nie wiem, w jaki sposób Facebook lub Twitter to uzasadniły, ale oto mój własny proces przemyślenia tego, co warto.

W końcu doszedłem do wniosku, że ta praktyka nie jest aż tak niekonwencjonalna (czy to słowo?). W rzeczywistości, oprócz skrótu i ​​miłego skojarzenia „i jest dla ikony”, myślę, że jest to najbardziej semantyczny wybór ikony, gdy prosty <img>tag nie jest praktyczny.

1. Użycie jest zgodne ze specyfikacją.

Chociaż może nie być to, co miał na myśli W3, wydaje mi się, że oficjalna specyfikacja <i>dość łatwo pomieści ikonę. W końcu symbol strzałki odpowiedzi mówi „odpowiedz” w inny sposób. Wyraża termin techniczny, który może być nieznany czytelnikowi i zwykle byłby pisany kursywą. („Tutaj na Twitterze nazywamy to strzałką odpowiedzi ”). Jest to termin z innego języka: języka symbolicznego.

Jeśli zamiast symbolu strzałki użyty zostanie Twitter <i>shout out</i>lub <i>[Japanese character for reply]</i>(na angielskiej stronie), byłoby to zgodne ze specyfikacją. Dlaczego więc nie <i>[reply arrow]</i>? (Mówię tu wyłącznie o semantyce HTML, a nie o dostępności, do której dojdę.)

O ile widzę, jedyną częścią specyfikacji wyraźnie naruszoną przez użycie ikony jest fraza „rozpiętość tekstu” (gdy znacznik również nie zawiera tekstu). Oczywiste jest, że <i>znacznik jest przeznaczony głównie do tekstu, ale jest to dość mały szczegół w porównaniu z ogólną intencją znacznika. Ważnym pytaniem dla tego znacznika nie jest to, jaki format treści zawiera, ale jakie jest znaczenie tej treści.

Jest to szczególnie prawdziwe, gdy weźmie się pod uwagę, że linia między „tekstem” a „ikoną” może prawie nie istnieć na stronach internetowych. Tekst może wyglądać bardziej jak ikona (jak w przykładzie japońskim) lub ikona może wyglądać jak tekst (jak w przycisku jpg z napisem „Prześlij” lub zdjęcie kota z nałożonym podpisem) lub tekst może zostać zastąpiony lub wzbogacony o obraz za pomocą CSS. Tekst, obraz - kogo to obchodzi? Cała zawartość. Dopóki wszyscy - ludzie z upośledzeniami, przeglądarki z upośledzeniami, pająki wyszukiwarek i inne maszyny różnego rodzaju mogą zrozumieć to znaczenie, wykonaliśmy naszą pracę.

Zatem fakt, że autorzy specyfikacji nie myśleli (ani nie wybrali), aby to wyjaśnić, nie powinien wiązać naszych rąk z robieniem tego, co ma sens i jest zgodne z duchem tagu. <a>Tag był pierwotnie przeznaczony do podjęcia użytkownikowi gdzieś indziej, ale teraz to może pojawi się schowek. Big whoop, prawda? Jeśli ktoś wymyślił, jak wyskoczyć lightbox po kliknięciu, zanim specyfikacja złapie, nadal powinien był użyć <a>tagu, a nie <span>, nawet jeśli nie był on całkowicie zgodny z obecną definicją - ponieważ był najbliższy i był nadal zgodny z duchem tagu („coś się stanie, gdy klikniesz tutaj”). To samo dotyczy <i>- niezależnie od tego, co w nim umieścisz lub jak twórczo z niego korzystasz,

2. <i>Znacznik dodaje semantyczne znaczenie do elementu ikony.

Alternatywną opcją przenoszenia samej klasy ikon jest <span>, co oczywiście nie ma żadnego znaczenia semantycznego. Gdy maszyna pyta, <span>co zawiera, mówi: „Nie wiem. To może być cokolwiek”. Ale <i>tag mówi: „Podaję inny sposób wypowiedzenia niż zwykły, a może nieznany termin”. To nie to samo, co „Zawieram ikonę”, ale jest o wiele bliżej niż <span>mam!

3. Ostatecznie powszechne użycie jest słuszne.

Oprócz powyższego warto wziąć pod uwagę, że czytniki maszynowe (czy to wyszukiwarka, czytnik ekranu itp.) Mogą w dowolnym momencie zacząć brać pod uwagę fakt, że Facebook, Twitter i inne strony internetowe używają <i>tagu jako ikon. Nie dbają o specyfikację tak bardzo, jak dbają o wydobywanie znaczenia z kodu wszelkimi niezbędnymi środkami. Mogą więc wykorzystać tę wiedzę o powszechnym użyciu, aby po prostu zarejestrować, że „może tu być ikona”, lub zrobić coś bardziej zaawansowanego, jak wywołanie CSS w celu podpowiedzi do znaczenia lub kto wie co. Jeśli więc zdecydujesz się na użycie <i>ikon for w swojej witrynie, być może zapewniasz więcej znaczenia niż specyfikacja.

Co więcej, jeśli to użycie stanie się powszechne, prawdopodobnie zostanie włączone do specyfikacji w przyszłości. Następnie przejrzysz swój kod, zastępując <span>s na <i>'s! Może więc mieć sens wejście w coś, co wydaje się być kierunkiem specyfikacji, szczególnie gdy nie jest ona wyraźnie sprzeczna z obecną specyfikacją. Powszechne stosowanie zwykle dyktuje reguły językowe bardziej niż na odwrót. Jeśli masz wystarczająco dużo lat, czy pamiętasz, że „strona internetowa” była oficjalną pisownią, kiedy słowo było nowe? Słowniki podkreślały, że musi być spacja, a sieć musi być pisana wielkimi literami. Powody były semantyczne. Ale powszechne użycie mówiło: „Cokolwiek, to głupie. Używam„ strony internetowej ”, ponieważ jest bardziej zwięzłe i wygląda lepiej”. I wkrótce

4. Więc idę dalej i używam go.

Tak więc <i>nadaje więcej znaczenia maszynom ze względu na specyfikację, zapewnia więcej znaczenia ludziom, ponieważ łatwo kojarzymy „i” z „ikoną” i ma on tylko jedną literę. Zdobyć! A jeśli upewnisz się, że umieścisz równoważny tekst wewnątrz <i>tagu lub tuż obok niego (tak jak robi to Twitter), to czytniki ekranu rozumieją, gdzie kliknąć, aby odpowiedzieć, link jest użyteczny, jeśli CSS nie ładuje się, a czytelnicy z dobrymi ludźmi wzrok i przyzwoita przeglądarka widzą ładną ikonę. Mając to na uwadze, nie widzę negatywnych skutków.

Ostrokrzew
źródło
33
Istnieją jednak sposoby, aby to zrobić już bez nadużywania <i>: użyj dowolnego elementu tekstowego, w tym przycisków lub linków, i dodaj ikonę za pomocą grafiki w tle i wypełnienia, w taki sam sposób, jak to się robi <i>. Wyglądałby HTML <a ...>Reply</a>, który jest semantyczny, strona w stylu zawiera dodatkowo ikonę. Jeśli ikona jest jedynym podstawowym elementem, powinna być <img src="..." alt="Reply">.
deceze
36
@Holly, wziąłeś to na zupełnie inną stronę, ale przepraszam, nie zgadzam się z każdą wypowiedzianą linią.
Jashwant
11
Pustka (nawet ikona) nie jest jednak tekstem, a tekst jest tym, co jest zapisane w specyfikacji.
Ry-
17
Specjalnie napisane w specyfikacji oznacza jack. Znasz to i wszyscy inni to wiedzą. To jest przewodnik. Nic więcej. Czy uważasz, że IE dba o specyfikację? Są coraz lepsze. Czy sądzisz, że każda przeglądarka stara się uzyskać doskonałą specyfikację? Czy uważasz, że wszyscy na tej planecie poprawnie używają <code> nawigacji, nagłówka, stopki, sekcji, na bok, ... n </code>? Nie. Idę do strony po stronie, gdzie na bok jest zamiennik <code> <div class = "sidebar"> </code> I wiesz co? Sposób, w jaki ludzie będą nadal korzystać, definiuje w przyszłości „semantyczny”.
o_O
17
Świetne argumenty, myślę, że mnie przekonałeś. Szczególnie przekonujący jest numer 3, „powszechne użycie poprawia”. Podobnie jak w przypadku wspólnego języka, jeśli wszyscy zaczną używać słowa w taki sposób, staje się to standardowym użyciem. Specyfikacja HTML jest od jakiegoś czasu dokumentem ewoluującym, a przestrzeganie jej w sposób dogmatyczny jest po prostu głupie. Moim zdaniem przestrzeganie wspólnej konwencji jest ścieżką bardziej zrównoważoną. Ponadto element <i> jest w tej chwili prawie przestarzały, więc czuję się dobrze, dając mu nowe, semantycznie bogate życie! Jestem ciekawy, jak zmieni się specyfikacja w tym zastosowaniu, jak sądzę, bez wątpienia tak się stanie.
Logic Artist
59

Odpowiedź Quentina wyraźnie stwierdza, że itag nie powinien być używany do definiowania ikon.

Ale Holly zasugerowała, że spannie ma to samo w sobie znaczenia, i głosowała za izamiast spantagu.

Niewielu sugerowało użycie, imgponieważ jest semantyczne i zawiera altznacznik. Ale nie powinniśmy również używać, imgponieważ nawet pusty srcwysyła żądanie do serwera. Przeczytaj tutaj

Myślę, że właściwym sposobem byłoby

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

To rozwiązuje problem braku alttagu spani czyni go dostępnym dla użytkowników z upośledzeniem wzroku. Jest semantyczny i nie nadużywa (hakuje) żadnego tagu.

Jashwant
źródło
6
@GeorgeMauer, wszyscy szanujący się projektanci html / web dbają o tagi alt. specyfikacja istnieje z jakiegoś powodu. podobnie jak rampy w budynkach, nie bez powodu istnieją znaczniki alt, tytuł i aria.
Ozyrys
3
@osiris teraz się trzyma, specyfikacje zmieniają się cały czas. Zgadzam się, że warto za tym podążać, ale należy wziąć pod uwagę zasadnicze zamiary. Biorąc to pod uwagę, od kiedy to sprawdzam, zgadzam się z tobą, ponieważ dotyczy to nie tylko czytników ekranu / brakujących obrazów / podpowiedzi - w rzeczywistości jest semantyczny, o którym nie wiedziałem. MDN: „Pominięcie tego atrybutu oznacza, że ​​obraz jest kluczową częścią treści, ale nie jest dostępny żaden tekstowy odpowiednik. Ustawienie tego atrybutu na pusty ciąg oznacza, że ​​ten obraz nie jest kluczową częścią treści; przeglądarki niewizualne mogą pomiń to podczas renderowania. ”
George Mauer
3
Na marginesie uważam, że poprawną rolą arii dla ikony jest prezentacja . Nie img .
Sylvain Leroux
2
@SylvainLeroux, myślę, że jeśli ikona jest używana w przycisku wraz z tekstem, to rolą jest prezentacja. Ale jeśli w przycisku używana jest tylko ikona (bez tekstu), jego rolą jest img.
Jashwant,
2
NIE JEST DOSTĘPNE! Czy przetestowałeś go z czytnikami ekranu ?! Wymiana natywnie dostępne rozwiązanie <img alt="...">z <span role="img">sprawia, że wszystko gorzej. Nie używaj aria-labelna SPAN, element, na którym nie można ustawić ostrości. Nie zawsze będzie działać zgodnie z oczekiwaniami. Nie używaj, rolejeśli nie wiesz, co robisz. Nadużywanie ARIA pogarsza wszystko dla wszystkich. Uczynienie produktu niedostępnym, a kod trudniejszym do odczytania i utrzymania. A co z SEO? ARIA jest dobra, ale używaj mądrze - accessibility-developer-guide.com/knowledge/aria/bad-practices
Hrvoje Golcic
12

Domyślam się: ponieważ Twitter widzi potrzebę obsługi starszych przeglądarek, w przeciwnym razie używaliby :before/ :afterpseudo-elementów.

Starsze przeglądarki nie obsługują tych pseudo-elementów, o których wspomniałem, dlatego muszą używać rzeczywistego elementu HTML dla ikon, a ponieważ ikony nie mają znacznika „wyłącznego”, po prostu poszły z tym <i>znacznikiem, a wszystkie przeglądarki obsługują ten tag.

Mogliby z pewnością użyć <span>, tak jak ty (co jest w zupełności w porządku), ale prawdopodobnie z powodu, o którym wspomniałem powyżej oraz tych wymienionych przez Quentin , również dlatego Bootstrap używa <i>tagu.

Jest to zła praktyka, gdy używasz dodatkowego znacznika ze względu na styl, dlatego wymyślono pseudoelementy , aby oddzielić zawartość od stylu ... ale kiedy widzisz potrzebę obsługi starszych przeglądarek, czasami jesteś zmuszony zrobić tego rodzaju rzeczy

PS. Fakt, że ikony zaczynają się od „i” i że jest <i>tag, jest całkowicie przypadkowy.

Ricardo Zea
źródło
3
Nie bardzo, jeśli spojrzysz na kod wewnątrz elementu I jest przed
DCdaz
12

Całkowicie odmiennie podchodzę do odpowiedzi wszystkich innych tutaj. Pozwólcie mi prefiksować moje rozwiązanie i argumentować, stwierdzając, że czasami standardy i konwencje mają być łamane, szczególnie w kontekście standardowych definicji znaczników leksykalnych HTML.

Nic nie stoi na przeszkodzie, aby tworzyć niestandardowe elementy, które są samoopisujące w stosunku do swojego celu.

Zarówno nowoczesne przeglądarki, a nawet IE 6+ (w / shim) mogą obsługiwać takie rzeczy jak:

<icon class="plus">

lub

<icon-add>

Po prostu upewnij się, aby znormalizować tag:

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

i użyj podkładki dystansowej, jeśli potrzebujesz obsługi IE9 lub wcześniejszej (zobacz post poniżej).

Sprawdź ten post StackOverflow:

Czy istnieje sposób na utworzenie własnego tagu HTML w HTML5

Aby podnieść mój argument, zarówno dyrektywy Google Angular, jak i nowe projekty Polymer wykorzystują koncepcję niestandardowych tagów HTML.

Timothy Perez
źródło
2
A potem idziesz do walidatora W3C, wchodzisz <!doctype html> <html lang="en"> <head> <title>Hello</title> </head> <body> <icon></icon> </body> </html>i dostajesz pojedynczy błąd, mówiącError: Element icon not allowed as child of element body in this context.
Digital Ninja
6

Pomyślałem, że wygląda to całkiem źle - ponieważ ostatnio pracowałem nad szablonem Joomla i ciągle otrzymywałem błąd w W3C, ponieważ używał <i> znacznika i przestał obowiązywać, ponieważ pierwotnie użyto go do kursywy, co teraz odbywa się za pomocą CSS już nie HTML.

To naprawdę zła praktyka, ponieważ kiedy go zobaczyłem, przeszedłem przez szablon i zmieniłem wszystkie <i>tagi na<span style="font-style:italic"> a potem zastanawiałem się, dlaczego cały szablon wyglądał dziwnie.

Jest to główny powód, dla którego używanie <i>tagu w ten sposób jest kiepskie - nigdy nie wiadomo, kto będzie potem patrzył na twoją pracę i „zakładał”, że tak naprawdę próbujesz zrobić to kursywa, a nie wyświetlanie Ikona. Właśnie umieściłem kilka ikon na stronie i zrobiłem to z następującym kodem

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

w ten sposób mam wszystkie moje ikony w jednej klasie, więc wszelkie zmiany, które wprowadzę, wpływają na wszystkie ikony (powiedzmy, że chciałem, żeby były większe lub mniejsze, lub zaokrąglone ramki itp.), tekst alternatywny daje czytelnikom ekranu możliwość powiedzenia osobie, co ikona jest raczej niż „tekst pisany kursywą, koniec kursywą” (nie wiem dokładnie, jak czytniki ekranu czytają ekrany, ale wydaje mi się, że to coś takiego), a tytuł daje również szansę na najechanie myszką obraz i uzyskaj etykietkę z informacją, jaka jest ikona, na wypadek, gdyby nie mogli tego rozgryźć. O wiele lepsze niż używanie <i>- a także spełnia standard W3C.

TheKLF99
źródło
7
<i>nie jest przestarzałe.
user2867288
3
Tag „img” nie działa w przypadku ikon czcionek. Mam na myśli, że tak, ale Twoja przeglądarka wysyła żądanie do Twojej witryny za każdym razem, gdy jest analizowane.
Navin
1
Zamiast tego <span style="font-style:italic" />mogłeś po prostu skorzystać z jego nowszej alternatywy -<strong />
ewino
@ewino Wydaje mi się, że masz na myśli <em> </em>, który jest semantycznym zamiennikiem podkreślania słów (zamiast tylko kursywą)
amklose
Naprawdę masz rację :-)
ewino
2

Uznałem to również za przydatne, gdy chciałem umieścić ikonę z absolutnym pozycjonowaniem w linku <a> tagu .

<img>Najpierw pomyślałem o tagu, ale domyślna stylizacja tagów w linkach zazwyczaj ma stylizację ramek i / lub efekty cienia. Ponadto używanie an. Wydaje się niewłaściwe<img> znacznika bez zdefiniowania atrybutu „src”, podczas gdy używam deklaracji arkusza stylów tła-obrazu, aby obraz nie widniał i nie przeciągał się.

W tym momencie myślisz o tagach takich jak <span>lub <i>- w takim przypadku<i> ma to tyle sensu, co ten typ ikony.

Podsumowując, myślę, że jego zaletą jest intuicyjność, ponieważ wymaga minimalnej regulacji arkusza stylów, aby ten znacznik działał jak ikona.

Szmaragdowy Król
źródło
Ok Oto dlaczego uważam, że to zła praktyka. Historycznie <B> było dla Bolda, a <I> było dla metalicznego. Więc jeśli użyłeś <i>, tworzysz pusty znacznik itallic, który nie jest do tego przeznaczony. Zostały one zastąpione przez <strong> i <em> Więc dla celów starożytnych przeglądarek nie chciałbyś oznaczać strony pustymi tagami italicznymi, a co z czytnikami ekranu dla osób niewidomych, nie powinny te ikony w łączu powiedzmy TEKST. Dlatego <span> jest lepszym wyborem, ponieważ możesz ustawić czcionkę na zero i mieć również ikonę.
user1712691,
1
@ user1712691 To powszechny mit, że <b>i <i>zostały zastąpione <strong>i <em>odpowiednio. Ale prawda jest <b>i <i>nie jest przestarzała i nabrała nowych znaczeń semantycznych. Przeczytaj oficjalne specyfikacje, aby dowiedzieć się więcej.
chharvey