将 div 制作成链接

Make a div into a link

提问人:EE. 提问时间:4/28/2009 最后编辑:Gilles 'SO- stop being evil'EE. 更新时间:9/20/2023 访问量:796159

问:

我有一个块,里面有一些我不想改变的花哨的视觉内容。我想让它成为一个可点击的链接。<div>

我正在寻找类似的东西,但这是有效的 XHTML 1.1。<a href="…"><div> … </div></a>

css html xhtml 锚点

评论

83赞 Simon_Weaver 3/3/2011
一个很好的理由是 div 中的背景图像
4赞 Miguel 5/1/2014
根据得票最多的答案,我有一个很好的工作示例。在这里检查小提琴
9赞 Juan A. Navarro 8/8/2014
在 HTML5 中,在 .diva

答:

75赞 jjnguy #1

需要一点 javascript。 但是,你的将是可点击的。div

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

评论

13赞 Arve Systad 4/28/2009
不过,这会导致页面上的语义不好,所以即使技术上是可行的,我也会避免这样做。
2赞 allyourcode 10/31/2009
我考虑过使用这个解决方案,但它有点丑陋。我喜欢涉及显示的解决方案:更好地阻止。
13赞 WhyNotHugo 6/16/2012
这看起来像一个链接,但不是真正的链接。它有严重的可用性和可访问性问题,是一个非常讨厌的解决方案。
2赞 Arman Hayots 8/29/2013
最佳解决方案。我们只需要运行脚本并将“this”发送给它。
5赞 BAR 10/30/2014
如果他们没有启用 js,您将失去功能。以及对SEO不利。
284赞 Soviut 4/28/2009 #2

你不能使 a 链接本身,但你可以使标签充当 ,与 a 的行为相同。div<a>block<div>

a {
    display: block;
}

然后,您可以设置其宽度和高度。

评论

13赞 jjnguy 4/28/2009
但是,这不会使“div”成为链接。它使链接成为块元素。这有点不同。
1赞 4/28/2009
这是您的问题的解决方案。因为你可以修改div,可以像超链接一样点击,但你不能设置cursor(=hand)在所有浏览器中显示(只有IE支持它!
3赞 Arve Systad 4/28/2009
jjnguy:怎么样?我不喜欢在链接中包含大量内容,但这也可以是导航菜单或类似内容的一部分。锚元素 (<a>) 不一定是纯文本,是吗?以哪种方式将其变成块是错误的?它在语义上是正确的,可以根据需要显示它。
23赞 Traingamer 4/29/2009
这是对一个模糊问题的完美有效解决方案。您实际上可以简单地将锚元素包裹在 div 周围,但这在语义上是不正确的。(内联元素中的块元素)。
3赞 Soviut 4/29/2009
jjnguy:这是很常见的做法。我并不是说用链接替换 divs,但从问题的声音来看,他只是想要一个可以像按钮或其他东西一样点击的块。
24赞 Calvin 4/28/2009 #3

这是实现您想要的“有效”解决方案。

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

但最有可能的是,您真正想要的是将标签显示为块级元素。<a>

我不建议使用 JavaScript 来模拟超链接,因为这违背了标记验证的目的,而标记验证的目的最终是为了促进可访问性(按照适当的语义规则发布格式良好的文档可以最大限度地减少同一文档被不同浏览器以不同方式解释的可能性)。

最好发布一个不进行验证的网页,但可以在所有浏览器(包括禁用了 JavaScript 的浏览器)上正确呈现和运行。此外,using 不会为屏幕阅读器提供语义信息,以确定 div 是否用作链接。onclick

0赞 Brian David Berman 5/8/2009 #4

虽然我不建议在任何情况下都这样做,但这里有一些代码可以将 DIV 变成链接(注意:此示例使用 jQuery,为简单起见,删除了某些标记):

<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赞 Soviut 5/8/2009
同样,这是一个功能性解决方案,但并不真正符合原始问题的精神,即 XHTML 解决方案。虽然没什么大不了的,但你的回答确实开始给问题增添噪音。
-4赞 philipp 12/2/2009 #5

如果一切都能这么简单......

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

只是想一想,跳出框框;-)

