【问题标题】:Are you allowed to nest a link inside of a link?是否允许在链接中嵌套链接?
【发布时间】:2012-04-10 14:14:39
【问题描述】:

这可能看起来很基本,您可以在链接中放置链接吗?见下图:

我试图让整个灰色条可点击去某个地方,但如果用户点击滚轮或移动箭头,它们就是其他链接。查看我当前的代码:

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

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

【问题讨论】:

标签: html css


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    简单回答问题:No

    话虽如此,这是一个纯粹的 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>

    【讨论】:

    • 给未来用户的注意事项:.inner 必须始终是内部链接正上方的元素 - 无论它相对于 .block 嵌套多远
    • 我不需要 z-index 属性
    【解决方案3】:

    虽然我完全同意所选的答案,是的,您不应该在 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);
        });
    

    我希望这可以帮助遇到同样问题的人。 ;)

    【讨论】:

      【解决方案4】:

      虽然从技术上讲不是问题的答案,但另一种解决方法是将点击事件绑定到 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;
      });
      

      【讨论】:

      • 请注意,这会阻止用户在新标签页中打开链接。
      【解决方案5】:

      将嵌套链接包裹在对象标签内:

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

      【讨论】:

      • 我建议您在应用此 hack 后检查您的性能。我们将它添加到应用程序中,后来发现我们的页面速度得分下降了。事实证明,像这样包装链接是我们案例的原因。
      • @sasha 你能详细说明一下吗?为什么?你是怎么解决的?
      【解决方案6】:

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

      使用@mikevoermans HTML格式如下图并绑定点击事件

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

      【讨论】:

        【解决方案7】:

        直接来自 W3C 的 HTML4:

        12.2.2 嵌套链接是非法的

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

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

        HTML 5

        对于HTML5 it is a little different

        您不能在 A 元素中包含 Interactive Content互动内容包括锚标记。

        【讨论】:

        • 感谢您提供的链接,内容丰富且直接! FWIW,即使它无效,我测试过的每个浏览器(Firefox 26、Chrome 34、IE8+)实际上都允许您嵌套链接标签而不会产生影响——没有插入隐式结束标签。不过,这有点争议——我认为嵌套链接指向不同 URL 的用户体验很难理解,永远不应该这样做。
        • 澄清一下:HTML5 锚标签不能包含锚标签,即使是非交互式内容的锚标签(即没有 href 属性的锚标签)。
        • @Jonz 快进几年——Mac 上的 Chrome 版本 59.0.3071.115 会在锚嵌入另一个锚时调整 HTML...
        【解决方案8】:

        我会重新设计它,使它更像这种格式:

        <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 设置,包括背景图片,但这不利于可访问性。)
        • 为什么空的 a 元素不利于可访问性?我经常使用它来减少 HTML 请求和 Sprites。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 2021-09-26
        • 2018-06-20
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        相关资源
        最近更新 更多