Dovrei usare il tag <i> per le icone anziché <span>? [chiuso]


572

Ho esaminato la fonte di Facebook, usano il <i>tag per visualizzare le icone.

Inoltre, oggi ho esaminato Bootstrap di Twitter. Utilizza anche <i>tag per visualizzare le icone.

Ma,

Dalle specifiche HTML5 :

L'elemento I rappresenta un arco di testo in una voce o un umore alternativi, o altrimenti compensato dalla prosa normale, come una designazione tassonomica, un termine tecnico, una frase idiomatica di un'altra lingua, un pensiero, un nome di nave o qualche altro prosa la cui tipica presentazione tipografica è in corsivo.

Perché usano i <i>tag per visualizzare le icone?

Non è una cattiva pratica?

O mi sto perdendo qualcosa qui?

Sto usando spanper visualizzare le icone e sembra funzionare per me fino ad ora.

Aggiornare:

Bootstrap 3 ora utilizza le spanicone. Doc ufficiale


5
Esempio: La risposta freccia sotto i tweet su Twitter: <i class="sm-reply"></i>.
kay - SE is evil

2
Perché non dovrebbe <span>essere usato?
Jashwant,

6
Mi sembra che per la semantica e l'accessibilità, il tag img debba sempre essere usato per le icone, con il testo alternativo.
Annullato il

12
@nroose La mia opinione su questo è che le immagini utilizzate per le icone non fanno parte del contenuto, ma dello stile della pagina (a differenza, ad esempio, di una mucca sulla pagina di Wikipedia sulle mucche). Pertanto, dovrebbero essere definiti nel CSS, non come un'immagine in un tag img.
CJStuart,

6
Non penso che le decisioni semantiche in HTML5 debbano essere considerate "basate sull'opinione".
Aaron

Risposte:


597

Perché usano i <i>tag per visualizzare le icone?

Perchè è:

  • Corto
  • sto per icona (anche se non in HTML)

Non è una cattiva pratica?

Pratica terribile. È un trionfo della prestazione sulla semantica.


87
È il mio primo giorno per imparare il bootstrap di Twitter e mi dispiace che non stiano seguendo le migliori pratiche.
Jashwant,

25
alcune persone vanno anche oltre e <tt>usano in modo improprio altri elementi, come = tooltip e così via ... vuoi aiutarmi a trovare ATSMOHE? "Contro l'abuso semantico di elementi HTML"
Christoph,

18
Questi siti Web hanno milioni di pagine visualizzate ogni giorno. Se salvano 100 byte di dati ogni volta che un client richiede una pagina con questa pratica, risparmia una quantità significativa di larghezza di banda.
Dalmas,

62
Per salvare 100 byte dovrebbero includere 16 icone e non abilitare la compressione .
Quentin,

7
Con l'uso delle legature , l'uso del itag per visualizzare le icone è semantico. In effetti, Google suggerisce l'uso del itag con le legature nella sua guida alle icone dei materiali .
Agosto

269

Salto qui un po 'tardi, ma mi sono imbattuto in questa pagina quando ci ho riflettuto io. Ovviamente non so come lo giustificasse Facebook o Twitter, ma ecco il mio processo di pensiero per quello che vale.

Alla fine, ho concluso che questa pratica non è così poco romantica (è una parola?). In effetti, oltre alla brevità e alla simpatica associazione di "io sono per icona", penso che in realtà sia la scelta più semantica per un'icona quando un <img>tag semplice non è pratico.

1. L'utilizzo è conforme alle specifiche.

Anche se potrebbe non essere quello che W3 pensava principalmente, mi sembra che le specifiche ufficiali <i>potrebbero ospitare un'icona abbastanza facilmente. Dopotutto, il simbolo della freccia di risposta dice "rispondi" in un altro modo. Esprime un termine tecnico che potrebbe non essere familiare al lettore e che sarebbe tipicamente in corsivo. ("Qui su Twitter, questo è ciò che chiamiamo una freccia di risposta .") Ed è un termine di un'altra lingua: un linguaggio simbolico.