4赞 Drake 8/11/2010 #6

我知道这篇文章很旧,但我只需要解决同样的问题,因为简单地编写一个显示设置为阻止的普通链接标签并不能使整个 div 在 IE 中可点击。因此,解决这个问题比使用 JQuery 要简单得多。

首先让我们了解为什么会发生这种情况:IE 不会使空的 div 可点击,它只会使该 div/a 标签中的文本/图像可点击。

解决方案:用 bakground 图像填充 div 并将其隐藏起来。

如何? 你问好问题,现在听好。 将此 Backround 样式添加到 A 标记中

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

有了它,整个 div 现在都可以点击了。这对我来说是最好的方法,因为我将它用于我的照片库,让用户在图像的一半上向左/向右移动,然后放置一个小图像,只是为了视觉效果。所以对我来说,无论如何我都使用左右图像作为背景图像!

评论

0赞 MDCore 12/6/2010
谢谢!我需要在图像上模拟一个带有空锚点的图像映射,而 IE 只允许您在有内容时单击。这解决了它。
782赞 thepeer 8/16/2010 #7

来到这里是希望找到比我更好的解决方案,但我不喜欢这里提供的任何解决方案。我想你们中的一些人误解了这个问题。OP 希望使充满内容的 div 表现得像链接。这方面的一个例子是Facebook广告 - 如果你看一下,它们实际上是适当的标记。

对我来说,禁忌是:javascript(不应该只是为了链接而需要,而且 SEO/可访问性非常糟糕);无效的 HTML。

从本质上讲,它是这样的:

  • 使用普通的 CSS 技术和有效的 HTML 构建您的面板。
  • 在某处放置一个链接,如果用户单击面板,您希望该链接成为默认链接(您也可以拥有其他链接)。
  • 在该链接中,放置一个空的 span 标签(,不是 - 谢谢@Campey)<span></span><span />
  • 给面板位置:相对
  • 将以下 CSS 应用于空 span:

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

    它现在将覆盖面板,并且由于它位于标签内,因此它是一个可点击的链接<A>

  • 为面板内的任何其他链接提供 position:relative 和合适的 z 索引 (>1),以将它们置于默认 span 链接的前面

评论

13赞 Campey 11/11/2011
谢谢效果很好。如果 IE8 中出现可怕的破坏(就像他们为我所做的那样),请确保您有一个开始和关闭 span 标签 (<span...></span>),而不是空 span (<span... />)。
81赞 AlexMA 6/24/2012
对于像我这样傻傻的、误读了某些东西的人来说,这是一把小提琴,所以不得不玩一玩:jsfiddle.net/hf75B/1
7赞 bigmac 9/13/2012
你在IE9中试过这个吗?我喜欢这种方法,并且我正在使用它,但我刚刚在 IE9 中测试了它(包括 @AlexMA 中的小提琴),我看到的是您可以单击 div 中的任意位置,除了文本。当您将鼠标悬停在文本上时,光标将变为标准文本光标,当您单击文本时,它不执行任何操作。由于用户倾向于点击文本元素(并且当文本元素填满大部分 div 时),这使得该解决方案在 IE9 中无法使用。有没有人经历过这种情况或有解决方案?
2赞 villy393 10/17/2015
我被困了一段时间,发现我的包装 div 必须有 .{ position: relative }
2赞 nktokyo 3/25/2016
有谁知道如何让:hover css与这个解决方案一起使用?也许参考小提琴中的答案?
3赞 Justin 11/3/2010 #8

