Haruskah saya menggunakan tag <i> untuk ikon alih-alih <span>? [Tutup]

572

Saya sudah melihat ke sumber Facebook, mereka menggunakan <i>tag untuk menampilkan ikon.

Juga, hari ini saya melihat Bootstrap Twitter. Itu juga menggunakan <i>tag untuk menampilkan ikon.

Tapi,

Dari spesifikasi HTML5 :

Elemen I mewakili rentang teks dalam suara atau suasana hati alternatif, atau sebaliknya mengimbangi dari prosa normal, seperti sebutan taksonomi, istilah teknis, frase idiomatik dari bahasa lain, pemikiran, nama kapal, atau lainnya prosa yang presentasi tipografiknya dicetak miring.

Mengapa mereka menggunakan <i>tag untuk menampilkan ikon?

Apakah ini bukan praktik yang buruk?

Atau saya kehilangan sesuatu di sini?

Saya menggunakan spanuntuk menampilkan ikon dan sepertinya berfungsi untuk saya sampai sekarang.

Memperbarui:

Bootstrap 3 sekarang digunakan spanuntuk ikon. Dok resmi

Jashwant
sumber
5
Contoh: Jawabannya panah bawah tweet di Twitter: <i class="sm-reply"></i>.
kay - SE itu jahat
2
Mengapa tidak <span>digunakan?
Jashwant
6
Menurut saya, untuk sematika dan aksesibilitas, tag img harus selalu digunakan untuk ikon, dengan teks alt.
nroose
12
@nosose Pandangan saya tentang ini adalah bahwa gambar yang digunakan untuk ikon bukan bagian dari konten, tetapi gaya halaman, (tidak seperti, misalnya, gambar sapi di halaman wikipedia tentang sapi). Karena itu mereka harus didefinisikan dalam css, bukan sebagai gambar dalam tag img.
CJStuart
6
Saya tidak berpikir keputusan semantik dalam HTML5 harus dianggap "berdasarkan opini."
Aaron

Jawaban:

597

Mengapa mereka menggunakan <i>tag untuk menampilkan ikon?

Karena:

  • Pendek
  • saya singkatan ikon (meskipun tidak dalam HTML)

Apakah ini bukan praktik yang buruk?

Latihan yang mengerikan. Ini adalah kemenangan kinerja atas semantik.

Quentin
sumber
87
Ini hari pertama saya mempelajari bootstrap twitter dan rasanya tidak enak karena mereka tidak mengikuti praktik terbaik.
Jashwant
25
beberapa orang bahkan melangkah lebih jauh dan menyalahgunakan elemen lain, seperti <tt>= tooltip dan sebagainya ... ingin membantu saya menemukan ATSMOHE? "Melawan penyalahgunaan semantik HTML-Elements"
Christoph
18
Situs web ini memiliki jutaan halaman dilihat setiap hari. Jika mereka menyimpan 100 byte data setiap kali klien meminta halaman dengan praktik ini, mereka menghemat sejumlah besar bandwidth.
Dalmas
62
Untuk menyimpan 100 byte, mereka harus menyertakan 16 ikon dan tidak mengaktifkan kompresi .
Quentin
7
Dengan penggunaan ligatures , menggunakan itag untuk menampilkan ikon adalah semantik. Bahkan, Google menyarankan penggunaan itag dengan ligatur di panduan ikon Bahan itu .
Aust
269

Saya sedikit terlambat masuk ke sini, tetapi menemukan halaman ini ketika merenungkannya sendiri. Tentu saja saya tidak tahu bagaimana Facebook atau Twitter membenarkannya, tetapi di sini ada proses pemikiran saya sendiri untuk apa nilainya.

Pada akhirnya, saya menyimpulkan bahwa praktik ini tidak terlalu tidak romantis (apakah itu sebuah kata?). Faktanya, selain kekurangan dan asosiasi "i adalah untuk ikon," saya pikir itu sebenarnya adalah pilihan yang paling semantik untuk sebuah ikon ketika <img>label sederhana tidak praktis.

