Bir bağlantıya div yapın


545

<div>Değiştirmek istemediğim bazı görsel içerikli bir bloğum var . Tıklanabilir bir bağlantı yapmak istiyorum.

Ben benzer bir şey arıyorum <a href="…"><div> … </div></a>, ama bu geçerli XHTML 1.1.


79
iyi bir neden div bir arka plan görüntüsü olurdu
Simon_Weaver

1
En çok oy alan cevaba dayanan iyi bir çalışma örneğim var. Buradaki
Mike

7
HTML5'te divbir a.
Juan A. Navarro

Yanıtlar:


739

Bu benimki daha iyi bir çözüm bulma umuduyla buraya geldi, ama burada sunulanlardan hiç hoşlanmıyorum. Bence bazılarınız soruyu yanlış anladınız. OP, içerikle dolu bir div'in bağlantı gibi davranmasını istiyor. Bunun bir örneği facebook reklamlarıdır - bakarsanız, aslında uygun biçimlendirmedir.

Benim için no-nos: javascript (sadece bir bağlantı için gerekli olmamalı ve çok kötü SEO / erişilebilirlik); geçersiz HTML.

Özünde bu:

  • Panelinizi normal CSS tekniklerini ve geçerli HTML'yi kullanarak oluşturun.
  • Orada bir yerde, kullanıcı paneli tıklarsa varsayılan bağlantı olmasını istediğiniz bir bağlantı koyun (başka bağlantılara da sahip olabilirsiniz).
  • Bu bağlantının içine boş bir span etiketi yerleştirin ( <span></span>değil <span />- thanks @Campey)
  • panel konumunu ver: göreceli
  • boş yayılma alanına aşağıdaki CSS'yi uygulayın:

    { 
      position:absolute; 
      width:100%;
      height:100%;
      top:0;
      left: 0;
    
      z-index: 1;
    
      /* fixes overlap error in IE7/8, 
         make sure you have an empty gif */
      background-image: url('empty.gif');
    }   

    Şimdi paneli kaplayacak ve bir <A>etiketin içinde olduğu için tıklanabilir bir bağlantı

  • panel konumu içindeki diğer bağlantıları verin: göreli ve varsayılan açıklık bağlantısının önüne getirmek için uygun bir z-endeksi (> 1)

11
Teşekkürler iyi çalışıyor. IE8'de işler korkunç bir şekilde parçalanırsa (benim için yaptıkları gibi), boş bir açıklık (<açıklık ... /> yerine bir açılış ve kapanış açıklık etiketi (<açıklık ...> </span>) olduğundan emin olun. ).
Campey

1
Kod tamamen IE7 / 8'de çalışmaz, seçilebilir diğer elemanlar <a><span></span></a>elemandan önceliklidir . Yani, konteyner içindeki resimler ve metinler, z-endeksi ayarlanmış olsa bile bağlantı oluşturmaz.
Spoike

67
Benim gibi aptalca ve bir şeyleri yanlış anlayan insanlar için bir keman bu yüzden biraz onunla oynamak zorunda kaldı: jsfiddle.net/hf75B/1
AlexMA

7
Bunu IE9'da denediniz mi? Bu yöntemi beğendim ve kullanıyorum, ama sadece (@AlexMA'dan keman dahil) IE9'da test ettim ve gördüğüm, metin üzerinde div DICEPT içinde herhangi bir yeri tıklayabileceğiniz. Metnin üzerine geldiğinizde imleç standart bir metin imlecine dönüşür ve metne tıkladığınızda hiçbir şey yapmaz. Kullanıcılar metin öğelerini tıklamaya eğilimli olduklarından (ve metin öğeleri div'ın çoğunu doldurduğunda), bu çözümü IE9'da kullanılamaz hale getirir. Başka biri bunu yaşamış mı yoksa bir çözümü var mı?
bigmac

2
Herkes nasıl sahip olabilir biliyor: hover css bu çözüm ile çalışmak? Belki de kemanın cevabına atıfta bulunarak?
nktokyo

252

