Fai un div in un link


545

Ho un <div>blocco con alcuni contenuti visivi fantasiosi che non voglio cambiare. Voglio renderlo un link cliccabile.

Sto cercando qualcosa di simile <a href="…"><div> … </div></a>, ma che è XHTML 1.1 valido.


79
un buon motivo sarebbe un'immagine di sfondo nel div
Simon_Weaver

1
Ho un buon esempio di lavoro basato sulla risposta più votata. Controlla il violino qui
Mike

7
In HTML5 è perfettamente valido avere un divunder a a.
Juan A. Navarro,

Risposte:


739

Sono venuto qui nella speranza di trovare una soluzione migliore della mia, ma non mi piacciono quelli offerti qui. Penso che alcuni di voi abbiano frainteso la domanda. L'OP vuole fare in modo che un div pieno di contenuti si comporti come un collegamento. Un esempio di questo potrebbe essere la pubblicità su Facebook: se guardi, in realtà sono un markup corretto.

Per me i no-no sono: javascript (non dovrebbe essere necessario solo per un collegamento e pessima SEO / accessibilità); HTML non valido.

In sostanza è questo:

  • Costruisci il tuo pannello usando le normali tecniche CSS e HTML valido.
  • Da qualche parte lì dentro metti un link che vuoi essere il link predefinito se l'utente fa clic sul pannello (puoi avere anche altri link).
  • All'interno di quel link, inserisci un tag span vuoto ( <span></span>, non <span />- grazie @Campey)
  • dare la posizione del pannello: relativa
  • applica il seguente CSS all'intervallo vuoto:

    { 
      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');
    }   

    Ora coprirà il pannello e, poiché si trova all'interno di un <A>tag, è un link cliccabile

  • fornire qualsiasi altro collegamento all'interno della posizione del pannello: relativo e un indice z adatto (> 1) per portarli davanti al collegamento di span predefinito

11
Grazie funziona bene. Se le cose si rompono in modo orribile (come hanno fatto per me) in IE8, assicurati di avere un tag span di apertura e chiusura (<span ...> </span>), anziché uno span vuoto (<span ... /> ).
Campey,

1
Il codice non funziona interamente in IE7 / 8, altri elementi selezionabili hanno la precedenza <a><span></span></a>sull'elemento. Vale a dire immagini e testi all'interno del contenitore non si collegheranno anche se l'indice z è impostato.
Spoike

67
Un violino per le persone che sono sciocche come me e hanno letto male qualcosa, quindi ho dovuto giocarci un po ': jsfiddle.net/hf75B/1
AlexMA,

7
Hai provato questo in IE9? Mi piace questo metodo e lo sto usando, ma l'ho appena testato (incluso il violino di @AlexMA) in IE9, e quello che vedo è che puoi fare clic in qualsiasi punto del div EXCEPT sul testo. Passando il mouse sopra il testo, il cursore si trasforma in un cursore di testo standard e non fa nulla quando si fa clic sul testo. Poiché gli utenti sono inclini a fare clic sugli elementi di testo (e quando gli elementi di testo riempiono la maggior parte del div), questa soluzione diventa inutilizzabile in IE9. Qualcun altro ha sperimentato questo o ha una soluzione?
bigmac,

2
Qualcuno sa come avere: hover css funziona con questa soluzione? Forse riferendo la risposta messa nel violino?
nktokyo,

252

Non puoi fare in modo che il divlink a stesso, ma puoi fare in modo che un <a>tag agisca come un block, lo stesso comportamento che <div>ha.

a {
    display: block;
}

È quindi possibile impostare la larghezza e l'altezza su di esso.


11
Tuttavia, ciò non crea un "div" in un collegamento. Crea un collegamento in un elemento a blocchi. È un po 'diverso.
jjnguy,

1
Questa è la soluzione del tuo problema. Poiché è possibile modificare div, è possibile fare clic come collegamento ipertestuale, ma non è possibile impostare il cursore (= mano) per la visualizzazione in tutti i browser (solo IE lo supporta!).
Soul_Master,

3
jjnguy: Come? Non mi piace avere un sacco di contenuti in un link, ma questo potrebbe anche far parte di un menu di navigazione o qualcosa del genere. Un elemento di ancoraggio (<a>) non deve necessariamente essere un testo semplice, vero? In che modo è sbagliato trasformarlo in un blocco? È semanticamente corretto e può essere utilizzato per visualizzarlo come desideri.
Arve Systad,