1. Penggunaan konsisten dengan spesifikasi.

Meskipun mungkin bukan apa yang dipikirkan W3, menurut saya spesifikasi resmi untuk <i>dapat mengakomodasi ikon cukup mudah. Lagi pula, simbol panah balasan mengatakan "balas" dengan cara lain. Ini mengungkapkan istilah teknis yang mungkin asing bagi pembaca dan biasanya dicetak miring. ("Di sini, di Twitter, ini adalah apa yang kami sebut panah balasan .") Dan itu adalah istilah dari bahasa lain: bahasa simbolik.

Jika, alih-alih simbol panah, Twitter menggunakan <i>shout out</i>atau <i>[Japanese character for reply]</i>(pada halaman bahasa Inggris), itu akan konsisten dengan spesifikasi. Lalu mengapa tidak <i>[reply arrow]</i>? (Saya berbicara semantik HTML di sini, bukan aksesibilitas, yang akan saya bahas.)

Sejauh yang saya bisa lihat, satu-satunya bagian dari spesifikasi yang secara eksplisit dilanggar oleh penggunaan ikon adalah frasa "rentang teks" (ketika tag tidak mengandung teks juga). Jelas bahwa <i>tag ini terutama ditujukan untuk teks, tapi itu detail yang cukup kecil dibandingkan dengan keseluruhan maksud tag. Pertanyaan penting untuk tag ini bukanlah format konten yang dikandungnya, tetapi apa arti konten itu.

Ini terutama benar ketika Anda menganggap bahwa garis antara "teks" dan "ikon" hampir tidak ada di situs web. Teks mungkin terlihat lebih mirip ikon (seperti dalam contoh Jepang) atau ikon mungkin terlihat seperti teks (seperti pada tombol jpg yang bertuliskan "Kirim" atau foto kucing dengan teks yang dilapiskan) atau teks dapat diganti atau ditingkatkan dengan gambar melalui CSS. Teks, gambar - siapa yang peduli? Itu semua konten. Selama semua orang - manusia dengan disabilitas, browser dengan disabilitas, spider mesin pencari, dan mesin lain dari berbagai jenis dapat memahami makna itu, kami telah melakukan tugas kami.

Jadi fakta bahwa penulis spec tidak berpikir (atau memilih) untuk mengklarifikasi ini seharusnya tidak mengikat tangan kami dari melakukan apa yang masuk akal dan konsisten dengan semangat tag. The <a>tag pada awalnya ditujukan untuk membawa pengguna ke tempat lain, tapi sekarang mungkin muncul lightbox. Teriakan besar, kan? Jika seseorang menemukan cara memunculkan lightbox pada klik sebelum specnya ditemukan, mereka masih harus menggunakan <a>tag, bukan a <span>, bahkan jika itu tidak sepenuhnya konsisten dengan definisi saat ini - karena itu datang paling dekat dan merupakan masih konsisten dengan semangat tag ("sesuatu akan terjadi ketika Anda mengklik di sini"). Kesepakatan yang sama <i>- apa pun jenis yang Anda masukkan ke dalamnya, atau seberapa kreatif Anda menggunakannya,

2. <i>Tag menambahkan makna semantik ke elemen ikon.

Pilihan alternatif untuk membawa kelas ikon dengan sendirinya adalah <span>, yang tentu saja tidak memiliki makna semantik sama sekali. Ketika sebuah mesin menanyakan <span>isinya, ia berkata, "Saya tidak tahu. Bisa apa saja." Tetapi <i>tag itu berkata, "Saya mengandung cara yang berbeda untuk mengatakan sesuatu dari cara biasa, atau mungkin istilah yang tidak dikenal." Itu tidak sama dengan "Saya mengandung ikon," tapi itu jauh lebih dekat daripada <span>mendapatkannya!

