把div放在锚点内是否正确?

609

我听说把块级元素放在内联元素里是HTML的大忌:

<a href="http://example.com">
    <div>
        What we have here is a problem. 
        You see, an anchor element is an inline element,
        and the div element is a block level element.
    </div>
</a>

如果在样式表中将外部锚点样式设置为display:block,会怎么样呢?这样做仍然有问题吗? HTML 4.01规范关于块级元素和内联元素似乎是这样认为的:

样式表提供了指定任意元素呈现方式的手段,包括元素是作为块级元素还是内联元素呈现。在某些情况下,例如为列表元素设置内联样式,这可能是适当的,但一般来说,作者不应该以这种方式覆盖HTML元素的传统解释。

是否有人对此问题有进一步的建议?


3
请参见:https://dev59.com/WUjSa4cB1Zd3GeqPEVA3。 - DisgruntledGoat
@DisgruntledGoat - 感谢提供链接 - 希望我早点看到它 :-) - Tom
锚点和\或链接元素是浏览器自动化控件。因此,它具有浏览器预定义的呈现和行为。然而,在 span 中包装一个真正的纯 html 元素:div 是一种罪过。A 标签不添加任何级别行为的原因是需要标记文本部分而不干扰文档流,而不是因为它们被设计为内联元素。从这个角度来看,A 是一个无用的标签。它的存在超出了问题,并不是一种罪过,但可能会导致代码丑陋和\或模糊不清。 - Bekim Bacaj
1
所有以后查看此处内容的人请注意,在HTML5中,尽管锚点标记(anchor tags)能够包含块级元素,但是它们不能包含另一个锚点标记所包含的块级元素!因为基本上来说,锚点标记不能在其内部包含其他锚点标记。您可以在这里了解更多信息:https://dev59.com/pGcs5IYBdhLWcg3wMxFF - aderchox
16个回答

2
你可以通过添加“::before”伪元素来实现这一点。
纯CSS技巧 ;)

a:before{
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1;
  pointer-events: auto;
  content: "";
  background-color: rgba(0,0,0,0);
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="card" style="width: 18rem;">
  <img src="https://via.placeholder.com/250" 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>


1
如果你要花力气制作一个 <a> 块,为什么不把 <a> 放在 div 里面呢?作为块级元素,它会给你同样的效果。

44
因为我可能希望锚点包含多个 div。 - Tom

1
如果你将其更改为块级元素,那么它就不再“错误”,但可能无法验证。但是,做你正在做的事情没有太多意义。你应该保持锚点标记作为块级元素而没有内部div,或将div放在外面。

0

我认为当人们问这个问题时,大多数情况下是因为他们只用div构建了一个网站,现在其中一个div需要成为一个链接。

我曾经看到有人使用透明的空白图片(PNG)放在锚点标签内,只是为了在div内创建一个链接,而且这个图片的大小与div相同。

其实这很可悲...但它确实有效...


-2

这是错误的。请使用span


4
ROFL意思是“大笑滚地”,“那和使用div一样”。我想我在blip.tv上看过这种做法(使用div),但正如其他人所提到的,根据规范来说是错误的。块元素=块级元素,不管是div、span或其他什么元素,都是一样的! - James Mitch

-12

仅供参考。

如果您的目标是使您的 div 具有可点击性,您可以使用 jQuery / Java Script。

定义您的 div 如下:

<div class="clickableDiv" style="cursor:pointer">
  This is my div. Try clicking it!
</div>

然后您的jQuery将被实现如下:

 <script type="text/javascript">

    $(document).ready(function () {

        $("div.clickableDiv").click(function () {
            alert("Peekaboo"); 
        });
    });
</script>

这也适用于多个div - 如Tom在此线程中的评论所述


19
太糟糕了,它无法与键盘一起使用,你无法在悬停时看到链接。它几乎像一个链接,但不是真正的链接。你也不能用鼠标中键单击它,或者像对待链接那样右键单击它。 - WhyNotHugo
1
它确实有其用途。您可以在 div 中放置一个锚点,并使 div-click 重定向到子锚点的位置。通过将光标设置为指针,您就可以获得锚点的外观和感觉,以及仅在不允许 JavaScript 或出于可访问性原因时在 div 中仅使用锚点的有效回退解决方案。您可以获得语义上和语法上正确的 HTML,而无需处理显示样式的可疑更改。 - Pedery
如果您有一个包含链接的div,您可以使用点击处理程序来捕获事件,找到锚点(确保只有一个),然后使用它。可以通过正常的锚点访问。这将允许拥有一个图像和字幕以及“阅读更多”链接的桶 - 例如。您有什么想法? - Julix

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