HTML/CSS中用于整个div的超链接a href链接

180

以下是我在HTML/CSS中想要实现的内容:

我有不同高度和宽度的图片,但它们都小于180x235。因此,我想创建一个带有边框且 vertical-align: middlediv ,并将所有图片放在其中。我已成功完成了这一步骤,但现在我遇到了如何正确地为整个 div 创建超链接的问题。

这是我的代码:

<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>
请注意,为了方便在此处复制粘贴,样式代码是内联的。
我在某处读到可以简单地添加另一个父div在代码上面,然后在其中添加一个href链接。但是,根据一些研究,这不会是有效的代码。
因此,再次总结一下,我需要整个div(`#parentdivimage`)成为href链接。
12个回答

364

更新于2014年06月10日: 在HTML5中,将div放在a标签内在语义上是正确的。

您需要在以下情况之间进行选择:

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

这样在语义上是不正确的,但它可以运行。

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

这种方法在语义上是正确的,但涉及到使用JS。

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

这是语义上正确且按预期工作的,但不再是一个 div 标签。


10
没错 - <a> 标签是行内元素, <div> 标签是块级元素。把块级标签放在行内标签里是无效的,因此导致了错误。 - Surreal Dreams
2
你可以使用 span 代替 div,并使用 CSS 的 display: block; 来使其看起来符合要求且语义化。 - ajsharma
4
你只需要在<a>标签上设置display:block,它就会变成一个块级元素而不需要嵌套。 - Augie Gardner
1
HTML5允许将<div>标签嵌套在<a>标签内部。 - JacobF
3
我认为语义学与此无关。这个现在是有效和技术上正确的,但与语义无关。 - Rob
显示剩余7条评论

43

1
有趣。你能否给我一个例子,这样我就可以试一下。谢谢。 - Adil
好的,但在<div>内有另一个<a>标签的情况下不会很好地工作。 - Muhd
很棒的解决方案 - 这对于需要避免手动处理触摸的移动Safari中使用锚标签非常有效。 - Alamgir Mand

17

就像这样做:

父级 div 的图像应该具有指定的宽度和高度,其位置应该为:

position: relative;

只需要在父divimage内部,放在该父元素包含的其他div旁边:

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

然后在 CSS 文件中:

.clickable {
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  position: absolute;     
  z-index: 1;
}
标签将填满其父级块元素parentdiv,因为高度和宽度都设置为100%。由于将z-index设置得比其他元素更高,所以标签位于所有周围元素的顶部。最后,标签是可点击的,因为它在'a'标签内部。


2
在搜索了几天之后,这个解决方案终于让我 aaamazing 了! - somid3
我发现这种方法比被接受的答案更有用;在“a block”内的所有文本都会被下划线。是的,你可以通过text-decoration属性去掉下划线,但该属性不会被继承。使用你的方法,@denu,使得这变得简单。 - yapdog
是的,这就是Bootstrap在其stretched-link中使用的解决方案:https://getbootstrap.com/docs/4.5/utilities/stretched-link/。 - djibe
@denu 在我自己想出解决方案之后,我看到了你的解决方案。很高兴听听你的想法!https://dev59.com/Wm855IYBdhLWcg3wNxkM#67156294 - ADTC

4

根据Surreal Dreams所说,根据我的经验,最好样式化锚标签,但这确实取决于你要做什么。这是一个例子:

Html:

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

然后是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


3

你可以做两件事情:

  1. #childdivimage 改为 span 元素,并将 #parentdivimage 改为锚点标签。这可能需要你添加更多的样式来完善外观。这是首选方法,因为它使用语义化标记,并不依赖于Javascript。

  2. 使用Javascript将点击事件绑定到 #parentdivimage 上。在此事件中通过修改 window.location 来重定向浏览器窗口。这是 TheEasyWayTM,但不会优雅地降级。


2
在锚元素上添加"display:block"和/或"zoom:1;"。但你应该真正这样做。
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>

2
这可以用多种方法实现。 a. 在标签内使用嵌套的 标签。最初的回答。
<a href="link1.html">
   <div> Something in the div </div>
 </a>

b. Using the Inline JavaScript Method

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

最初的回答:

c. 在标签内使用jQuery

HTML:

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

jQuery:

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

选项“a”在语义上不正确,因为不允许将块元素(div、table、p等)用作内联元素(a、span、b、u、i等)的子元素。浏览器可以呈现它,但它不符合HTML规范。 - Sven

2

id="childdivimag"div改为span,并将其包裹在a元素中。由于spanimg默认为内联元素,因此这仍然有效,而div是块级元素,因此在a中包含它时无效。


是的,但这对我不起作用,因为我不想让图像成为href。我希望整个块都是href链接...将childdivimage转换为span并将其包装在a中无法实现我的目标。 - Adil

1

我只是做

onClick="location.href='url or path here'"

@ChrisClaude 我没有看到其他答案完全像这个。 - Isaac Muniz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接