3. Akhirnya, penggunaan umum menjadi benar.

Selain hal di atas, ada baiknya mempertimbangkan bahwa mesin pembaca (apakah mesin pencari, pembaca layar, atau apa pun) dapat setiap saat mulai mempertimbangkan bahwa Facebook, Twitter, dan situs web lain menggunakan <i>tag untuk ikon. Mereka tidak peduli tentang spek sebanyak mereka peduli tentang penggalian makna dari kode dengan cara apa pun yang diperlukan. Jadi mereka mungkin menggunakan pengetahuan tentang penggunaan umum ini hanya untuk merekam bahwa "mungkin ada ikon di sini" atau melakukan sesuatu yang lebih maju seperti memicu pandangan ke CSS untuk petunjuk tentang makna, atau siapa yang tahu apa. Jadi jika Anda memilih untuk menggunakan <i>ikon for di situs web Anda, Anda mungkin memberikan lebih banyak makna daripada spesifikasi.

Selain itu, jika penggunaan ini menyebar luas, kemungkinan akan dimasukkan dalam spesifikasi di masa mendatang. Maka Anda akan melalui kode Anda, mengganti <span>dengan dengan <i>! Jadi mungkin masuk akal untuk bergabung dengan apa yang tampaknya menjadi arah spesifikasi, terutama ketika itu tidak jelas bertentangan dengan spesifikasi saat ini. Penggunaan umum cenderung mendikte aturan bahasa lebih dari sebaliknya. Jika Anda cukup tua, apakah Anda ingat bahwa "Situs web" adalah ejaan resmi ketika kata itu baru? Kamus bersikeras harus ada ruang dan Web harus ditulis dengan huruf besar. Ada alasan semantik untuk itu. Tetapi penggunaan umum mengatakan, "Apa pun, itu bodoh. Saya menggunakan 'situs web' karena lebih ringkas dan terlihat lebih baik." Dan tak lama kemudian,

4. Jadi saya akan maju dan menggunakannya.

Jadi, <i>memberikan lebih banyak makna ke mesin karena speknya, ia memberikan lebih banyak makna bagi manusia karena kita dengan mudah menghubungkan "i" dengan "ikon", dan panjangnya hanya satu huruf. Menang! Dan jika Anda memastikan untuk memasukkan teks yang setara baik di dalam <i>tag atau tepat di sebelahnya (seperti Twitter), maka pembaca layar memahami di mana harus mengklik untuk membalas, tautan tersebut dapat digunakan jika CSS tidak memuat, dan pembaca manusia dengan baik penglihatan dan peramban yang layak melihat ikon yang cantik. Dengan semua ini dalam pikiran, saya tidak melihat sisi buruknya.

