前几天我发布了一张图片, 仅仅作为一个思维练习,关于如何实现“嵌套”链接。 也就是说,一个指向某个 URL 的大容器,里面包含指向另一个 URL 的较小容器或文本链接。 乍一看,这比看起来要难。 主要原因是...
<!-- this is invalid and won't render as expected -->
<a href="#one">
Outside
<a href="#two">
Inside
</a>
</a>
Eric Meyer 曾呼吁 更灵活的链接,但即使这样也不能完全处理一个链接嵌套在另一个链接中的情况。
顺便说一下,这就是该 HTML 代码的执行方式

我的第一想法是,在标记中不要嵌套链接,而是让它们在视觉上看起来嵌套。 有些人回复了这条推文,包括 Nathan Smith,他分享了同样的想法:有一个相对定位的父元素,并绝对定位这两个链接。 较大的链接可以填充整个区域,而较小的链接可以放在它的上面。
查看 Pen “嵌套”链接 由 Nathan Smith (@nathansmith) 在 CodePen 上创建。
它很挑剔,因为你需要在一定程度上使用 神奇数字 来处理间距和可变内容。
我的第二个想法是在 JavaScript 中处理它。
<div
onclick="window.location='https://codepen.io'"
style="cursor: pointer;"
tabindex="1"
>
Outside
<a href="https://css-tricks.org.cn">
Inside
</a>
</div>
我真不知道从无障碍的角度来说这是否合理。 在我看来,这很糟糕,所以我只能假设这是一个坏消息。
说到无障碍,Heydon Pickering 有 关于卡片组件的整篇文章,这是一个流行的设计模式,这种情况经常出现。 他的解决方案是使用一个相对定位的父元素,然后是一个正常放置且功能完备的主链接。 第一个链接有一个绝对定位的伪元素,它覆盖了整个卡片。 任何子链接都采用相对定位,并位于初始链接之后,因此它们可以通过 z-index
位于第一个链接的顶部。