Sen yapamaz divbir bağlantı kendisi, ancak bir yapabilirsiniz <a>bir şekilde etiket eylemi block, bir aynı davranışı <div>vardır.

a {
    display: block;
}

Daha sonra üzerinde genişliği ve yüksekliği ayarlayabilirsiniz.


11
Ancak, bu bir bağlantıya 'div' yapmaz. Bir blok elemanına bağlantı kurar. Biraz farklı.
jjnguy

1
Bu, probleminizin çözümü. Div değiştirebildiğiniz için köprü gibi tıklanabilir, ancak tüm tarayıcıda görüntülemek için imleci (= el) ayarlayamazsınız (sadece IE destekliyor!).
Soul_Master

3
jjnguy: Nasıl? Bir bağlantıda çok fazla içeriğe sahip olmaktan hoşlanmıyorum, ancak bu aynı zamanda bir gezinme menüsünün veya bunun gibi bir şeyin parçası olabilir. Bir sabitleme elemanının (<a>) düz metin olması gerekmez, değil mi? Hangi şekilde bir blok haline getirmek yanlıştır ? Anlamsal olarak doğrudur ve istediğiniz gibi görüntülemek için kullanılabilir.
Arve Systad

23
Bu, belirsiz bir soru için tamamen geçerli bir çözümdür. Aslında bir sabitleme öğesini bir divın etrafına sarabilirsiniz, ancak bu anlamsal olarak yanlış olur. (Satır içi öğedeki blok elemanı).
Traingamer

3
jjnguy: Bu oldukça yaygın bir uygulamadır. Div'leri linklerle değiştirmeyi söylemiyorum, ama sorunun sesleri ile sadece bir blok falan tıklatabileceği bir blok istedi.
Soviut

72

Bu eski bir soru, ama burada herkesin çılgın çözümleri olduğu için cevaplayacağımı düşündüm. Aslında çok çok basit ...

Bir bağlantı etiketi şu şekilde çalışır -

<a href="whatever you want"> EVERYTHING IN HERE TURNS INTO A LINK </a>

Sooo ...

<a href="whatever you want"> <div id="thediv" /> </a>

Bunun geçerli olup olmadığından emin olmasam da. Sözlü çözümlerin ardındaki sebep buysa, özür dilerim ...


6
<div>Etkileşimli içerik (diğer <a>öğeler, <button>öğeler vb.) İçermediği sürece geçerli HTML'dir .

50
Örneğin, bağlantılar için bir istisna oluşturan HTML5'i kullanmadığınız sürece , satır içi öğede bulunan geçerli bir HTML bloğu öğesi değil .
thepeer

1
Bu kötü bir örnektir, çünkü aetiketin yaptığı tüm metni a alır divve altını çizer ... bu stil ile hafifletilebilir, ancak en iyi cevap daha iyidir.
Dmitri Nesteruk

2
a #thediv{font-weight:normal;text-decoration:none;}tek ihtiyacınız olan tarz.
tyjkenn

1
Bunu denedim ve çalıştı, ancak elemanın konumunu kırdı. Evet doctype Chrome'da HTML5 (bazı 2014 sürümleri) ..
BAR

60

Biraz javascript gerektirir. Ancak, divtıklanabilir olursunuz .

<div onclick="location.href='http://www.example.com';" style="cursor:pointer;"></div>

9
Sayfada kötü semantik sonuçları olsa da, teknik olarak mümkün olsa bile bundan kaçınırdım.
Arve Systad

2
Bu çözümü kullanmayı düşündüm, ama biraz çirkin. Display'i içeren çözümleri seviyorum: daha iyi engelleyin.
allyourcode

9
Bu bir bağlantıya benziyor, ancak gerçek bir bağlantı değil. Ciddi kullanılabilirlik ve erişilebilirlik sorunları var ve gerçekten kötü bir çözüm.
WhyNotHugo

2
En iyi çözüm. Sadece betiği çalıştırıp "this" i göndermeliyiz.
Arman Hayots

3
Js etkin değilse işlevsellik kaybettiniz. SEO için kötü olmanın yanı sıra.
BAR