Holly
sumber
33
Tetapi ada cara untuk melakukan ini tanpa menyalahgunakan <i>: menggunakan elemen teks apa pun, termasuk tombol atau tautan, dan menambahkan ikon menggunakan grafik latar belakang dan beberapa lapisan, cara yang sama dilakukan dengan menggunakan <i>. HTML akan terlihat seperti <a ...>Reply</a>, yang semantik, halaman bergaya menunjukkan ikon sebagai tambahan. Jika ikon adalah satu - satunya, elemen utama , itu harus menjadi <img src="..." alt="Reply">.
tipuan
36
@ Holly, Anda membawanya ke sisi yang sama sekali berbeda tapi maaf, saya tidak setuju dengan setiap baris yang Anda katakan.
Jashwant
11
Kekosongan (bahkan sebuah ikon) bukanlah teks, dan teks adalah apa yang secara spesifik ditulis dalam spesifikasi.
Ry-
17
Khusus ditulis dalam spec berarti jack. Anda tahu itu dan semua orang tahu itu. Ini panduan. Tidak ada lagi. Apakah Anda pikir IE peduli dengan spek? Mereka menjadi lebih baik. Apakah Anda pikir setiap peramban di luar sana berusaha mendapatkan spek sempurna? Apakah Anda pikir semua orang di planet ini menggunakan <code> nav, header, footer, bagian, samping, ... n </code> dengan benar? Nggak. Saya pergi ke halaman demi halaman di mana selain itu adalah pengganti untuk <code> <div class = "sidebar"> </code> Dan Anda tahu apa? Cara orang terus menggunakan adalah apa yang akan mendefinisikan "semantik" di masa depan.
o_O
17
Argumen yang bagus, saya pikir Anda meyakinkan saya. Terutama meyakinkan adalah # 3, "penggunaan umum membuat benar". Sama seperti dengan bahasa umum, jika semua orang mulai menggunakan kata sedemikian rupa, itu menjadi penggunaan standar. Spesifikasi HTML telah menjadi dokumen yang berkembang untuk sementara waktu sekarang, dan menjalankannya secara dogmatis itu konyol. Mematuhi konvensi umum adalah jalur yang lebih berkelanjutan, menurut saya. Selain itu, elemen <i> sudah usang pada saat ini, jadi saya merasa senang memberikannya kehidupan baru yang kaya semantik! Saya ingin tahu bagaimana spek akan berkembang dengan penggunaan ini, karena saya pikir tidak akan diragukan lagi.
Artis Logika
59

Jawaban Quentin dengan jelas menyatakan bahwa itag tidak boleh digunakan untuk mendefinisikan ikon.

Namun, Holly menyarankan bahwa spantidak ada artinya dalam dirinya dan memilih mendukung ibukannya spantag.

Sedikit yang menyarankan untuk digunakan img karena semantik dan mengandung alttag. Tapi, kita juga tidak boleh menggunakan imgkarena bahkan kosong srcmengirimkan permintaan ke server. Baca di sini

Saya pikir, cara yang benar adalah,

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

Ini menyelesaikan masalah tidak ada alttag di spandan membuatnya dapat diakses oleh pengguna dengan gangguan penglihatan. Ini semantik dan tidak menyalahgunakan (meretas) tag apa pun.

Jashwant
sumber
6
@ GeorgeMauer, semua desainer html / web yang menghargai diri sendiri peduli dengan tag alt. spec ada karena suatu alasan. seperti landai di bangunan, alt, judul dan tag aria ada karena suatu alasan.
osiris
3
@osiris sekarang tunggu, spesifikasi bisa berubah setiap saat. Saya setuju itu baik untuk diikuti, tetapi Anda harus mempertimbangkan niat yang mendasarinya. Yang sedang berkata, sejak mencarinya, saya setuju dengan Anda karena tidak hanya untuk screenreaders / gambar hilang / tooltips - sebenarnya ada semantik di sana saya tidak menyadarinya. MDN: "Menghilangkan atribut ini menunjukkan bahwa gambar adalah bagian kunci dari konten, tetapi tidak ada padanan tekstual yang tersedia. Mengatur atribut ini ke string kosong menunjukkan bahwa gambar ini bukan bagian kunci dari konten; browser non-visual dapat hilangkan dari rendering. "
George Mauer
3
Sebagai catatan, saya percaya peran aria yang tepat untuk sebuah ikon adalah presentasi . Bukan img .
Sylvain Leroux
2
@ SylvainLeroux, saya pikir jika ikon digunakan dalam tombol bersama dengan teks, maka peran adalah presentasi. Tetapi jika hanya ikon yang digunakan dalam tombol (tidak ada teks), maka perannya adalah img.
Jashwant
2
INI TIDAK MEMBUATNYA! Sudahkah Anda mengujinya dengan pembaca layar ?! Mengganti solusi asli yang dapat diakses <img alt="...">dengan <span role="img">membuat segalanya lebih buruk. Jangan gunakan aria-labelpada SPAN, elemen yang tidak fokus. Itu tidak akan selalu berfungsi seperti yang diharapkan. Jangan gunakan rolejika Anda tidak tahu apa yang Anda lakukan. Terlalu sering menggunakan ARIA membuat segalanya menjadi lebih buruk untuk semua orang. Membuat produk tidak dapat diakses dan kode lebih sulit dibaca dan dipelihara. Dan bagaimana dengan SEO? ARIA baik tetapi gunakan dengan bijak - aksesibilitas-developer-guide.com/knowledge/aria/bad-practices
Hrvoje Golcic
12