Se, invece del simbolo della freccia, Twitter utilizzato <i>shout out</i>o <i>[Japanese character for reply]</i>(su una pagina inglese), ciò sarebbe coerente con le specifiche. Allora perché no <i>[reply arrow]</i>? (Sto parlando di semantica rigorosamente HTML qui, non di accessibilità, che vedrò.)

Per quanto posso vedere, l'unica parte della specifica esplicitamente violata dall'uso dell'icona è la frase "span of text" (quando il tag non contiene anche testo). È chiaro che il <i>tag è principalmente pensato per il testo, ma è un dettaglio piuttosto piccolo rispetto all'intento generale del tag. La domanda importante per questo tag non è quale formato di contenuto contenga, ma quale sia il significato di quel contenuto.

Ciò è particolarmente vero se si considera che la linea tra "testo" e "icona" può essere quasi inesistente sui siti Web. Il testo può assomigliare di più a un'icona (come nell'esempio giapponese) o un'icona può apparire come un testo (come in un pulsante jpg che dice "Invia" o una foto di gatto con una didascalia sovrapposta) o il testo può essere sostituito o migliorato con un'immagine tramite CSS. Testo, immagine - a chi importa? È tutto contenuto. Finché tutti - persone con disabilità, browser con disabilità, ragni dei motori di ricerca e altre macchine di vario genere possono capire quel significato, abbiamo fatto il nostro lavoro.

Quindi il fatto che gli autori delle specifiche non abbiano pensato (o scelto) di chiarire questo non dovrebbe legare le mani a fare ciò che ha senso ed è coerente con lo spirito del tag. Il <a>tag era originariamente destinato a portare l'utente da qualche altra parte, ma ora potrebbe far apparire una lightbox. Grande whoop, giusto? Se qualcuno avesse capito come far apparire una lightbox al clic prima che la specifica raggiungesse, avrebbe comunque dovuto usare il <a>tag, non un <span>, anche se non era del tutto coerente con la definizione corrente - perché era il più vicino ed era ancora coerente con lo spirito del tag ("succederà qualcosa quando clicchi qui"). Stesso affare con <i>qualsiasi tipo di cosa ci metti dentro, o comunque creativamente lo usi,

2. Il <i>tag aggiunge un significato semantico a un elemento icona.

L'opzione alternativa per portare una classe di icone da sola è <span>, che ovviamente non ha alcun significato semantico. Quando una macchina chiede <span>cosa contiene, dice "Non lo so. Potrebbe essere qualsiasi cosa". Ma il <i>tag dice "Ho un modo diverso di dire qualcosa rispetto al solito, o forse un termine sconosciuto". Non è lo stesso di "I contengono un'icona", ma è molto più vicino ad esso di quanto non lo <span>sia!

3. Alla fine, l'uso comune rende giusto.

Oltre a quanto sopra, vale la pena considerare che i lettori di macchine (motore di ricerca, screen reader o altro) possono in qualsiasi momento iniziare a tenere conto del fatto che Facebook, Twitter e altri siti Web utilizzano il <i>tag per le icone. A loro non importa delle specifiche tanto quanto a loro importa di estrarre significato dal codice con qualsiasi mezzo necessario. Quindi potrebbero usare questa conoscenza di uso comune per registrare semplicemente che "potrebbe esserci un'icona qui" o fare qualcosa di più avanzato come innescare uno sguardo nel CSS per un suggerimento sul significato, o chissà cosa. Quindi, se scegli di utilizzare le <i>icone for sul tuo sito Web, potresti fornire più significato rispetto alle specifiche.

Inoltre, se questo utilizzo si diffonde, sarà probabilmente incluso nelle specifiche in futuro. Quindi esaminerai il tuo codice, sostituendo <span>s con <i>'s! Quindi potrebbe avere senso entrare a far parte di quella che sembra essere la direzione delle specifiche, specialmente quando non è chiaramente in conflitto con le specifiche attuali. L'uso comune tende a dettare le regole della lingua più del contrario. Se sei abbastanza grande, ricordi che "sito Web" era l'ortografia ufficiale quando la parola era nuova? I dizionari hanno insistito sul fatto che ci deve essere uno spazio e il Web deve essere capitalizzato. C'erano ragioni semantiche per questo. Ma l'uso comune diceva: "Qualunque cosa, è stupido. Sto usando 'website' perché è più conciso e sembra migliore". E in poco tempo,

