link href untuk seluruh div dalam HTML / CSS

143

Inilah yang saya coba capai dalam HTML / CSS:

Saya memiliki gambar dengan tinggi dan lebar berbeda, tetapi semuanya di bawah 180x235. Jadi yang ingin saya lakukan adalah membuat divdengan borderdan vertical-align: middlesemuanya. Saya telah berhasil melakukannya tetapi sekarang saya terjebak pada cara membuat tautan href dengan benar secara keseluruhan div.

Ini kode saya:

<div id="parentdivimage" style="position:relative;width:184px;height:235px;border-width:2px;border-color:black;border-style:solid;text-align:center;">
    <div id="childdivimage" style="position:absolute;top:50%;height:62px;margin-top:-31px;">
        <img src="myimage.jpg" height="62" width="180">
    </div>
</div>

Harap perhatikan bahwa demi kemudahan menyalin di sini, kode gayanya sebaris.

Saya membaca di suatu tempat bahwa saya dapat menambahkan div induk lain di atas kode dan kemudian melakukan href di dalamnya. Namun, berdasarkan beberapa penelitian, itu tidak akan menjadi kode yang valid.

Jadi untuk meringkasnya lagi, saya membutuhkan seluruh div ( #parentdivimage) menjadi tautan href.

Adil
sumber

Jawaban:

297

UPDATE 06/10/2014: menggunakan div di dalam a benar secara semantik di HTML5.

Anda harus memilih di antara skenario berikut:

<a href="http://google.com">
    <div>
        Hello world
    </div>
</a>

yang secara semantik tidak benar, tetapi akan berhasil.

<div style="cursor: pointer;" onclick="window.location='http://google.com';">
    Hello world
</div>

yang secara semantik benar tetapi melibatkan penggunaan JS.

<a href="http://google.com">
    <span style="display: block;">
        Hello world
    </span>
</a>

yang secara semantik benar dan berfungsi seperti yang diharapkan tetapi bukan div lagi.

Ben
sumber
lol :) Visual Web Developer 2010 mengatakan: Validasi (XHTML 1.0 Transisi): Elemen 'div' tidak bisa bersarang di dalam elemen 'a'.
Fatih Acet
9
Ya - <a>tag sebaris, dan <div>tag diblokir. Tidak valid untuk meletakkan tag level blok di dalam tag sebaris, jadi itulah sumber kesalahan.
Surreal Dreams
2
Anda dapat menggunakan a dan spanbukannya a divdan menggunakan css display: block;untuk membuatnya terlihat seperti yang diinginkan dan semantik.
ajsharma
3
Anda hanya perlu menyetel display:blockpada <a>tag. Ini akan menjadi elemen blok tanpa bersarang.
Augie Gardner
2
Saya tidak berpikir semantik ada hubungannya dengan itu. Sekarang valid dan benar secara teknis tetapi tidak ada hubungannya dengan semantik.
Rob
37

Mengapa Anda tidak menghapus <div>elemen dan menggantinya dengan an <a>? Hanya karena tag anchor bukan div bukan berarti Anda tidak dapat menatanya dengan display:block, tinggi, lebar, latar belakang, batas, dll. Anda dapat membuatnya terlihat seperti div tetapi tetap bertindak seperti tautan. Maka Anda tidak mengandalkan kode tidak valid atau JavaScript yang mungkin tidak diaktifkan untuk beberapa pengguna.

Mimpi yang Nyata
sumber
1
menarik. bisa tolong beri contoh supaya saya bisa coba. Terima kasih
Adil
Bagus, tetapi tidak akan berfungsi dengan baik jika Anda memiliki yang lain <a>di dalam <div>.
Muhd
solusi hebat - ini berfungsi dengan baik untuk Safari seluler di mana Anda memerlukan tag jangkar untuk menghindari penanganan sentuhan secara manual
Alamgir Mand
9

Lakukan seperti ini:

Parentdivimage harus memiliki lebar dan tinggi yang ditentukan, dan posisinya harus:

position: relative;

Tepat di dalam parentdivimage, di samping div lain yang berisi induk Anda harus meletakkan:

<a href="linkt.to.smthn.com"><span class="clickable"></span></a>

Kemudian di file css:

.clickable {
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  position: absolute;     
  z-index: 1;
}

Tag span akan mengisi blok induknya yaitu parentdiv, karena tinggi dan lebarnya disetel menjadi 100%. Span akan berada di atas semua elemen di sekitarnya karena menyetel z-index lebih tinggi daripada elemen lainnya. Akhirnya span dapat diklik, karena berada di dalam tag 'a'.