40

Bu seçenek, en çok oylanan cevapta olduğu gibi empty.gif gerektirmez:

HTML:

 <div class="feature">
       <a href="http://www.example.com"></a>
 </div>

CSS:

 div.feature {
        position: relative;
    }

    div.feature a {
        position: absolute;
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        text-decoration: none; /* No underlines on the link */
        z-index: 10; /* Places the link above everything else in the div */
        background-color: #FFF; /* Fix to make div clickable in IE */
        opacity: 0; /* Fix to make div clickable in IE */
        filter: alpha(opacity=1); /* Fix to make div clickable in IE */
    }

Http://www.digitalskydesign.com/how-to-make-an-entire-div-a-link-using-css/ adresinde önerildiği gibi


1
Teşekkürler! Chris Jumonville'in çözümü hem Andriod hem de iPhone'da harika çalışıyor. Örnek: gastateparks.org/specials
Loren

1
div.feature > a"Her şey" bölümünün de içinde gizli bir bağlantı olması durumunda olmamalı mı ?
TWiStErRob

bu seçilen cevap olmalı, bootstrap ile de çalışır
Anthony Kal

23

Bu, istediğinizi başarmak için "geçerli" bir çözümdür.

<style type="text/css">
.myspan {
    display: block;
}
</style>
<a href="#"><span class="myspan">text</span></a>

Ancak büyük olasılıkla gerçekten istediğiniz bir <a>etiketin blok düzeyinde bir öğe olarak gösterilmesidir.

Sonuçta erişilebilirliği artırmak için biçimlendirme doğrulamasının amacını bozduğu için bir köprüyü simüle etmek için JavaScript'i kullanmanızı tavsiye etmem (uygun semantik kurallara göre iyi biçimlendirilmiş belgeler yayınlamak, aynı belgenin farklı tarayıcılar tarafından farklı yorumlanması olasılığını en aza indirir).

Doğrulamayan ancak JavaScript devre dışı olanlar da dahil olmak üzere tüm tarayıcılarda düzgün bir şekilde görüntülenen ve çalışan bir web sayfası yayınlamak tercih edilir . Ayrıca, kullanmak onclick, div'in bir bağlantı olarak işlev gördüğünü belirlemek için bir ekran okuyucusuna semantik bilgi sağlamaz.


14

En temiz yol, jQuery'yi HTML'de sunulan veri etiketleriyle kullanmaktır. Bu çözüm ile istediğiniz her etikette bir bağlantı oluşturabilirsiniz. Önce etiketi (ör. Div) veri bağlantısı etiketi ile tanımlayın:

<div data-link="http://www.google.at/">Some content in the div which is arbitrary</div>

Şimdi div'ı istediğiniz gibi biçimlendirebilirsiniz. Ve "link" benzeri davranışlar için de bir stil yaratmalısınız:

[data-link] {
  cursor: pointer;
}

Ve sonunda bu jQuery çağrısını sayfaya koyun:

$(document).ready(function() {
  $("[data-link]").click(function() {
    window.location.href = $(this).attr("data-link");
    return false;
  });
});

Bu kodla jQuery, sayfadaki "data-link" özelliğine sahip her etikete bir tıklama dinleyici uygular ve data-link özelliğinde bulunan URL'ye yönlendirir.


Veri özellikleri hakkında bilgi almak için bakınız: ejohn.org/blog/html-5-data-attributes
Erhard Dinhobl

13

Bunun geçerli olup olmadığından emin değilim ama benim için çalıştı.

Kod:

<div style='position:relative;background-color:#000000;width:600px;height:30px;border:solid;'>
  <p style='display:inline;color:#ffffff;float:left;'> Whatever </p>     
  <a style='position:absolute;top:0px;left:0px;width:100%;height:100%;display:inline;' href ='#'></a>
</div>


9