4. Quindi sto andando avanti e lo sto usando.

Quindi, <i>fornisce più significato alle macchine a causa delle specifiche, fornisce più significato agli umani perché associamo facilmente "i" a "icona", ed è lunga solo una lettera. Vincere! E se ti assicuri di includere un testo equivalente all'interno del <i>tag o proprio accanto a esso (come fa Twitter), gli screen reader capiscono dove fare clic per rispondere, il link è utilizzabile se il CSS non viene caricato e i lettori umani con buoni vista e un browser decente vedono un'icona carina. Con tutto questo in mente, non vedo il rovescio della medaglia.


33
Ma ci sono modi per farlo già senza abusare <i>: usa qualsiasi elemento di testo, inclusi pulsanti o collegamenti, e aggiungi un'icona usando una grafica di sfondo e un po 'di riempimento, allo stesso modo in cui viene fatta usando <i>. L'HTML sarebbe simile <a ...>Reply</a>, che è semantico, la pagina in stile mostra un'icona in aggiunta. Se l'icona è l' unico elemento primario , dovrebbe essere un <img src="..." alt="Reply">.
Inganno

36
@Ciao, l'hai portato da una parte completamente diversa ma mi dispiace, non sono d'accordo con ogni singola riga che hai detto.
Jashwant,