Dugaan saya: Karena Twitter melihat kebutuhan untuk mendukung browser lawas, jika tidak mereka akan menggunakan :before/ :afterpseudo-elements.

Browser lama tidak mendukung elemen pseudo yang saya sebutkan, sehingga mereka perlu menggunakan elemen HTML yang sebenarnya untuk ikon, dan karena ikon tidak memiliki tag 'eksklusif', mereka hanya pergi dengan <i>tag, dan semua browser mendukung tag itu.

Mereka pasti bisa menggunakan <span>, sama seperti Anda (yang benar-benar baik-baik saja), tapi mungkin karena alasan yang saya sebutkan di atas ditambah yang disebutkan oleh Quentin , juga mengapa Bootstrap menggunakan <i>tag.

Ini adalah praktik yang buruk ketika Anda menggunakan markup tambahan untuk alasan gaya, itu sebabnya elemen semu diciptakan, untuk memisahkan konten dari gaya ... tetapi ketika Anda melihat kebutuhan untuk mendukung browser lawas, kadang-kadang Anda dipaksa untuk melakukan semacam ini. sesuatu.

PS. Fakta bahwa ikon dimulai dengan 'i' dan bahwa ada <i>tag, sepenuhnya kebetulan.

Ricardo Zea
sumber
3
Tidak juga, Jika Anda melihat kode di dalam I adalah elemen sebelum
DCdaz
12

Saya mengambil pendekatan yang sama sekali berbeda untuk jawaban semua orang di sini. Biarkan saya awali solusi saya dan berdebat dengan menyatakan bahwa kadang-kadang standar dan konvensi dimaksudkan untuk dilanggar, terutama dalam konteks definisi tag leksikal standar HTML.

Tidak ada yang menghentikan Anda dari membuat elemen kustom yang bersifat deskriptif sendiri untuk itu sangat tujuan.

Browser modern dan bahkan IE 6+ (w / shim) dapat mendukung hal-hal seperti:

<icon class="plus">

atau

<icon-add>

Pastikan untuk menormalkan kembali tag:

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

dan gunakan shim jika Anda perlu mendukung IE9 atau sebelumnya (lihat posting di bawah).

Lihat StackOverflow Post ini:

Apakah ada cara untuk membuat tag html Anda sendiri di HTML5

Untuk memperdebatkan argumen saya, Google Angular Directive dan proyek Polymer baru menggunakan konsep tag HTML khusus.

Timothy Perez
sumber
2
Dan kemudian Anda pergi ke validator W3C, dan masukkan <!doctype html> <html lang="en"> <head> <title>Hello</title> </head> <body> <icon></icon> </body> </html>dan Anda mendapatkan kesalahan tunggal, mengatakanError: Element icon not allowed as child of element body in this context.
Digital Ninja
6

Saya pikir ini terlihat sangat buruk - karena saya sedang mengerjakan template Joomla baru-baru ini dan saya terus mendapatkan template gagal W3C karena menggunakan <i>tag dan yang sudah usang, karena penggunaan aslinya adalah untuk mencetak miring sesuatu, yang sekarang dilakukan melalui CSS bukan HTML lagi.

Itu membuat praktik yang sangat buruk karena ketika saya melihatnya saya melihat templat dan mengubah semua <i>tag <span style="font-style:italic">sebagai gantinya dan kemudian bertanya-tanya mengapa seluruh templat tampak aneh.