IE 7'de ve ileriye doğru yanıtın çalışmasını sağlamak için birkaç değişiklik gerekiyor.

  1. Öğenin arka plan rengi yoksa IE, z-dizinini onurlandırmaz, bu nedenle bağlantı, içeriğe sahip içeren içeren div bölümlerinin, yalnızca boş bölümlerin üzerine gelmez. Bunu düzeltmek için opaklık 0 ile bir arka plan eklenir.

  2. Nedense, bağlantı yaklaşımında span kullanılırken IE7 ve çeşitli uyumluluk modları tamamen başarısız olur. Ancak bağlantının kendisine stil verilirse gayet iyi çalışır.

.blockLink  
{  
    position:absolute;  
    top:0;  
    left: 0;  
    width:100%;  
    height:100%;  
    z-index: 1;  
    background-color:#ffffff;   
    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";  
    filter: alpha(opacity=0);  
    opacity:0;  
}
<div style="position:relative">  
    <some content>  
    <a href="somepage" class="blockLink" />  
<div>

8

bir çapayı sararak, daha sonra yüksekliğini ve genişliğini ebeveyni ile aynı olacak şekilde çevirerek de deneyebilirsiniz. Bu benim için mükemmel.

<div id="css_ID">
    <a href="http://www.your_link.com" style="display:block; height:100%; width:100%;"></a>
</div>

1
Ayrıca, üst div öğesinin sıfır doldurma özelliğine sahip olduğundan ve <a> etiketinin sıfır kenar boşluğu bulunduğundan emin olmak isteyebilirsiniz.
Nilpo

4

neden olmasın? use <a href="bla"> <div></div> </a>HTML5'te iyi çalışıyor


HTML doğrulamasını geçmeyecek. Satır öğesi blok öğeleri depolayamaz.
Krzysztof Trzos

Yani, bu <div><span></span></div>geçerli ve <span><div></div></span>değil. Öğelere display: inline;öğe türlerini display: block;koymamalısınız. <a>Etiket satır içi kutudur.
Krzysztof Trzos

Evet, işe yarayabilir, çünkü bunu birden çok şekilde yapabilirsiniz (daha iyi veya daha kötü). Bu özel çözüm eski HTML doğrulamasına neden değildir :).
Krzysztof Trzos

1
"Eski HTML doğrulamasının" bunu geçmemesi önemli mi? Şimdi izin verilir, html5 ve bir nedenle neden kullanmıyorsunuz? Bu çözümün iyi olduğunu düşünüyorum (genellikle div içeriğinin altını çizmeyi gerektirir, ancak yine de).
Todilo

@Todilo Çünkü while <a><div></div></a>geçerli ve çalışıyor, <a><div><a></a></div></a>geçerli değil ve çalışmıyor.
coredumperror

3

Bu yazı Old biliyorum Biliyorum ama sadece aynı sorunu düzeltmek zorunda kaldım çünkü ekran bloğuyla normal bir bağlantı etiketi yazmak IE'de tüm div tıklanabilir yapmaz. bu sorunu JQuery kullanmaktan çok daha basit bir şekilde düzeltmek için.

Öncelikle bunun neden olduğunu anlamalıyız: IE boş bir div tıklanabilir yapmaz sadece div / etiket içindeki metni / resmi tıklanabilir yapar.

Çözüm: Div'yi bir bankamatik görüntüsüyle doldurun ve görüntüleyiciden gizleyin.

Nasıl? İyi sorular sordunuz, şimdi dinleyin. bu artalanları stilini etikete ekle

> "background:url('some_small_image_path')
> -2000px -2000px no-repeat;"

Ve işte tüm div şimdi tıklanabilir. Bu benim için en iyi yoldu çünkü fotoğraf galerim için kullanıyorum, kullanıcının görüntünün yarısında clik'in sola / sağa hareket etmesine izin vermek ve daha sonra sadece görsel efektler için küçük bir görüntü yerleştirmek. bu yüzden benim için sol ve sağ görüntüleri arka plan görüntüleri olarak kullandım!


Teşekkürler! Bir görüntü üzerinde boş çapa ile bir imagemap simüle gerekiyordu ve IE sadece içerik varsa tıklamanıza izin verir. Bu sorunu düzeltti.
MDCore

2