只需在块中包含链接并使用 jquery 对其进行增强即可。对于没有 javascript 的任何人来说,它都会 100% 优雅地降级。恕我直言,使用 html 执行此操作并不是最好的解决方案。 例如:

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

然后使用 jquery 使块可点击(通过网页设计师墙):

$(document).ready(function(){

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

});

然后你所要做的就是将光标样式添加到div

    #div_link:hover {cursor: pointer;}

为了获得奖励积分,只有在通过向 div、body 或其他任何内容添加“js_enabled”类来启用 javascript 时,才应用这些样式。

评论

0赞 m3tsys 7/26/2011
我想使用它,但我在 div 中有 2 个链接......如何修改它以便能够单击两个链接?(如果我也单击第二个链接,它目前会带我进入“mylink.html”..)
20赞 Tim 2/12/2011 #9

不确定这是否有效,但它对我有用。

代码:

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

评论

0赞 Alphabetus 10/19/2020
我不得不说,这种方法和样式表上的css类一样干净。就我而言,这是正确和最简单的解决方案。
0赞 Shahram Banazadeh 6/17/2021
这是最好的一个
87赞 aelsheikh 4/14/2011 #10

这是一个古老的问题,但我想我会回答它,因为在座的每个人都有一些疯狂的解决方案。其实很简单......

锚标签的工作方式是这样的 -

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

所以。。。

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

虽然我不确定这是否有效。如果这就是口头解决方案背后的原因,那么我道歉......

评论

9赞 4/14/2011
只要不包含任何交互式内容(其他元素、元素等),它就是有效的 HTML。<div><a><button>
54赞 thepeer 9/22/2011
您的示例不是有效的 HTML - 包含在内联元素中的块元素 - 除非您使用的是 HTML5,它为链接设置了例外。
1赞 Dmitri Nesteruk 12/28/2011
这是一个糟糕的例子,因为标签的作用是获取 a 中的所有文本并为其添加下划线......这可以通过样式来缓解,但最好的答案更好。adiv
2赞 tyjkenn 6/17/2012
a #thediv{font-weight:normal;text-decoration:none;}是你所需要的风格。
1赞 BAR 10/30/2014
尝试了这个并且它起作用了,但是它破坏了元素的定位。是的,doctype 是 Chrome 中的 HTML5(一些 2014 版本)..
10赞 Thomas Scheelhardt 11/7/2011 #11

为了使同行的答案在 IE 7 及更高版本中起作用,它需要一些调整。

  1. 如果元素没有背景色,IE 将不遵循 z-index,因此链接不会重叠包含内容的 div 部分,只会重叠空白部分。为了解决这个问题,添加了一个不透明度为 0 的背景。

  2. 由于某种原因,IE7 和各种兼容模式在链接方法中使用跨度时完全失败。但是,如果链接本身被赋予样式,它就可以正常工作。

.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>
1赞 DejanR 11/7/2011 #12

这对我有用:

<div onclick="location.href='page.html';"  style="cursor:pointer;">...</div>
1赞 jeevanism 4/12/2012 #13

这是最简单的方法。

比如说,这是我想要使可点击的块:div

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

所以把一个如下:href

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

只需将块视为普通的 html 元素并启用通常的 a 标签即可。
它至少适用于 FF。
divhref

0赞 becky 4/19/2012 #14

我拉入了一个变量,因为我的链接中的某些值会根据用户来自的记录而变化。 这适用于测试:

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

这也有效:

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

评论

1赞 becky 4/19/2012
由于某种原因,代码没有显示 我使用带有 jsp 变量的 onclick 来创建动态链接
-2赞 Karl Kelman 5/5/2012 #15

我的聪明裤子回答:

“回避答案:”如何在 XHTML 1.1 中使块级元素成为超链接和验证”

只需使用 HTML5 DOCTYPE DTD。

实际上不适用于 ie7

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

适用于 IE7-9、Chrome、Safari、Firefox、

评论