11
Il vuoto (anche un'icona) non è testo, tuttavia, e il testo è ciò che è specificamente scritto nelle specifiche.
Ry-

17
Specificamente scritto nelle specifiche significa jack. Lo sai e tutti gli altri lo sanno. È una guida. Niente di più. Pensi che IE si preoccupi delle specifiche? Stanno migliorando. Pensi che ogni singolo browser sia là fuori cercando di ottenere le specifiche perfette? Pensi che tutti sul pianeta stiano usando correttamente <code> nav, header, footer, section, da parte, ... n </code>? No. Vado a pagina dopo pagina dove a parte c'è un sostituto di <code> <div class = "sidebar"> </code> E sai cosa? Il modo in cui le persone continuano a utilizzare è ciò che definirà "semantico" in futuro.
o_O,

17
Grandi argomenti, penso che tu mi abbia convinto. Particolarmente convincente è il n. 3, "l'uso comune rende giusto". Proprio come con il linguaggio comune, se tutti iniziano a usare una parola in questo modo, questo diventa l'uso standard. Le specifiche HTML sono state un documento in evoluzione per un po 'di tempo e aderirvi dogmaticamente è solo stupido. L'adesione a una convenzione comune è un percorso più sostenibile, secondo me. Inoltre, l'elemento <i> è quasi completamente deprecato a questo punto, quindi mi sento bene a dargli una nuova vita semanticamente ricca! Sono curioso di sapere come si evolveranno le specifiche con questo utilizzo, come penso senza dubbio lo farà.
Logic Artist,

59

La risposta di Quentin afferma chiaramente che il itag non deve essere usato per definire le icone.

Ma Holly ha suggerito che spannon ha alcun significato in sé e ha votato a favore iinvece del spantag.

Pochi hanno suggerito di usare in imgquanto è semantico e contiene alttag. Ma non dovremmo usare anche imgperché anche vuoto srcinvia una richiesta al server. Leggi qui

Penso che il modo corretto sarebbe

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

Ciò risolve il problema dell'assenza di alttag spane lo rende accessibile agli utenti con problemi di vista. È semantico e non abusare (hacking) di alcun tag.


6
@GeorgeMauer, tutti i designer html / web che si rispettano si preoccupano dei tag alt. la specifica è lì per un motivo. come rampe negli edifici, alt, title e tag aria esistono per un motivo.
Osiride,

3
@osiris ora resisti, le specifiche vengono cambiate continuamente. Sono d'accordo che è bene seguirlo, ma è necessario tenere conto dell'intento sottostante. Detto questo, dal momento che lo guardo, sono d'accordo con te perché non è solo per screen reader / immagini mancanti / suggerimenti - in realtà c'è un semantico di cui non ero a conoscenza. MDN: "L'omissione di questo attributo indica che l'immagine è una parte chiave del contenuto, ma non è disponibile alcun equivalente testuale. L'impostazione di questo attributo su una stringa vuota indica che questa immagine non è una parte chiave del contenuto; i browser non visivi potrebbero ometterlo dal rendering ".
George Mauer,

3
Come nota a margine, credo che il ruolo dell'aria corretto per un'icona sia la presentazione . Non img .
Sylvain Leroux,

2
@SylvainLeroux, penso che se l'icona viene usata in un pulsante insieme al testo, allora il ruolo è la presentazione. Ma se nel pulsante viene utilizzata solo l'icona (nessun testo), il suo ruolo è img.
Jashwant,

2
NON LO RENDE ACCESSIBILE! L'hai provato con gli screen reader ?! Sostituire la soluzione nativamente accessibile <img alt="...">con <span role="img">tutto peggiora. Non utilizzare aria-labelsu uno SPAN, elemento non focalizzabile. Non funzionerà sempre come previsto. Non usare rolese non sai cosa stai facendo. L'abuso di ARIA sta peggiorando tutto per tutti. Rendere un prodotto inaccessibile e il codice più difficile da leggere e mantenere. E la SEO? ARIA è buona ma usa saggiamente - accessibility-developer-guide.com/knowledge/aria/bad-practices
Hrvoje Golcic

12

La mia ipotesi: poiché Twitter vede la necessità di supportare i browser legacy, altrimenti userebbero gli :before/ :afterpseudo-elementi.

I browser legacy non supportano quegli pseudo-elementi che ho citato, quindi hanno bisogno di usare un vero elemento HTML per le icone, e poiché le icone non hanno un tag "esclusivo", hanno semplicemente scelto il <i>tag e supportano tutti i browser quel tag.

Avrebbero sicuramente potuto usare un <span>, proprio come te (che è TOTALMENTE bene), ma probabilmente per il motivo che ho menzionato sopra oltre a quelli menzionati da Quentin , è anche il motivo per cui Bootstrap sta usando il <i>tag.

È una cattiva pratica quando usi il markup extra per motivi di stile, ecco perché sono stati inventati pseudo-elementi , per separare il contenuto dallo stile ... ma quando vedi la necessità di supportare i browser legacy, a volte sei costretto a fare questo tipo di cose.

PS. Il fatto che le icone inizino con una 'i' e che ci sia un <i>tag, è del tutto casuale.


3
Non proprio, se guardi lì dentro il codice I è un elemento precedente
DCdaz,

12

Ho un approccio totalmente diverso rispetto alle risposte di tutti gli altri qui. Consentitemi di anteporre la mia soluzione e di argomentare affermando che a volte gli standard e le convenzioni devono essere infranti, soprattutto nel contesto delle definizioni dei tag lessicali HTML standard.

Non c'è nulla che ti impedisca di creare elementi personalizzati che sono auto-descrittivi per il suo scopo.

Entrambi i browser moderni e persino IE 6+ (con shim) possono supportare cose come:

<icon class="plus">

o

<icon-add>

Assicurati di normalizzare il tag:

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

e utilizzare uno spessore se è necessario supportare IE9 o precedente (vedere il post seguente).

Dai un'occhiata a questo StackOverflow Post:

C'è un modo per creare il tuo tag html in HTML5

Per approfondire la mia tesi, sia le Direttive angolari di Google che i nuovi progetti Polymer utilizzano il concetto di tag HTML personalizzati.


2
E poi vai al validatore W3C, inserisci <!doctype html> <html lang="en"> <head> <title>Hello</title> </head> <body> <icon></icon> </body> </html>ed ottieni un singolo errore, dicendoError: Element icon not allowed as child of element body in this context.
Digital Ninja

6

Ho pensato che fosse piuttosto brutto - perché di recente stavo lavorando su un modello Joomla e continuavo a far fallire il modello W3C perché stava usando il <i>tag e questo era deprecato, poiché il suo uso originale era di mettere in corsivo qualcosa, che ora viene fatto tramite CSS non più HTML.

Fa davvero una brutta pratica perché quando l'ho visto sono passato attraverso il modello e ho cambiato tutti i <i>tag in <span style="font-style:italic">invece e poi mi sono chiesto perché l'intero modello sembrava strano.

Questo è il motivo principale per cui è una cattiva idea usare il <i>tag in questo modo - non si sa mai chi vedrà il tuo lavoro in seguito e "supponi" che quello che stavi davvero cercando di fare è di scrivere in corsivo il testo piuttosto che visualizzare un icona. Ho appena messo alcune icone in un sito Web e l'ho fatto con il seguente codice

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

in questo modo ho tutte le mie icone in una classe, quindi qualsiasi modifica apportata influisce su tutte le icone (diciamo che le volevo più grandi o più piccole o bordi arrotondati, ecc.), il testo alternativo offre agli screen reader la possibilità di dire alla persona cosa l'icona è piuttosto che possibilmente ottenere solo "testo in corsivo, fine del corsivo" (non so esattamente come gli screen reader leggano le schermate ma immagino che sia qualcosa del genere), e il titolo offre anche all'utente la possibilità di passare il mouse sopra l'immagine e ottieni una descrizione che dice loro che icona è nel caso in cui non riescono a capirlo. Molto meglio dell'uso <i>- e supera anche lo standard W3C.


7
<i>non è deprecato.
user2867288

3
Il tag "img" non funziona per le icone dei caratteri. Voglio dire, ma il tuo browser invia una richiesta al tuo sito ogni volta che viene analizzato.
Navin,

1
Invece di <span style="font-style:italic" />te avresti semplicemente potuto usare la sua alternativa più recente -<strong />
ewino

@ewino Credo che intendi <em> </em> che è la sostituzione semantica per enfatizzare le parole (piuttosto che semplicemente applicare il corsivo)
amklose

Hai proprio ragione :-)
ewino,

