Saya pernah mendengar bahwa meletakkan elemen blok di dalam elemen inline adalah dosa HTML:
<a href="http://www.mydomain.com"><div>
What we have here is a problem.
You see, an anchor element is an inline element,
and the div element is a block level element.
</div></a>
Tapi bagaimana jika Anda gaya jangkar luar seperti display:block
pada stylesheet? Apakah masih salah? HTML 4.01 spec pada elemen level-blok dan inline tampaknya berpikir demikian:
Lembaran gaya menyediakan sarana untuk menentukan rendering elemen arbitrer, termasuk apakah elemen dirender sebagai blok atau inline. Dalam beberapa kasus, seperti gaya inline untuk elemen daftar, ini mungkin sesuai, tetapi secara umum, penulis tidak disarankan untuk mengesampingkan interpretasi konvensional elemen HTML dengan cara ini.
Adakah yang punya kiat lebih lanjut tentang masalah ini?
Jawaban:
Bergantung pada versi HTML yang Anda layani:
HTML 5 menyatakan bahwa
<a>
elemen "dapat membungkus seluruh paragraf, daftar, tabel, dan sebagainya, bahkan seluruh bagian, asalkan tidak ada konten interaktif di dalamnya (mis. Tombol atau tautan lain)".HTML 4.01 menetapkan bahwa
<a>
elemen hanya dapat berisi elemen sebaris . A<div>
adalah elemen blok , jadi itu mungkin tidak muncul di dalam<a>
.Tentu saja Anda bebas untuk mendesain elemen inline sedemikian rupa sehingga tampak seperti sebuah blok, atau memang gaya sebuah blok sehingga itu diberikan inline. Penggunaan istilah
inline
danblock
dalam HTML mengacu pada hubungan elemen dengan struktur semantik dokumen, sedangkan istilah yang sama dalam CSS lebih terkait dengan gaya visual elemen. Jika Anda membuat elemen inline ditampilkan dengan cara kuning, itu bagus.Namun Anda harus memastikan bahwa struktur dokumen masih masuk akal ketika CSS tidak ada, misalnya ketika diakses melalui teknologi bantu seperti pembaca layar - atau memang ketika diperiksa oleh Googlebot yang perkasa.
sumber
Tidak itu tidak akan divalidasi, tapi ya itu umumnya akan berfungsi di browser modern. Yang sedang berkata, gunakan rentang di dalam jangkar Anda, dan atur
display: block
di atasnya juga, yang pasti akan bekerja di mana-mana, dan itu akan divalidasi!sumber
display: block
, bukankah, secara teknis, menjadi elemen blok?a
elemen hanya dapat berisi elemen sebaris. Jika Anda membuatspan
elemen elemen blok, itu seharusnya tidak, secara teknis, berada di dalam jangkar.<div>
adalah blok-level dan a<span>
inline, bahkan jika dokumen yang menyertai CSS menentukan sebaliknya.Dokumen W3C tidak menggunakan konsep-konsep seperti salah dan dosa , tetapi menggunakan konsep-konsep seperti menyediakan sarana , mungkin sesuai dan tidak dianjurkan .
Sebenarnya, dalam paragraf kedua bagian 4 , spesifikasi 4.01 memerinci kata-katanya sebagai berikut
Dengan mengingat hal itu, saya percaya pernyataan definitif ada di 7.5.3 Elemen level-blok dan inline , di mana katanya
Kondisi "umumnya" tampaknya memperkenalkan ambiguitas yang cukup untuk mengatakan bahwa HTML 4.01 memungkinkan elemen inline mengandung elemen blok.
Tentu saja, CSS2 memiliki nilai properti tampilan, inline-block , yang tampaknya sesuai dengan tujuan yang Anda jelaskan. Saya tidak yakin apakah itu didukung secara luas, tetapi tampaknya seseorang mengantisipasi perlunya perilaku semacam itu.
DTD tampaknya kurang memaafkan di sini, tetapi teks DTD tidak sesuai dengan spesifikasi:
Di komentar lain, Anda menyarankan agar Anda ingin membuat blok aktif dengan membungkusnya di jangkar. Saya tidak percaya HTML melarang itu, dan CSS dengan jelas mengizinkannya. Jadi untuk menjawab pertanyaan judul tentang apakah itu benar, saya katakan ya. Menurut standar, kadang-kadang itu benar.
sumber
Dengan spesifikasi HTML5 ... Sekarang dimungkinkan untuk menempatkan elemen level blok di dalam elemen inline. Jadi sekarang sangat tepat untuk meletakkan 'div' atau 'h1' di dalam elemen 'a'.
sumber
Anda tidak dapat memasukkan ke
<div>
dalam<a>
- itu tidak valid (X) HTML.Meskipun Anda mendesain rentang dengan tampilan: blok Anda tetap tidak dapat memasukkan elemen level blok di dalamnya: (X) HTML masih harus mematuhi (X) HTML DTD (mana pun yang Anda gunakan), tidak peduli bagaimana CSS mengubah banyak hal.
Peramban mungkin akan menampilkannya seperti yang Anda inginkan, tetapi itu tidak membuatnya benar.
sumber
Ada DTD untuk HTML 4 di http://www.w3.org/TR/REC-html40/sgml/dtd.html . DTD ini adalah bentuk spec yang dapat diproses dengan mesin, dengan batasan bahwa DTD mengatur XML dan HTML 4, terutama rasa "sementara", memungkinkan banyak hal yang bukan XML "legal". Namun, saya menganggap itu mendekati kodifikasi maksud dari specifier.
Saya akan menafsirkan tag yang tercantum dalam hierarki ini sebagai total tag yang diizinkan.
Sementara spek dapat mengatakan "elemen sebaris," saya cukup yakin itu tidak dimaksudkan bahwa Anda dapat menyiasati maksud dengan menyatakan tipe tampilan elemen blok yang akan sebaris. Tag inline memiliki semantik berbeda, tidak peduli bagaimana Anda dapat menyalahgunakannya.
Di sisi lain, saya menemukan hal yang menarik bahwa masuknya elemen
special
nampaknya memungkinkanA
. Mungkin ada beberapa kata-kata yang kuat dalam spek yang melarang ini meskipun itu XML-sintaksis benar tetapi saya tidak akan mengejar ini lebih jauh karena itu bukan topik pertanyaan.sumber
- -
artinya. Saya mencoba menemukan penjelasan tetapi saya tidak dapat menemukannya.Elemen tingkat blok seperti
<div>
dapat dibungkus dengan<a>
tag dalam HTML5. Meskipun a<div>
dianggap sebagai wadah / pembungkus untuk konten aliran dan<a>
dianggap sebagai konten aliran menurut MDN . Semantik mungkin lebih baik untuk membuat elemen sebaris yang bertindak sebagai elemen tingkat blok.sumber
Jika Anda ingin menghindari masalah semantik menempatkan div di dalam tag jangkar, cukup tempatkan tag jangkar pada tingkat yang sama dengan div, bungkus semuanya dengan wadah dengan posisi: relatif, buat posisi tag jangkar Anda: absolut dan perluas untuk isi wadahnya. Juga jika itu tidak di akhir aliran konten pastikan Anda melemparkan indeks-z di sana untuk meletakkannya di atas konten.
Seperti yang disarankan, saya telah menambahkan kode markup:
Dan css:
sumber
Jika Anda akan pergi ke upaya membuat
<a>
blok, mengapa tidak dimasukkan<a>
ke dalam div, menjadi elemen blok itu akan memberi Anda efek yang sama.sumber
Jika Anda mengubahnya ke elemen gaya blok, maka tidak, itu tidak lagi 'salah', tetapi mungkin tidak akan divalidasi. Tetapi tidak masuk akal untuk melakukan apa yang Anda lakukan. Anda harus menyimpan tag jangkar sebagai elemen level blok tanpa div dalam, atau meletakkan div di luar.
sumber
Itu salah. Gunakan rentang .
sumber
Saya pikir sebagian besar waktu ketika orang mengajukan pertanyaan ini, mereka telah membangun situs dengan divs saja, dan sekarang salah satu dari div perlu menjadi tautan.
Saya melihat seseorang menggunakan gambar kosong transparan, PNG, di dalam tag jangkar hanya untuk membuat tautan di dalam div, dan gambar itu berukuran sama dengan div.
Cukup sedih sebenarnya ... tapi berhasil ...
sumber
Anda dapat mencapai ini dengan menambahkan ":: before" Pseudo-element
Trik CSS Murni;)
sumber
Sama seperti FYI.
Jika tujuan Anda adalah membuat div Anda dapat diklik, Anda dapat menggunakan jQuery / Java Script.
Tentukan div Anda seperti ini:
Kemudian jQuery Anda akan diimplementasikan seperti ini:
Ini juga akan berfungsi untuk beberapa div - sesuai komentar Tom di utas ini
sumber