Sadece blokta bağlantı var ve jquery ile geliştirin. Javascript olmayan herkes için% 100 incelikle düşer. Bunu html ile yapmak gerçekten en iyi çözüm imho değildir. Örneğin:

<div id="div_link">
<h2><a href="mylink.htm">The Link and Headline</a></h2>
<p>Some more stuff and maybe another <a href="mylink.htm">link</a>.</p>
</div>

Sonra bloğu tıklanabilir hale getirmek için jquery kullanın ( web tasarım duvarı üzerinden ):

$(document).ready(function(){

    $("#div_link").click(function(){
      window.location=$(this).find("a").attr("href"); return false;
    });

});

Sonra tek yapmanız gereken div'a imleç stilleri eklemek

    #div_link:hover {cursor: pointer;}

Bonus puanlar için bu stilleri yalnızca div, gövde veya herhangi bir şeye 'js_enabled' sınıfı ekleyerek javascript etkinleştirildiyse uygulayın.


Bunu kullanmak istiyorum ama div 2 bağlantıları var ... nasıl her iki bağlantıyı tıklamak mümkün olabilir? (şu anda ikinci bağlantıyı da tıklarsam beni "mylink.html" ye götürür ..)
m3tsys

2

Bu örnek benim için çalıştı:

<div style="position: relative; width:191px; height:83px;">
    <a href="link.php" style="display:block; width:100%; height:100%;"></a>
</div>

2

Bu benim için çalıştı:

HTML:

<div>

  WHATEVER YOU WANT

  <a href="YOUR LINK HERE">
    <span class="span-link"></span>
  </a>

</div>

CSS:

.span-link {
  position:absolute;
  width:100%;
  height:100%;
  top:0;
  left: 0;
  z-index: 9999;
}

Bu, tüm div kapsayan görünmez bir eleman (yayılma), ekler ve bir yukarıda birisi tıklama bu div üzerinde, tıklama aslında sizin görünmez "yayılma" katmanı tarafından kesilmektedir böylece zaman, z-endeksi senin tüm div hangi bağlantılı.

Not: Zaten diğer öğeler için z-endeksleri kullanıyorsanız, bu z-endeksinin değerinin "üstünde" kalmasını istediğiniz her şeyden daha yüksek olduğundan emin olun.


Benim için çalıştı. Üst öğeyi göreceli olarak konumlandırmayı unutmayın.
Saif Al Falah

1

Aslında şu anda JavaScript kodunu eklemeniz gerekiyor, bunu yapmak için bu eğiticiyi kontrol edin .

ancak bunu bir CSS kodu kullanarak başarmanın zor bir yolu var, div etiketinizin içine bir tutturucu etiketi yerleştirmeniz ve bu özelliği buna uygulamanız gerekir,

display:block;

Bunu yaptığınızda, tüm genişlik alanını tıklanabilir hale getirecektir (ancak bağlantı etiketinin yüksekliği dahilinde), tüm div alanını kaplamak istiyorsanız, bağlantı etiketinin yüksekliğini tam olarak div etiketi, örneğin:

height:60px;

bu, tüm alanı tıklanabilir hale getirecektir, o zaman text-indent:-9999pxhedefe ulaşmak için çapa etiketine başvurabilirsiniz .

bu gerçekten zor ve basit ve sadece CSS kodu kullanılarak oluşturuldu.

işte bir örnek : http://jsfiddle.net/hbirjand/RG8wW/


1

BBC web sitesinde ve Guardian'da kullanıldığı gibi bunu yapmanın en iyi yolu budur:

Tekniği burada buldum: http://codepen.io/IschaGast/pen/Qjxpxo

html heres

<div class="highlight block-link">
      <h2>I am an example header</h2>
      <p><a href="pageone" class="block-link__overlay-link">This entire box</a> links somewhere, thanks to faux block links. I am some example text with a <a href="pagetwo">custom link</a> that sits within the block</p>

</div>

CSS heres

/**
 * Block Link
 *
 * A Faux block-level link. Used for when you need a block-level link with
 * clickable areas within it as directly nesting a tags breaks things.
 */