2

Ho anche trovato questo utile quando volevo posizionare un'icona con posizionamento assoluto all'interno di un <a>tag di collegamento .

Ho pensato <img>prima al tag, ma lo stile predefinito di quei tag all'interno dei collegamenti in genere ha uno stile del bordo e / o effetti ombra. Inoltre, è sbagliato usare un <img>tag senza definire un attributo "src" mentre sto usando una dichiarazione di un foglio di stile per l'immagine di sfondo in modo che l'immagine non si immagini e non trascini.

A questo punto stai pensando a tag come <span>o <i>- nel qual caso <i>ha molto senso questo tipo di icona.

Tutto sommato, penso che il suo vantaggio oltre ad essere intuitivo sia che richiede un minimo aggiustamento del foglio di stile per far funzionare questo tag come icona.


Ok Ecco perché penso che sia una cattiva pratica. Storicamente <B> era per grassetto e <I> era per itallico. Quindi se hai usato <i> crei un tag itallic vuoto che non è quello per cui è. Questi sono stati sostituiti con <strong> e <em> Quindi, per lo scopo di suppongo che i browser antichi non volessero contrassegnare una pagina con tag itallici vuoti, e che dire degli screen reader per non vedenti, non dovrebbero quelle icone all'interno del link dì TESTO. Quindi <span> è una scelta migliore in quanto puoi rendere zero la dimensione del carattere e avere anche l'icona.
user1712691

1
@ user1712691 E 'un mito comune che <b>e <i>sono stati sostituiti con <strong>e <em>rispettivamente. Ma la verità è, <b>e <i>non è deprecata, e ha assunto nuovi significati semantici. Leggi le specifiche ufficiali per saperne di più.
Chharvey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.