Ini adalah alasan utama mengapa menggunakan <i>tag dengan cara ini adalah ide yang buruk - Anda tidak pernah tahu siapa yang akan melihat pekerjaan Anda sesudahnya dan "berasumsi" bahwa yang sebenarnya Anda coba lakukan adalah mencetak miring teks daripada menampilkan ikon. Saya baru saja meletakkan beberapa ikon di situs web dan saya melakukannya dengan kode berikut

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

dengan cara itu saya mendapatkan semua ikon saya dalam satu kelas sehingga setiap perubahan yang saya buat mempengaruhi semua ikon (katakan saya ingin mereka lebih besar atau lebih kecil, atau batas bulat, dll), teks alt memberikan pembaca layar kesempatan untuk memberi tahu orang itu apa ikon daripada hanya mungkin mendapatkan "teks dalam huruf miring, akhir huruf miring" (Saya tidak tahu persis bagaimana pembaca layar membaca layar tapi saya kira itu sesuatu seperti itu), dan judulnya juga memberi pengguna kesempatan untuk beralih ke gambar dan dapatkan tooltip memberi tahu mereka apa ikonnya jika mereka tidak bisa mengetahuinya. Jauh lebih baik daripada menggunakan <i>- dan juga melewati standar W3C.

TheKLF99
sumber
7
<i>tidak usang.
user2867288
3
Tag "img" tidak berfungsi untuk ikon font. Maksud saya, tetapi browser Anda mengirim permintaan ke situs Anda setiap kali diuraikan.
Navin
1
Alih-alih <span style="font-style:italic" />Anda bisa hanya menggunakan itu alternatif yang lebih baru -<strong />
ewino
@ewino Saya percaya maksud Anda <em> </em> yang merupakan pengganti semantik untuk menekankan kata-kata (bukan hanya menggunakan huruf miring)
amklose
Anda memang benar :-)
ewino
2

Saya juga menemukan ini berguna ketika saya ingin menempatkan ikon dengan posisi absolut di dalam <a>tag tautan .

Saya memikirkan <img>tag terlebih dahulu, tetapi styling default dari tag tersebut di dalam tautan biasanya memiliki styling tepi dan / atau efek bayangan. Plus, rasanya salah menggunakan <img>tag tanpa mendefinisikan atribut "src" sedangkan saya menggunakan deklarasi style sheet gambar latar belakang sehingga gambar tidak hantu dan seret.

Pada titik ini Anda memikirkan tag seperti <span>atau <i>- dalam hal <i>ini sangat masuk akal sebagai jenis ikon ini.

Semua dalam semua saya pikir manfaatnya selain menjadi intuitif adalah bahwa ia memerlukan penyesuaian style sheet minimal untuk membuat tag ini berfungsi sebagai ikon.

Emery King
sumber
Ok Inilah mengapa saya pikir ini adalah praktik yang buruk. Secara historis <B> untuk Bold dan <I> untuk italik. Jadi jika Anda menggunakan <i> Anda membuat tag itallic kosong yang bukan untuk apa. Ini diganti dengan <strong> dan <em> Jadi untuk tujuan saya kira browser kuno Anda tidak ingin menandai halaman dengan tag itallic kosong, dan bagaimana dengan pembaca layar untuk tuna netra, seharusnya ikon-ikon di dalam tautan tidak bisa dikatakan TEKS. Jadi <span> adalah pilihan yang lebih baik karena Anda dapat membuat font-size nol dan juga ikonnya.
user1712691
1
@ user1712691 Ini adalah mitos umum <b>dan <i>diganti dengan <strong>dan <em>masing - masing. Tetapi kebenarannya adalah, <b>dan <i>tidak usang, dan telah mengambil makna semantik baru. Baca spesifikasi resmi untuk mempelajari lebih lanjut.
chharvey