23
Questa è una soluzione perfettamente valida per una vaga domanda. In realtà POTREBBE semplicemente avvolgere un elemento di ancoraggio attorno a un div, ma sarebbe semanticamente errato. (Elemento blocco all'interno dell'elemento inline).
Traingamer,

3
jjnguy: questa è una pratica abbastanza comune. Non sto dicendo di sostituire i div con i link, ma dal suono della domanda voleva solo un blocco che potesse fare clic come un pulsante o qualcosa del genere.
Soviet,

72

Questa è una domanda antica, ma ho pensato di rispondere poiché tutti qui hanno delle soluzioni pazze. In realtà è molto molto semplice ...

Un tag anchor funziona così:

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

Era talmente ...

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

Anche se non sono sicuro che questo sia valido. Se questo è il ragionamento alla base delle soluzioni vocali, allora mi scuso ...


6
È un codice HTML valido purché <div>non contenga alcun contenuto interattivo (altri <a>elementi, <button>elementi, ecc.).

50
Il tuo esempio non è HTML valido - elemento di blocco contenuto in un elemento inline - a meno che tu non stia usando HTML5, che ha fatto un'eccezione per i collegamenti.
thepeer,

1
Questo è un cattivo esempio, perché ciò che il atag fa è prendere tutto il testo in a dive lo sottolinea ... questo può essere mitigato con uno stile, ma la risposta migliore è migliore.
Dmitri Nesteruk,

2
a #thediv{font-weight:normal;text-decoration:none;}è tutto ciò che serve in termini di stile.
Tyjkenn,

1
Ho provato questo e ha funzionato, tuttavia ha rotto il posizionamento dell'elemento. Sì, doctype è HTML5 in Chrome (alcune versioni del 2014) ..
BAR

60

Richiede un po 'di javascript. Ma il tuo divsarebbe cliccabile.

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

9
Risultati nella semantica cattiva sulla pagina, quindi eviterei questo anche se tecnicamente è possibile.
Arve Systad,

2
Ho pensato di usare questa soluzione, ma è piuttosto brutta. Mi piacciono le soluzioni che coinvolgono display: bloccare meglio.
codice alleato

9
Sembra un collegamento, ma non è un collegamento reale. Ha gravi problemi di usabilità e accessibilità ed è una soluzione davvero brutta.
WhyNotHugo,

2
Soluzione migliore. Dobbiamo solo eseguire lo script e inviare "questo" ad esso.
Arman Hayots,

3
Se non hanno abilitato js hai perso la funzionalità. Oltre ad essere dannoso per il SEO.
BAR

40

Questa opzione non richiede un file empty.gif come nella risposta più votata:

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 */
    }

Come proposto su http://www.digitalskydesign.com/how-to-make-an-entire-div-a-link-using-css/


1
Grazie! La soluzione di Chris Jumonville funziona alla grande sia su Andriod che su iPhone. Esempio: gastateparks.org/specials
Loren,

1
Non dovrebbe essere div.feature > asolo nel caso in cui la parte "tutto il resto" contenga anche un link nascosto nel profondo?
TWiStErRob,

questa dovrebbe essere la risposta scelta, funziona anche con bootstrap
Anthony Kal il

23

Questa è una soluzione "valida" per raggiungere ciò che desideri.

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

Ma molto probabilmente quello che vuoi davvero è avere un <a>tag visualizzato come elemento a livello di blocco.

Non consiglierei l'uso di JavaScript per simulare un collegamento ipertestuale in quanto vanifica lo scopo della convalida del markup, che in definitiva è quello di promuovere l'accessibilità (la pubblicazione di documenti ben formati seguendo le regole semantiche adeguate minimizza la possibilità che lo stesso documento venga interpretato in modo diverso da browser diversi).

Sarebbe preferibile pubblicare una pagina Web che non convalida, ma esegue il rendering e funziona correttamente su tutti i browser , inclusi quelli con JavaScript disabilitato. Inoltre, l'utilizzo onclicknon fornisce le informazioni semantiche per uno screen reader per determinare che il div funziona come un collegamento.


14

Il modo più pulito sarebbe utilizzare jQuery con i tag di dati introdotti in HTML. Con questa soluzione è possibile creare un collegamento su ogni tag desiderato. Per prima cosa definire il tag (ad es. Div) con un tag di collegamento dati:

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