0赞 Mark 10/21/2012
他正在寻找“我正在寻找一种有效的 XHTML 1.1 方法”
9赞 wdonayredroid 8/24/2012 #16

您也可以尝试将锚点包裹起来,然后将其高度和宽度与父锚点相同。这对我非常有效。

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

评论

1赞 Nilpo 8/24/2012
您可能还需要确保父 div 的填充为零,并且 <a> 标记的边距为零。
1赞 Swarnamayee Mallia 5/30/2013 #17

您可以通过以下方法提供指向 div 的链接:

<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>
1赞 THE AMAZING 8/28/2013 #18

你可以用 href 标签包围元素,或者你可以使用 jquery 并使用

$('').click(function(e){
e.preventDefault();
//DO SOMETHING
});
25赞 Erhard Dinhobl 9/26/2013 #19

最干净的方法是将jQuery与HTML中引入的数据标签一起使用。使用此解决方案,您可以在所需的每个标签上创建一个链接。首先,使用数据链接标签定义标签(例如 div):

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

现在,您可以根据需要设置 div 的样式。您还必须为“链接”相似行为创建样式:

[data-link] {
  cursor: pointer;
}

最后把这个jQuery调用放到页面里:

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

使用此代码,jQuery将点击侦听器应用于页面上具有“data-link”属性的每个标记,并重定向到data-link属性中的URL。

评论

0赞 Erhard Dinhobl 9/26/2013
若要获取有关数据属性的信息,请参阅:ejohn.org/blog/html-5-data-attributes
4赞 joan16v 10/10/2013 #20

这个例子对我有用:

<div style="position: relative; width:191px; height:83px;">
    <a href="link.php" style="display:block; width:100%; height:100%;"></a>
</div>
52赞 MagTun 2/28/2014 #21

此选项不需要空的.gif,就像在最受好评的答案中一样:

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/ 建议

评论

1赞 Loren 1/3/2015
谢谢!Chris Jumonville 的解决方案在 Andriod 和 iPhone 上都运行良好。示例:gastateparks.org/specials
1赞 TWiStErRob 8/8/2016
难道不应该以防万一“其他一切”部分也包含隐藏在内心深处的链接吗?div.feature > a
0赞 Anthony Kal 12/29/2017
这应该是选择的答案,也适用于 Bootstrap
1赞 Steffen Cole Blake 10/9/2021
这工作得很漂亮,非常流畅,也可以很好地与屏幕阅读器配合使用,HTML5 粘附,即使你对父对象进行转换也能工作,并且本质上使光标变成指针(正如您对可单击对象所期望的那样)
2赞 Hbirjand 8/1/2014 #22

实际上,您目前需要包含JavaScript代码, 请查看本教程以执行此操作。

但是有一种棘手的方法可以使用 CSS 代码来实现这一点 您必须将锚标记嵌套在 div 标记中,并且必须将此属性应用于它,

display:block;

当你这样做时,它将使整个宽度区域可点击(但在锚标签的高度范围内),如果你想覆盖整个div区域,你必须将锚标签的高度精确地设置为div标签的高度,例如:

height:60px;

这将使整个区域可点击,然后您可以申请锚标签来实现目标。text-indent:-9999px

这真的很棘手和简单,它只是使用 CSS 代码创建的。

下面是一个示例http://jsfiddle.net/hbirjand/RG8wW/

5赞 Vamsi Pavan Mahesh 2/19/2015 #23

为什么不呢? 在 HTML5 中工作正常use <a href="bla"> <div></div> </a>

评论