denu
sumber
1
menakjubkan, setelah mencari berhari-hari ini adalah solusi yang berhasil untuk saya
somid3
Saya telah menemukan kegunaan untuk ini daripada jawaban yang diterima; semua teks dalam "satu blok" digarisbawahi. Ya, Anda dapat menghilangkan garis bawah melalui dekorasi teks tetapi properti itu tidak diwariskan. Menggunakan metode Anda, @denu, membuatnya sederhana.
yapdog
3

Dua hal yang dapat Anda lakukan:

  1. Ubah #childdivimageke spanelemen, dan ubah #parentdivimageke tag anchor. Ini mungkin mengharuskan Anda untuk menambahkan beberapa gaya lagi untuk membuat semuanya terlihat sempurna. Ini diutamakan, karena menggunakan markup semantik, dan tidak bergantung pada javascript.

  2. Gunakan Javascript untuk mengikat event klik #parentdivimage. Anda harus mengarahkan ulang jendela browser dengan memodifikasi window.locationdi dalam acara ini. Ini adalah TheEasyWay TM , tetapi tidak akan menurun dengan anggun.
Stephen
sumber
3

Sesuai dengan apa yang dikatakan Surreal Dreams, mungkin yang terbaik adalah menata tag jangkar menurut pengalaman saya, tetapi itu benar-benar tergantung pada apa yang Anda lakukan. Berikut contohnya:

Html:

<div class="parent-div">
  <a href="#">Test</a>
  <a href="#">Test</a>
  <a href="#">Test</a>
</div>

Kemudian CSS:

.parent-div {
  width: 200px;
}
a {
  display:block;
  background-color: #ccc;
  color: #000;
  text-decoration:none;
  padding:10px;
  margin-bottom:1px;
}
a:hover {
  background-color: #ddd;
}

http://jsbin.com/zijijuduqo/1/edit?html,css,output

Kyle Crabtree
sumber
2

Membuat divdari id="childdivimag"sebuah spansebaliknya, dan bungkus bahwa dalam aelemen. Karena spandan imgmerupakan elemen in-line secara default, ini tetap valid, sedangkan a divadalah elemen level blok, dan oleh karena itu mark-up tidak valid ketika terdapat dalam file a.

David mengatakan kembalikan Monica
sumber
ya tapi itu tidak berhasil untuk saya karena saya tidak ingin gambar menjadi href. Saya ingin seluruh blok menjadi tautan href .. mengubah childdivimage menjadi span dan membungkusnya dengan tidak mencapai apa yang saya inginkan
Adil
2

letakkan display:blockdi elemen jangkar. dan / atau zoom:1;

tetapi Anda harus benar-benar melakukan ini.

a#parentdivimage{position:relative; width:184px; height:235px; 
                 border:2px solid #000; text-align:center; 
                 background-image:url("myimage.jpg"); 
                 background-position: 50% 50%; 
                 background-repeat:no-repeat; display:block; 
                 text-indent:-9999px}

<a id="parentdivimage">whatever your alt attribute was</a>
albert
sumber
1

Apa yang akan saya lakukan adalah meletakkan span di dalam <a>tag, mengatur span untuk memblokir, dan menambahkan ukuran ke span, atau hanya menerapkan gaya ke <a>tag. Tangani pemosisian dengan pasti dalam <a>gaya tag. Tambahkan onclick eventke a whereJavaScript akan menangkap acara, kemudian mengembalikan false di akhir acara JavaScript untuk mencegah tindakan default dari hrefdan menggelembungnya klik. Ini berfungsi dalam kasus dengan atau tanpa mengaktifkan JavaScript, dan AJAX apa pun dapat ditangani di pendengar Javascript.

Jika Anda menggunakan jQuery, Anda dapat menggunakan ini sebagai pendengar dan menghilangkan onclickdi atag.

$('#idofdiv').live("click", function(e) {
    //add stuff here
    e.preventDefault; //or use return false
}); 

ini memungkinkan Anda untuk melampirkan listener ke elemen yang diubah sesuai kebutuhan.

DaveW
sumber
1

Ini bisa dilakukan dengan banyak cara. Sebuah. Menggunakan bersarang di dalam tag.

<a href="link1.html">
   <div> Something in the div </div>
 </a>

b. Menggunakan Metode JavaScript Inline

<div onclick="javascript:window.location.href='link1.html' "> 
  Some Text 
</div>

c. Menggunakan jQuery inside tag

HTML:

<div class="demo" > Some text here </div>

jQuery:

$(".demo").click( function() {
  window.location.href="link1.html";
 });
Ayush Anand
sumber
0

Tautan dengan <div>tag:

<div style="cursor: pointer;" onclick="window.location='http://www.google.com';">
     Something in the div 
</div>

Tautan dengan <a>tag:

<a href="http://www.google.com">
    <div>
        Something in the div 
    </div>
</a>
MDI
sumber