Ora puoi modellare il div come preferisci. E devi creare anche lo stile per il comportamento "link" -alike:

[data-link] {
  cursor: pointer;
}

E finalmente metti questa chiamata jQuery alla pagina:

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

Con questo codice jQuery applica un listener di clic a ogni tag della pagina che ha un attributo "collegamento dati" e reindirizza all'URL che si trova nell'attributo collegamento dati.


Per ottenere informazioni sugli attributi dei dati, consultare: ejohn.org/blog/html-5-data-attributes
Erhard Dinhobl

13

Non sono sicuro se questo è valido ma ha funzionato per me.

Il codice :

<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

Per far funzionare la risposta di Thepeer in IE 7 e versioni successive, sono necessarie alcune modifiche.

  1. IE non rispetterà l'indice z se l'elemento non ha un colore di sfondo, quindi il collegamento non si sovrapporrà alle parti del div contenitivo che ha contenuto, solo le parti vuote. Per risolvere questo, viene aggiunto uno sfondo con opacità 0.

  2. Per qualche motivo IE7 e varie modalità di compatibilità falliscono completamente quando si utilizza lo span in un approccio di collegamento. Tuttavia, se al link stesso viene dato lo stile, funziona perfettamente.

.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

potresti anche provare avvolgendo un'ancora, quindi ruotando l'altezza e la larghezza in modo che siano uguali a quelle del genitore. Questo funziona perfettamente per me.

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

1
Potresti anche assicurarti che il div parent abbia zero padding e che il tag <a> abbia margine zero.
Nilpo,

4

perchè no? use <a href="bla"> <div></div> </a>funziona bene in HTML5


Non passerà la convalida HTML. L'elemento pubblicitario non può memorizzare gli elementi a blocchi.
Krzysztof Trzos,

Voglio dire, <div><span></span></div>è valido e <span><div></div></span>non lo è. Non dovresti mettere il display: inline;tipo di oggetti negli display: block;oggetti. Il <a>tag è inline box.
Krzysztof Trzos,

Sì, può funzionare, perché puoi farlo in diversi modi (meglio o peggio). Questa particolare soluzione non è valida perché la vecchia convalida HTML :).
Krzysztof Trzos,

1
È importante che la "convalida HTML precedente" non passi questo? È permesso ora, html5 e per un motivo, quindi perché non usarlo? Penso che questa soluzione vada bene (spesso richiede la rimozione di sottolineature al contenuto div ma comunque).
Todilo,

@Todilo Perché while <a><div></div></a>è valido e funziona, <a><div><a></a></div></a>non è valido e non funziona.
coredumperror,

3

Questo post è vecchio, lo so, ma dovevo solo risolvere lo stesso problema perché semplicemente scrivere un normale tag di collegamento con il display impostato su blocco non rende l'intero div selezionabile in IE. quindi per risolvere questo problema molto più semplice che dover usare JQuery.

Innanzitutto, cerchiamo di capire perché ciò accada: IE non renderà selezionabile un div vuoto, ma solo il testo / l'immagine all'interno di quel div / tag selezionabile.

Soluzione: riempire il div con un'immagine bakground e nasconderlo allo spettatore.

Come? Fai buone domande, ora ascolta. aggiungi questo stile backround al tag a

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

E il gioco è fatto ora l'intero click è cliccabile. Questo è stato il modo migliore per me perché lo sto usando per la mia Galleria fotografica per consentire all'utente di fare clic su metà dell'immagine per spostarsi a sinistra / destra e quindi posizionare una piccola immagine anche solo per effetti visivi. quindi per me ho usato comunque le immagini sinistra e destra come immagini di sfondo!


Grazie! Avevo bisogno di simulare una mappa immagine con ancore vuote su un'immagine e IE ti avrebbe lasciato fare clic solo se c'era contenuto. Questo l'ha risolto.
MDCore,

2

Basta avere il collegamento nel blocco e migliorarlo con jquery. Si degrada con garbo al 100% per chiunque senza javascript. Fare questo con HTML non è davvero la migliore soluzione imho. Per esempio:

<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>

Quindi utilizzare jquery per rendere selezionabile il blocco (tramite la parete del web designer ):

$(document).ready(function(){

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

});