说到堆叠伪元素,Sean Curtis 就在这里使用这种方法
查看 Pen 假装嵌套链接 由 Sean Curtis (@seancurtis) 在 CodePen 上创建。
在“巧妙”领域的其他解决方案可能是
- 使用
<form>
元素,其中action
属性充当链接。 - 使用
<object>
元素 来包装内部链接。
Sara Soueidan 回复了自己的帖子!
几年前,当我为 Smashing Magazine 打造前端基础时,遇到了同样的需求。 所以我决定以博客文章的形式写下我对 Chris 线程的回应。
Sara 对此进行了更详细、更认真的描述,所以一定要看看。 看起来她和 Heydon 都采用了几乎相同的解决方案,使用伪元素覆盖,其中包含必要时伸出的子链接。
您是否尝试过其他方法? 有很多 UX 和 a11y 要考虑!
嗯,这真是一个奇怪的要求! 首先,从哲学角度来看,这是一个 UI 问题——从视觉上(以及语义上)来说,这是不好的设计! 如果有“现实世界”的需求,请重新设计组件!(我遇到了同样的难题,这也是我评论的唯一原因)。 但是,出于学术原因……我认为您把问题复杂化了。 做这样的事情的可靠方法是使用古老的图像地图(对于那些太年轻而不知道这是什么的人:https://w3schools.org.cn/Tags/tag_map.asp)。 我没有测试过,这是理论上的,所以我不知道如果您将图像包装在 href 中并添加图像地图,会优先考虑什么,但是……备用方案是将图像本身锚定在相对正值中,然后绝对定位剪切路径“热点”(更高的 z-index)用于您的嵌套图像/链接。 老派方法。
但是为什么,为什么,为什么? :-)
“你们的科学家太关注他们是否能做到,却没有停下来思考他们是否应该做到。” - 伊恩·马尔科姆博士。
我知道这只是一个思维练习,但从用户体验的角度来看,我认为没有简单的方法来做到这一点可能最好。 造成混乱行为的可能性实在太高了。
我们最近在电讯报遇到了这个需求(再次),我们在这部分工作中拥有某种程度的绿地前端。
我们使用了 z-index 解决方案来解决分层问题,但使用 JS 来将任何给定的链接变成其祖先之一的可点击块。
因此,在没有 JS 的情况下,所有链接都按默认行为运行,而该行为和模式易于在不同上下文中重复使用,并且通过设计强制执行基本的 a11y 级别(希望如此)。 这也意味着我们可以(但希望不会)拥有嵌套的可点击块!
我稍后会尝试快速写一篇关于此的文章,回到这里,并将生产代码链接到此处……因此,可能会从大量出色的测试和反馈中获益 :)
有趣的方法。 我喜欢 Material Design 为处理卡片上的辅助操作而指定的方法,他们在 https://material.io/design/components/cards.html#actions 上展示了这些方法。
简而言之,卡片上部的 2/3 左右是卡片主要主题的主要操作空间,而卡片下部的 1/3 或 1/4 本身不可点击,但包含额外的行动号召。
忘记补充说明,卡片组件网络版本的演示在 https://material-components.github.io/material-components-web-catalog/#/component/card 上很好地展示了这种行为是如何通过制表符、触摸和鼠标实现的。
David,我喜欢 material.io 的实现。
但是……就像经常发生的那样,你得到了一位设计师(或“食物链”中更高的人)坚持认为整个卡片应该是可点击的! Grrrr。
CSS 网格可以用于此吗? 将两个链接元素作为网格的直接子元素,一个从边缘到边缘定位,另一个只占据网格的一个单元格?
当然! 那有效!
我对这种方法一直都是,温柔地试图说服客户他们想做的事情是个坏主意。 我最终还是实施了两次,一次是因为我们被聘为额外的开发人员,他们已经有了既定的模式,另一次是因为争论毫无结果。 两次都使用了绝对定位在相对父“卡片”中的伪元素。
使用嵌套元素来表示结构,并在元素内部,您可以放置链接。 任何可以嵌套的 HTML 元素都可以包含链接作为内部 HTML,并使用 CSS 来赋予其视觉吸引力。
我们在搜索结果页面也遇到了这个问题。
卡片状显示、图像、标题、摘要和一些按钮。
您应该能够点击整个卡片以查看详细信息,或者点击按钮以执行直接操作。
考虑到无障碍,我们不希望出现双链接,卡片标题必须是可点击的标题。
因此,阅读器将听到:卡片标题、按钮 1、按钮 2。 而鼠标用户仍然可以点击整个卡片或各个链接。
为此,我们在卡片中添加了一个额外的详细信息链接,并将其 tabindex 设置为 -1 以防止它成为 TAB 停留点。
然后将其定位到覆盖整个卡片,并将 z-index 设置为低于按钮。
始终要测试您的页面,看看在没有鼠标的情况下它是否仍然有意义(通过(shift-)TAB 进行导航)?
或者安装屏幕阅读器(例如 NVDA 是免费的),亲身体验一下它可能有多令人困惑;)
我对于我在https://fastmail.blog/ 上想出的方法很满意,每个博客文章的“卡片”都是
position: relative
,其中包含三个或多个不同的链接,但整个“卡片”在h2内充当链接。 这是通过在该链接上使用一个::before
来实现的,这个::before
的样式大约是position: absolute; top: 0; left: 0; right: 0; bottom: 0;
,并给其他 链接一个 z-index 使得它们可以位于其之上。 最终的结果是成功地实现了可访问性和正常使用,无需任何 JavaScript。 唯一的警告是您无法轻松地选择其他文本——但这在链接中是常见的做法,因此不是什么大问题。您可以使用 jQuery 在 DOM 中移动链接来创建嵌套链接。
使用 CSS 将外部
<a>
的 display 属性设置为 block 或 inline-block 不就能解决问题吗? 我记得以前这样做过,并且有效。我无法想象有任何浏览器能够做到这一点。 并不是说你不能设置这个属性,而是 DOM 会把内部的链接踢出去。 试试看。