0赞 Jazi 4/17/2015
它不会通过 HTML 验证。行项不能存储块项。
0赞 Jazi 4/17/2015
我的意思是,这是有效的,但事实并非如此。不应将项目类型放入项目中。标记是内联框。<div><span></span></div><span><div></div></span>display: inline;display: block;<a>
0赞 Jazi 4/17/2015
是的,它可以工作,因为您可以通过多种方式(更好或更坏)做到这一点。这个特定的解决方案不好,因为旧的 HTML 验证:)。
1赞 Todilo 8/28/2015
“较旧的 HTML 验证”不通过这个有关系吗?现在是允许的,html5 并且是有原因的,为什么不使用它呢?我认为这个解决方案很好(它确实经常需要删除 div 内容的下划线,但仍然如此)。
0赞 coredumperror 4/18/2017
@Todilo 因为 while 是有效的并且有效,是无效的并且不起作用。<a><div></div></a><a><div><a></a></div></a>
3赞 jojojohn 7/6/2016 #24

这是 BBC 网站和《卫报》上使用的最佳方法:

我在这里找到了技术:http://codepen.io/IschaGast/pen/Qjxpxo

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

这里是 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);
      }
    }
}
6赞 Jeff Schwarting 3/9/2019 #25

这对我有用:

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

这增加了一个不可见的元素(span),它覆盖了你的整个div,并且在z-index上位于你的整个div之上,所以当有人点击该div时,点击基本上被你的不可见的“span”层拦截,该层是链接的。

注意:如果您已经将 z 索引用于其他元素,只需确保此 z-index 的值高于您希望它位于“顶部”的任何值。

评论

0赞 Saif Al Falah 5/21/2019
为我工作。只是不要忘记相对定位父元素。
3赞 Phillip Chaffee 4/18/2019 #26
<a href="…" style="cursor: pointer;"><div> … </div></a>
8赞 The Codesee 5/9/2020 #27

一个没有提到的选项是使用 flex。通过应用于标签,它会扩展以适合容器。flex: 1a

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

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

0赞 saran 12/28/2021 #28

将你的包裹在锚标签内就像魅力一样:div<a href></a>

    <a href="">
      <div>anything goes here will turn into a link</div>
    </a>
0赞 Pyae 11/27/2022 #29

如果可以使用 bootstrap,一个简单的解决方案是使用 bootstrap 。.stretched-link

https://getbootstrap.com/docs/4.3/utilities/stretched-link/

示例代码

<div class="card" style="width: 18rem;">
  <img src="..." class="card-img-top" alt="...">
  <div class="card-body">
    <h5 class="card-title">Card with stretched link</h5>
    <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
    <a href="#" class="btn btn-primary stretched-link">Go somewhere</a>
  </div>
</div>
0赞 ceving 1/31/2023 #30

苏维乌特的回答对我来说还不够。我不得不使用

a { display: inline-flex; }

要删除基线工件,当仅在 .imga

0赞 ColCh 6/8/2023 #31

纯HTML和CSS案例。没有 JS。

如果您想在完全可点击的 div 中包含其他链接元素。

主要思想是拉伸主要的可点击链接,将其放在内容下方,并使用指针事件禁用对内容的点击。对于此元素内的可单击元素,请为每个元素进行设置。pointer-events: all;

现场演示:

<div style="
            width: 300px; height: 300px;
            position: relative;
            border: 1px red solid;
            pointer-events: none;
            z-index: 0;
            ">
  <h1>No wrapper</h1>
  <p>This is fully clickable div, click handled by anchor tag. It contains no wrapper</p>
  <button>Learn more</button>

  <p>See this link ➡️ <a style="pointer-events: all;" title="Why I see this ad?" href="http://example.com/">?</a></p>

  <a style="
            position: absolute;
            top: 0;left: 0;right: 0; bottom: 0;
            text-indent: -9999px;overflow: hidden;
            pointer-events: all;
            z-index: -1;
            " title="GO TO YANDEX" href="https://ya.ru">CLICK</a>
</div>

编码笔:https://codepen.io/ColCh/pen/OJaPpJQ

0赞 Redoy Kumar Das 9/20/2023 #32
 <div role="button"></div>

评论

6赞 Itération 122442 9/20/2023
避免代码只回答并提供解释。