.block-link {
    position: relative;
}

.block-link a {
  position: relative;
  z-index: 1;
}

.block-link .block-link__overlay-link {
    position: static;
    &:before {
      bottom: 0;
      content: "";
      left: 0;
      overflow: hidden;
      position: absolute;
      right: 0;
      top: 0;
      white-space: nowrap;
      z-index: 0;
    }
    &:hover,
    &:focus {
      &:before {
        background: rgba(255,255,0, .2);
      }
    }
}


0

Bu iş benim için:

<div onclick="location.href='page.html';"  style="cursor:pointer;">...</div>

0

Aşağıdaki yöntemle div'inize bir bağlantı verebilirsiniz:

<div class="boxdiv" onClick="window.location.href='https://www.google.co.in/'">google</div>
<style type="text/css">
.boxdiv {
    cursor:pointer;
    width:200px;
    height:200px;
    background-color:#FF0000;
    color:#fff;
    text-align:center;
    font:13px/17px Arial, Helvetica, sans-serif;
    }
</style>

0

Bir href etiketleriyle öğeyi çevreleyebilir veya jquery ve

$('').click(function(e){
e.preventDefault();
//DO SOMETHING
});

0

Bu en basit yol.

Diyelim ki, bu divtıklanabilir yapmak istediğim blok:

<div class="inner_headL"></div>

Öyleyse a'yı hrefaşağıdaki gibi koyun :

<a href="#">
 <div class="inner_headL"></div>
</a>

divBloğu normal bir html öğesi olarak düşünün ve normal hrefetiketi etkinleştirin .
En azından FF üzerinde çalışır.


0

Ben hiçbir koşulda bunu tavsiye etmese de, burada bir bağlantı içine bir DIV yapan bazı kod (not: bu örnek jQuery kullanır ve belirli biçimlendirme basitlik için kaldırılır):

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">

$(document).ready(function() {
    $("div[href]").click(function () {
        window.location = $(this).attr("href");
    });
});

</script>
<div href="http://www.google.com">
     My Div Link
</div>

3
Yine, bu fonksiyonel bir çözümdür, ancak aslında bir XHTML çözümü için olan orijinal sorunun ruhunda değil. Değil büyük bir anlaşma olsa da, cevap vermez soruya gürültü eklemek başlar.
Soviut

0

Bahsedilmemiş bir seçenek flex kullanmaktır. Uygulayarak flex: 1için aetiketi, bu kabı sığacak şekilde genişler.

div {
  height: 100px;
  width: 100px;
  display: flex;
  border: 1px solid;
}

a {
  flex: 1;
}
<div>
  <a href="http://google.co.uk">Link</a>
</div>


-1

Bağlantımdaki bazı değerler kullanıcının geldiği kayda göre değişeceği için bir değişkeni çektim. Bu test için çalıştı:

   <div onclick="location.href='page.html';"  style="cursor:pointer;">...</div> 

ve bu da işe yarıyor:

   <div onclick="location.href='<%=Webpage%>';"  style="cursor:pointer;">...</div> 

1
kod nedense dinamik bir bağlantı oluşturmak için içinde jsp değişkeni ile onclick kullandım
becky

-3

Benim smarty pantolonum cevap:

"Kaçınılması gereken cevap:" Blok düzeyinde eleman nasıl köprü yapılır ve XHTML 1.1'de doğrulanır "

Sadece HTML5 DOCTYPE DTD kullanın. "

Yani ie7 için doğru değildi

onclick="location.href='page.html';"

IE7-9, Chrome, Safari, Firefox,


"XHTML 1.1 geçerli bir yol arıyorum" arıyordu
Mark

-4

eğer her şey bu kadar basit olsaydı ...

#logo {background:url(../global_images/csg-4b15a4b83d966.png) no-repeat top left;background-position:0 -825px;float:left;height:48px;position:relative;width:112px}

#logo a {padding-top:48px; display:block;}



<div id="logo"><a href="../../index.html"></a></div>

sadece kutunun dışında biraz düşünün ;-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.