Quindi tutto ciò che devi fare è aggiungere gli stili cursore al div

    #div_link:hover {cursor: pointer;}

Per i punti bonus applica questi stili solo se javascript è abilitato aggiungendo una classe 'js_enabled' al div, o al body, o altro.


voglio usarlo ma ho 2 collegamenti nel div ... come posso modificarlo per poter fare clic su entrambi i collegamenti? (attualmente mi porta a "mylink.html" se faccio clic anche sul secondo link ..)
m3tsys,

2

Questo esempio ha funzionato per me:

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

2

Questo ha funzionato per me:

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;
}

Questo aggiunge un elemento invisibile (l'intervallo), che copre l'intero div, ed è al di sopra dell'intero div sull'indice z, quindi quando qualcuno fa clic su quel div, il clic viene essenzialmente intercettato dal livello invisibile "intervallo", che è collegato.

Nota: se stai già utilizzando gli z-index per altri elementi, assicurati solo che il valore di questo z-index sia superiore a qualsiasi cosa tu voglia che sia "in cima".


Ha funzionato per me. Basta non dimenticare di posizionare relativamente l'elemento genitore.
Saif Al Falah,

1

In realtà è necessario includere il codice JavaScript al momento, controllare questo tutorial per farlo.

ma esiste un modo complicato per raggiungere questo obiettivo utilizzando un codice CSS, è necessario nidificare un tag di ancoraggio all'interno del tag div e applicare questa proprietà ad esso,

display:block;

quando lo hai fatto, renderà cliccabile l'intera area della larghezza (ma entro l'altezza del tag di ancoraggio), se vuoi coprire l'intera area div devi impostare l'altezza del tag di ancoraggio esattamente all'altezza del tag div, ad esempio:

height:60px;

questo renderà cliccabile l'intera area, quindi puoi applicare il text-indent:-9999pxtag di ancoraggio per raggiungere l'obiettivo.

questo è davvero complicato e semplice ed è stato appena creato utilizzando il codice CSS.

ecco un esempio : http://jsfiddle.net/hbirjand/RG8wW/


1

Questo è il modo migliore per farlo come usato sul sito web della BBC e sul Guardian:

Ho trovato la tecnica qui: http://codepen.io/IschaGast/pen/Qjxpxo

ecco l'html

<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>

ecco il CSS

/**
 * 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

Questo lavoro per me:

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

0

Puoi dare un link al tuo div con il seguente metodo:

<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

Puoi circondare l'elemento con un tag href oppure puoi usare jquery e usare

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

0

Questo è il modo più semplice.

Supponiamo che questo sia il divblocco che voglio rendere selezionabile:

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

Quindi metti un hrefcome segue:

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

Basta considerare il divblocco come un normale elemento html e abilitare il solito hreftag.
Funziona almeno su FF.


0

Anche se non consiglio di farlo in nessuna circostanza, ecco del codice che trasforma un DIV in un collegamento (nota: questo esempio usa jQuery e alcuni markup vengono rimossi per semplicità):

<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
Ancora una volta, questa è una soluzione funzionale, ma non proprio nello spirito della domanda originale che era per una soluzione XHTML. Anche se non è un grande affare, la tua risposta non iniziare ad aggiungere rumore alla domanda.
Soviet,

0

Un'opzione che non è stata menzionata è l'utilizzo di flex. Applicando flex: 1al atag, si espande per adattarsi al contenitore.

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

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


-1

Ho inserito una variabile perché alcuni valori nel mio link cambieranno a seconda del record da cui proviene l'utente. Questo ha funzionato per i test:

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

e funziona anche questo:

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

1
il codice non viene visualizzato per qualche motivo ho usato l'onclick con una variabile jsp all'interno per creare un collegamento dinamico
becky

-3

I miei pantaloni intelligenti rispondono:

"Risposta evasiva a:" Come rendere l'elemento a livello di blocco un collegamento ipertestuale e convalidare in XHTML 1.1 "

Basta usare HTML5 DOCTYPE DTD. "

In realtà non è vero per ie7

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

Funziona IE7-9, Chrome, Safari, Firefox,


stava cercando "Sto cercando un modo valido per XHTML 1.1"
Segna il

-4

se proprio tutto potesse essere così semplice ...

#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>

pensa solo un po 'fuori dagli schemi ;-)

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.