uma boa razão seria uma imagem de plano de fundo na div
Simon_Weaver 03/03
1
Eu tenho um bom exemplo de trabalho baseado na resposta mais votada. Verifique o violino aqui
Mike
7
No HTML5, é perfeitamente válido ter um divsob um a.
Juan A. Navarro
Respostas:
739
Vim aqui na esperança de encontrar uma solução melhor que a minha, mas não gosto de nenhuma delas. Eu acho que alguns de vocês entenderam mal a pergunta. O OP quer fazer com que uma div cheia de conteúdo se comporte como um link. Um exemplo disso seria os anúncios do Facebook - se você olhar, eles são realmente uma marcação adequada.
Para mim, os nãos são: javascript (não deve ser necessário apenas para um link e SEO / acessibilidade muito ruins); HTML inválido.
Em essência, é isso:
Crie seu painel usando técnicas normais de CSS e HTML válido.
Em algum lugar, coloque um link que você deseja que seja o link padrão se o usuário clicar no painel (você também pode ter outros links).
Dentro desse link, coloque uma tag de extensão vazia ( <span></span>, não <span />- obrigado @Campey)
dê a posição do painel: relativa
aplique o seguinte CSS ao intervalo vazio:
{
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');
}
Agora, ele cobre o painel e, como está dentro de uma <A>tag, é um link clicável
forneça quaisquer outros links dentro da posição do painel: relativo e um índice z adequado (> 1) para colocá-los na frente do link de extensão padrão
Obrigado funciona bem. Se as coisas quebrarem horrivelmente (como aconteceram comigo) no IE8, verifique se você tem uma tag de abertura e fechamento (<span ...> </span>), em vez de uma extensão vazia (<span ... /> )
Campey
1
O código não funciona totalmente no IE7 / 8, outros elementos selecionáveis têm precedência sobre o <a><span></span></a>elemento. Ou seja, imagens e textos dentro do contêiner não serão vinculados, mesmo que o z-index esteja definido.
Spoike
67
Um violino para as pessoas que são tolas como eu e mal interpretado algo tão tinha que brincar com ele um pouco: jsfiddle.net/hf75B/1
AlexMA
7
Você já tentou isso no IE9? Eu gosto desse método e estou usando, mas eu apenas o testei (incluindo o violino do @AlexMA) no IE9, e o que estou vendo é que você pode clicar em qualquer lugar da div, EXCETO no texto. Quando você passa o mouse sobre o texto, o cursor muda para um cursor de texto padrão e não faz nada quando você clica no texto. Como os usuários tendem a clicar nos elementos de texto (e quando os elementos de texto preenchem a maior parte da div), ela torna essa solução inutilizável no IE9. Alguém já experimentou isso ou tem uma solução?
bigmac 12/09/12
2
Alguém sabe como: hover css funciona com esta solução? Talvez referindo a resposta colocada no violino?
Nktokyo
252
Você não pode criar o divlink a, mas pode fazer com que uma <a>tag atue como a block, o mesmo comportamento que uma <div>.
No entanto, isso não transforma um 'div' em um link. Faz um link em um elemento de bloco. É um pouco diferente.
jjnguy
1
Esta é a solução do seu problema. Como você pode modificar, div pode ser clicado como um hiperlink, mas não é possível definir o cursor (= mão) para exibição em todos os navegadores (somente o IE suporta!).
Soul_Master
3
jjnguy: Como? Não gosto de ter muito conteúdo em um link, mas isso também pode fazer parte de um menu de navegação ou algo assim. Um elemento âncora (<a>) não precisa necessariamente ser texto simples, não é? De que maneira é errado transformá-lo em um bloco? É semanticamente correto e pode ser usado para exibi-lo como você deseja.
Arve Systad 28/04/09
23
Esta é uma solução perfeitamente válida para uma pergunta vaga. Você realmente pode simplesmente envolver um elemento âncora em torno de uma div, mas isso seria semanticamente incorreto. (Elemento de bloco dentro do elemento inline).
Traingamer
3
jjnguy: Essa é uma prática bastante comum. Não estou dizendo substituir divs por links, mas pelo som da pergunta, ele só queria um bloco em que pudesse clicar como um botão ou algo assim.
Soviut 29/04/09
72
Esta é uma pergunta antiga, mas pensei em responder, já que todos aqui têm algumas soluções malucas. Na verdade, é muito, muito simples ...
Uma tag de âncora funciona assim -
<ahref="whatever you want"> EVERYTHING IN HERE TURNS INTO A LINK </a>
Sooo ...
<ahref="whatever you want"><divid="thediv"/></a>
Embora eu não tenha certeza se isso é válido. Se esse é o raciocínio por trás das soluções faladas, peço desculpas ...
É HTML válido, desde <div>que não contenha nenhum conteúdo interativo (outros <a>elementos, <button>elementos etc.).
50
Seu exemplo não é HTML válido - elemento de bloco contido em um elemento embutido - a menos que você esteja usando HTML5, que fez uma exceção para links.
thepeer
1
Este é um mau exemplo, porque o que a atag faz é pegar todo o texto em um dive sublinha-lo ... isso pode ser mitigado com o estilo, mas a resposta principal é melhor.
Dmitri Nesteruk
2
a #thediv{font-weight:normal;text-decoration:none;}é tudo o que você precisa em termos de estilo.
tyjkenn
1
Tentei isso e funcionou, no entanto, quebrou o posicionamento do elemento. Sim, doctype é HTML5 no Chrome (versão 2014) ..
BAR
60
Requer um pouco de javascript. Mas, você divseria clicável.
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 */
}
Mas, provavelmente, o que você realmente deseja é ter uma <a>tag exibida como um elemento no nível do bloco.
Eu não recomendaria o uso de JavaScript para simular um hiperlink, pois isso derrota o objetivo da validação de marcação, que é, em última análise, promover a acessibilidade (publicar documentos bem formados seguindo regras semânticas apropriadas minimiza a possibilidade de o mesmo documento ser interpretado de maneira diferente por navegadores diferentes).
Seria preferível publicar uma página da web que não valida, mas é renderizada e funciona corretamente em todos os navegadores , incluindo aqueles com JavaScript desativado. Além disso, o uso onclicknão fornece as informações semânticas para um leitor de tela para determinar se o div está funcionando como um link.
A maneira mais limpa seria usar o jQuery com as tags de dados introduzidas no HTML. Com esta solução, você pode criar um link para cada tag que desejar. Primeiro defina a tag (por exemplo, div) com uma tag de link de dados:
<divdata-link="http://www.google.at/">Some content in the div which is arbitrary</div>
Agora você pode estilizar a div da maneira que desejar. E você também deve criar o estilo para o comportamento semelhante ao "link":
[data-link]{cursor: pointer;}
E, finalmente, coloque esta chamada do jQuery na página:
Com esse código, o jQuery aplica um ouvinte de clique a cada tag na página que possui um atributo "link de dados" e redireciona para o URL que está no atributo de link de dados.
Para que a resposta do funcionário funcione no IE 7 e para a frente, ele precisa de alguns ajustes.
O IE não respeitará o índice z se o elemento não tiver cor de plano de fundo; portanto, o link não sobreporá partes da div de contenção que possui conteúdo, apenas as partes em branco. Para corrigir isso, um plano de fundo é adicionado com opacidade 0.
Por alguma razão, o IE7 e vários modos de compatibilidade falham completamente ao usar o intervalo em uma abordagem de link. No entanto, se o próprio link receber o estilo, ele funcionará perfeitamente.
você também pode tentar enrolar uma âncora e depois girar sua altura e largura para que sejam iguais às de seu pai. Isso funciona para mim perfeitamente.
Não será aprovado na validação HTML. O item de linha não pode armazenar itens de bloco.
precisa saber é o seguinte
Quero dizer, isso <div><span></span></div>é válido e <span><div></div></span>não é. Você não deve colocar display: inline;tipos de itens em display: block;itens. A <a>tag está na caixa embutida.
precisa saber é o seguinte
Sim, pode funcionar, porque você pode fazê-lo de várias maneiras (melhor ou pior). Esta solução em particular não é boa porque a validação HTML mais antiga :).
precisa saber é o seguinte
1
Importa que a "validação HTML mais antiga" não seja aprovada? É permitido agora, html5 e, por uma razão, por que não usá-lo? Eu acho que essa solução é boa (geralmente exige a remoção de sublinhado do conteúdo div, mas ainda assim).
Todilo 28/08/15
@Todilo Porque while <a><div></div></a>é válido e funciona, <a><div><a></a></div></a>não é válido e não funciona.
Coredumperror
3
Esta postagem é antiga, eu sei, mas só tive que corrigir o mesmo problema, porque simplesmente escrever uma tag de link normal com a exibição configurada para bloquear não torna toda a div clicável no IE. portanto, para corrigir esse problema muito mais simples do que precisar usar o JQuery.
Em primeiro lugar, vamos entender por que isso acontece: o IE não tornará uma div vazia clicável, apenas tornará o texto / imagem dessa div / tag clicável.
Solução: preencha a div com uma imagem de fundo e oculte-a do visualizador.
Quão? Você faz boas perguntas, agora ouça. adicione esse estilo de backround à tag a
E aí está, toda a div agora é clicável. Essa foi a melhor maneira para mim, porque estou usando-a na minha Galeria de fotos para permitir que o usuário clique em metade da imagem para mover para a esquerda / direita e, em seguida, coloque uma imagem pequena apenas para efeitos visuais. então, para mim, usei as imagens esquerda e direita como imagem de fundo!
Obrigado! Eu precisava simular um mapa de imagem com âncoras vazias sobre uma imagem e o IE só permitiria que você clique se houver conteúdo. Isso consertou.
MDCore
2
Basta ter o link no bloco e aprimorá-lo com jquery. Degrada 100% normalmente para qualquer pessoa sem javascript. Fazer isso com html não é realmente a melhor solução para imho. Por exemplo:
<divid="div_link"><h2><ahref="mylink.htm">The Link and Headline</a></h2><p>Some more stuff and maybe another <ahref="mylink.htm">link</a>.</p></div>
Então tudo que você precisa fazer é adicionar estilos de cursor à div
#div_link:hover {cursor: pointer;}
Para pontos de bônus, aplique esses estilos somente se o javascript estiver ativado, adicionando uma classe 'js_enabled' à div, ao corpo ou a qualquer outra coisa.
Eu quero usar isso, mas eu tenho 2 links na div ... como posso modificá-lo para poder clicar em ambos os links? (que atualmente leva-me a "mylink.html" se eu clicar no segundo link, bem ..)
Isso adiciona um elemento invisível (a extensão), que cobre toda a sua div e está acima toda a sua div no índice z; portanto, quando alguém clica nessa div, o clique é essencialmente interceptado pela camada invisível de "extensão", que é ligado.
Nota: Se você já estiver usando índices z para outros elementos, certifique-se de que o valor desse índice z seja mais alto do que qualquer coisa que você queira que fique "em cima".
Trabalhou para mim. Só não se esqueça de posicionar relativamente o elemento pai.
Saif Al Falah
1
Na verdade, você precisa incluir o código JavaScript no momento, verifique este tutorial para fazer isso.
mas há uma maneira complicada de conseguir isso usando um código CSS. Você deve aninhar uma tag de âncora dentro da tag div e aplicar essa propriedade a ela,
display:block;
quando você fizer isso, fará com que toda a área da largura seja clicável (mas dentro da altura da tag de âncora), se você quiser cobrir toda a área div, deverá definir a altura da tag de âncora exatamente para a altura da tag div, por exemplo:
height:60px;
isso tornará a área inteira clicável, então você poderá aplicar text-indent:-9999px a tag anchor para atingir a meta.
isso é realmente complicado e simples e foi criado usando o código CSS.
<divclass="highlight block-link"><h2>I am an example header</h2><p><ahref="pageone"class="block-link__overlay-link">This entire box</a> links somewhere, thanks to faux block links. I am some example text with a <ahref="pagetwo">custom link</a> that sits within the block</p></div>
aqui está o 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);
}
}
}
Embora eu não recomendo fazer isso sob nenhuma circunstância, aqui está um código que transforma um DIV em um link (nota: este exemplo usa jQuery e determinadas marcações são removidas por simplicidade):
<scripttype="text/javascript"src="jquery-1.3.2.min.js"></script><scripttype="text/javascript">
$(document).ready(function(){
$("div[href]").click(function(){
window.location = $(this).attr("href");});});</script><divhref="http://www.google.com">
My Div Link
</div>
Novamente, esta é uma solução funcional, mas não no espírito da pergunta original, que era para uma solução XHTML. Apesar de não ser um grande negócio, a sua resposta não começar a adicionar ruído à pergunta.
Soviut
0
Uma opção que não foi mencionada está usando o flex. Ao aplicar flex: 1à atag, ela se expande para caber no contêiner.
div {height:100px;width:100px;display: flex;border:1px solid;}
a {flex:1;}
div
sob uma
.Respostas:
Vim aqui na esperança de encontrar uma solução melhor que a minha, mas não gosto de nenhuma delas. Eu acho que alguns de vocês entenderam mal a pergunta. O OP quer fazer com que uma div cheia de conteúdo se comporte como um link. Um exemplo disso seria os anúncios do Facebook - se você olhar, eles são realmente uma marcação adequada.
Para mim, os nãos são: javascript (não deve ser necessário apenas para um link e SEO / acessibilidade muito ruins); HTML inválido.
Em essência, é isso:
<span></span>
, não<span />
- obrigado @Campey)aplique o seguinte CSS ao intervalo vazio:
Agora, ele cobre o painel e, como está dentro de uma
<A>
tag, é um link clicávelfonte
<a><span></span></a>
elemento. Ou seja, imagens e textos dentro do contêiner não serão vinculados, mesmo que o z-index esteja definido.Você não pode criar o
div
link a, mas pode fazer com que uma<a>
tag atue como ablock
, o mesmo comportamento que uma<div>
.Você pode então definir a largura e a altura.
fonte
Esta é uma pergunta antiga, mas pensei em responder, já que todos aqui têm algumas soluções malucas. Na verdade, é muito, muito simples ...
Uma tag de âncora funciona assim -
Sooo ...
Embora eu não tenha certeza se isso é válido. Se esse é o raciocínio por trás das soluções faladas, peço desculpas ...
fonte
<div>
que não contenha nenhum conteúdo interativo (outros<a>
elementos,<button>
elementos etc.).a
tag faz é pegar todo o texto em umdiv
e sublinha-lo ... isso pode ser mitigado com o estilo, mas a resposta principal é melhor.a #thediv{font-weight:normal;text-decoration:none;}
é tudo o que você precisa em termos de estilo.Requer um pouco de javascript. Mas, você
div
seria clicável.fonte
Esta opção não requer um empty.gif, como na resposta mais votada:
HTML:
CSS:
Conforme proposto em http://www.digitalskydesign.com/how-to-make-an-entire-div-a-link-using-css/
fonte
div.feature > a
apenas no caso de a parte "tudo o resto" também conter um link escondido no fundo?Esta é uma solução "válida" para alcançar o que você deseja.
Mas, provavelmente, o que você realmente deseja é ter uma
<a>
tag exibida como um elemento no nível do bloco.Eu não recomendaria o uso de JavaScript para simular um hiperlink, pois isso derrota o objetivo da validação de marcação, que é, em última análise, promover a acessibilidade (publicar documentos bem formados seguindo regras semânticas apropriadas minimiza a possibilidade de o mesmo documento ser interpretado de maneira diferente por navegadores diferentes).
Seria preferível publicar uma página da web que não valida, mas é renderizada e funciona corretamente em todos os navegadores , incluindo aqueles com JavaScript desativado. Além disso, o uso
onclick
não fornece as informações semânticas para um leitor de tela para determinar se o div está funcionando como um link.fonte
A maneira mais limpa seria usar o jQuery com as tags de dados introduzidas no HTML. Com esta solução, você pode criar um link para cada tag que desejar. Primeiro defina a tag (por exemplo, div) com uma tag de link de dados:
Agora você pode estilizar a div da maneira que desejar. E você também deve criar o estilo para o comportamento semelhante ao "link":
E, finalmente, coloque esta chamada do jQuery na página:
Com esse código, o jQuery aplica um ouvinte de clique a cada tag na página que possui um atributo "link de dados" e redireciona para o URL que está no atributo de link de dados.
fonte
Não tenho certeza se isso é válido, mas funcionou para mim.
O código :
fonte
Para que a resposta do funcionário funcione no IE 7 e para a frente, ele precisa de alguns ajustes.
O IE não respeitará o índice z se o elemento não tiver cor de plano de fundo; portanto, o link não sobreporá partes da div de contenção que possui conteúdo, apenas as partes em branco. Para corrigir isso, um plano de fundo é adicionado com opacidade 0.
Por alguma razão, o IE7 e vários modos de compatibilidade falham completamente ao usar o intervalo em uma abordagem de link. No entanto, se o próprio link receber o estilo, ele funcionará perfeitamente.
fonte
você também pode tentar enrolar uma âncora e depois girar sua altura e largura para que sejam iguais às de seu pai. Isso funciona para mim perfeitamente.
fonte
Por que não?
use <a href="bla"> <div></div> </a>
funciona bem em HTML5fonte
<div><span></span></div>
é válido e<span><div></div></span>
não é. Você não deve colocardisplay: inline;
tipos de itens emdisplay: block;
itens. A<a>
tag está na caixa embutida.<a><div></div></a>
é válido e funciona,<a><div><a></a></div></a>
não é válido e não funciona.Esta postagem é antiga, eu sei, mas só tive que corrigir o mesmo problema, porque simplesmente escrever uma tag de link normal com a exibição configurada para bloquear não torna toda a div clicável no IE. portanto, para corrigir esse problema muito mais simples do que precisar usar o JQuery.
Em primeiro lugar, vamos entender por que isso acontece: o IE não tornará uma div vazia clicável, apenas tornará o texto / imagem dessa div / tag clicável.
Solução: preencha a div com uma imagem de fundo e oculte-a do visualizador.
Quão? Você faz boas perguntas, agora ouça. adicione esse estilo de backround à tag a
E aí está, toda a div agora é clicável. Essa foi a melhor maneira para mim, porque estou usando-a na minha Galeria de fotos para permitir que o usuário clique em metade da imagem para mover para a esquerda / direita e, em seguida, coloque uma imagem pequena apenas para efeitos visuais. então, para mim, usei as imagens esquerda e direita como imagem de fundo!
fonte
Basta ter o link no bloco e aprimorá-lo com jquery. Degrada 100% normalmente para qualquer pessoa sem javascript. Fazer isso com html não é realmente a melhor solução para imho. Por exemplo:
Em seguida, use jquery para tornar o bloco clicável (via parede do web designer ):
Então tudo que você precisa fazer é adicionar estilos de cursor à div
Para pontos de bônus, aplique esses estilos somente se o javascript estiver ativado, adicionando uma classe 'js_enabled' à div, ao corpo ou a qualquer outra coisa.
fonte
Este exemplo funcionou para mim:
fonte
Isso funcionou para mim:
HTML:
CSS:
Isso adiciona um elemento invisível (a extensão), que cobre toda a sua div e está acima toda a sua div no índice z; portanto, quando alguém clica nessa div, o clique é essencialmente interceptado pela camada invisível de "extensão", que é ligado.
Nota: Se você já estiver usando índices z para outros elementos, certifique-se de que o valor desse índice z seja mais alto do que qualquer coisa que você queira que fique "em cima".
fonte
Na verdade, você precisa incluir o código JavaScript no momento, verifique este tutorial para fazer isso.
mas há uma maneira complicada de conseguir isso usando um código CSS. Você deve aninhar uma tag de âncora dentro da tag div e aplicar essa propriedade a ela,
quando você fizer isso, fará com que toda a área da largura seja clicável (mas dentro da altura da tag de âncora), se você quiser cobrir toda a área div, deverá definir a altura da tag de âncora exatamente para a altura da tag div, por exemplo:
isso tornará a área inteira clicável, então você poderá aplicar
text-indent:-9999px
a tag anchor para atingir a meta.isso é realmente complicado e simples e foi criado usando o código CSS.
Aqui está um exemplo : http://jsfiddle.net/hbirjand/RG8wW/
fonte
Essa é a melhor maneira de fazer isso, conforme usado no site da BBC e no Guardian:
Encontrei a técnica aqui: http://codepen.io/IschaGast/pen/Qjxpxo
aqui está o html
aqui está o CSS
fonte
fonte
Este trabalho para mim:
fonte
Você pode fornecer um link para sua div seguindo o método:
fonte
Você pode envolver o elemento com tags href ou usar jquery e usar
fonte
Esta é a maneira mais simples.
Digamos, este é o
div
bloco que eu quero tornar clicável:Então
href
, faça o seguinte:Apenas considere o
div
bloco como um elemento html normal e ative ahref
tag usual .Funciona no FF pelo menos.
fonte
Embora eu não recomendo fazer isso sob nenhuma circunstância, aqui está um código que transforma um DIV em um link (nota: este exemplo usa jQuery e determinadas marcações são removidas por simplicidade):
fonte
Uma opção que não foi mencionada está usando o flex. Ao aplicar
flex: 1
àa
tag, ela se expande para caber no contêiner.fonte
Eu puxei uma variável porque alguns valores no meu link mudarão dependendo do registro do qual o usuário está vindo. Isso funcionou para testar:
e isso também funciona:
fonte
Minhas calças espertas respondem:
"Resposta evasiva a:" Como tornar um elemento de nível de bloco um hiperlink e validar no XHTML 1.1 "
Apenas use HTML5 DOCTYPE DTD. "
Na verdade, não é verdade para ie7
onclick="location.href='page.html';"
Funciona IE7-9, Chrome, Safari, Firefox,
fonte
se tudo pudesse ser assim tão simples ...
pense um pouco fora da caixa ;-)
fonte