是否允许将链接嵌套在链接内?


71

这似乎很基本,您是否可以将链接放在链接内?请参见下面的图片:

在此处输入图片说明

我试图使整个灰色条都可单击以转到某个地方,但是如果用户单击滚轮或移动箭头,则它们是其他链接。查看我当前的代码:

<a href="#" class="sp_mngt_bar">
    <h1><?php echo $v; ?></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>

这是一个好习惯吗?我做错了吗?你会怎么做?谢谢您的帮助!


而不是那个,块级<h1>肯定放错了<a>
deceze

3
@deceze:在HTML5中不再可用。
BoltClock

1
关键是什么,为什么不只是在链接中包装h1而不是在链接中包装孔,而要让其他两个项目采用不同的链接
SpYk3HH 2012年


Answers:


75

直接来自W3C for HTML4:

12.2.2嵌套链接是非法的

由A元素定义的链接和锚点不得嵌套;A元素不得包含任何其他A元素。

由于DTD将LINK元素定义为空,因此LINK元素也不能嵌套。

HTML 5

对于HTML5来说有点不同

您不能在A元素中包含交互式内容交互式内容包括锚标记。


1
感谢您的链接,非常有用和直接!FWIW,即使它无效,我测试过的每个浏览器(Firefox 26,Chrome 34,IE8 +)实际上都允许您嵌套链接标签而不会产生反响-没有插入隐式的结束标签。但是,这是一个有争议的问题-我认为具有导致不同URL的嵌套链接的UX太难理解了,永远不要这样做。
Jon z

1
需要澄清的是:HTML5锚标记不能包含锚标记,甚至不能包含非交互式内容的锚标记(即没有href属性的锚标记)。
fzzfzzfzz

2
@Jonz快进了几年–如果将锚点嵌入另一个锚点,则Mac上的Chrome版本59.0.3071.115会调整
HTML。– ngoue

54

简单回答这个问题:不。

话虽如此,这是一个纯html / css解决方法:

https://codepen.io/pwkip/pen/oGMZjb

.block {
  position:relative;
}

.block .overlay {
  position:absolute;
  left:0; top:0; bottom:0; right:0;
}

.block .inner {
  position:relative;
  pointer-events: none;
  z-index: 1;
}

.block .inner a {
  pointer-events: all;
}
<div class="block">
  <a class="overlay" href="#overlay-link"></a>
  <div class="inner">
    This entire box is a hyperlink. (Kind of)<br><br><br><br>
    <a href="#inner-link">I'm a W3C compliant hyperlink inside that box</a>
  </div>
</div>


1
这很棒。也感谢您发布Codepen。我特别喜欢这是如何有效的html。
Millar248 '18

4
出色的解决方案-如果我可以给此票超过1票,我会的!
史蒂夫·艾农

未来用户请注意:.inner元素必须始终是内部链接上方的元素-不管它相对嵌套有多远.block
Raven

我不需要z-index属性
ruediste

20

将嵌套链接包装在object标签内:

<a href="#" class="sp_mngt_bar">
    <h1><?php echo $v; ?></h1>
    <object><a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a></object>
    <object><a href="#" class="t_icons t_icons_move sp_mngt_move"></a></object>
</a>

6
我建议您在应用此技巧后检查您的性能。我们将其添加到了应用程序中,之后不久发现页面速度得分下降了。事实证明,像这样包装链接是我们的原因。
Sasha Kastsiushkin

@sasha你能详细说明吗?为什么?您是如何解决的?
恩里科

4

我将对其重新设置样式,使其更像这种格式:

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>

a元素中应该有一些内容。尽管形式正确,但空a元素不利于可访问性。(我想这个想法是它们具有包括背景图像的CSS设置,但这对可访问性不利。)
Jukka K. Korpela 2012年

为什么空元素不利于可访问性?我经常使用它来减少HTML请求和Sprites。
denislexic 2012年

4

尽管我完全同意所选的答案,是的,但是您不应该在A元素中包含交互式内容,有时您可能需要解决此问题的方法。

这是一个示例,您需要在A标签内放置一个交互式元素。右上方的小关闭按钮。

A标签中的互动元素

这是HTML。(这不是实际的版本,我简化了一点)

<a href="#">
    <span class="hide">X</span> <!-- THIS IS THE SMALL 'X' WHICH HIDES THE WHOLE BOX -->
    <img src="images/camera.svg" width="50" alt="Camera" />
    <em>
        Upload a profile picture
        <small>
            Here's the deal. Make your profile look awesome and even get 25 karma for it. We're not kidding.
        </small>
    </em>
    <strong>
        + 25 K
    </strong>
</a>

因此,基本上,我们希望在用户单击“ X”时隐藏此框。否则,它应该像简单的A标签一样工作。这是完成技巧的jQuery。

$('.hide').click(function(e) {
        e.preventDefault();
        e.stopPropagation(); // THIS IS THE KEY PART

        // DO WHATEVER YOU WANT, I FADED OUT THE BOX FOR EXAMPLE
        $(this).parent().fadeOut(300);

    });

我希望这对遇到同样问题的人有所帮助。;)


1

嵌套链接是非法的。要实现与嵌套链接相同的行为,可以执行以下操作:

如下所示,使用@mikevoermans HTML格式并绑定click事件

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a> 
</div>

您的点击事件应如下所示:

$(".sp_mngt_bar").bind("click", function(e) {   
    var target = $(e.target);
    if(target.has('.t_icons_settings') { //Do something for settings } 
    else if(target.has('.t_icons_move') { //Do something for move }
    else { //Do something for sp_mngt_bar
});

1

从技术上讲,这并不是问题的答案,但另一个解决方法是将click事件绑定到spandiv

<a href="outer-link">
  Outer Link
  <span class='inner-link'>Inner Link</span>
</a>

$('.inner-link').click(function (e) {
    // Prevent the click-through to the underlying anchor
    e.stopPropagation();

    // Go to a link
    window.location.href = 'page.html';
    // Or call a javascript method
    doSomething();

    return false;
});

1
请注意,这会阻止用户打开新选项卡中的链接。
cdauth

0

一种解决方案是将链接绝对定位在父链接容器内部

<div style="position: relative">
  <a href="#">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <div id="placeholder" style="height: 24px">
  </a>
  <div style="position: absolute; bottom: 0">
    <a href="#"></a>
  </div>
</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.