在我的随机测试中,我发现了一个行为,即我将一个锚点标签放在另一个锚点标签内部。我制作了jsfiddle示例。
<a class="groupPopper">
<a class="name"> content</a>
</a>
但是在开发者工具中,它看起来不同:
我认为我们不能把一个锚标签放在另一个锚标签里,因为点击内部锚标签将会将点击事件冒泡到父级锚标签中,这是不允许的。
我的假设正确吗?
正如@j08691所描述的,HTML语法不允许嵌套的a
元素。 HTML规范没有说明原因,只是强调了这个规则。
从实际角度来看,浏览器在它们的解析规则中有效地执行此限制,因此与许多其他问题不同,违反规范就行不通。解析器有效地将打开的a
元素内部的 <a>
开始标记视为隐含终止打开元素,然后才开始一个新的元素。
因此,如果您编写<a href=foo>foo <a href=bar>bar</a> zap</a>
,您将无法获得嵌套的元素。浏览器会将其解析为<a href=foo>foo</a> <a href=bar>bar</a> zap
,即两个连续的链接,后面跟一些纯文本。
嵌套的a
元素本质上并没有任何不合逻辑:可以实现为单击“foo”或“zap”激活外部链接,单击“bar”激活内部链接。但我认为没有理由使用这样的结构,HTML的设计者可能也没有看到,因此他们决定禁止它,从而简化了事情。
(如果您真的想模拟嵌套链接,则可以使用普通链接作为外部链接,使用带有适当事件处理程序的span
元素作为内部“链接”。或者,您可以复制链接:<a href=foo>foo</a> <a href=bar>bar</a> <a href=foo>zap</a>
。)
A元素定义的链接和锚点不能嵌套,A元素不得包含任何其他A元素。
href
值的实际链接嵌套起来似乎完全没有意义。 - j08691我遇到了与@thinkbonobo相同的问题,并找到了一种不需要JavaScript的解决方法:同样的问题
.outer {
position: relative;
background-color: red;
}
.outer > a {
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
}
.inner {
position: relative;
pointer-events: none;
z-index: 1;
}
.inner a {
pointer-events: all;
}
<div class="outer">
<a href="#overlay-link"></a>
<div class="inner">
You can click on the text of this red box. It also contains a
<a href="#inner-link">W3C compliant hyperlink.</a>
</div>
</div>
关键在于创建一个覆盖整个 .outer
div 的锚点,然后给内部 div 中的其他锚点一个正的 z-index
值。全部功劳归功于 https://bdwm.be/html5-alternative-nested-anchor-tags/
<a><object><a></a></object></a>
<div class=panel onclick="alert('We\'ll hi-ii-ii-ide')">
If you say run<br>
<button onclick="app.hitMe(event)">more</button><br>
<br>
And if you say hide...<br>
</div>
这是无效的HTML。
你不能嵌套 a
元素。
因此,根据定义,行为未定义。
a
元素有什么意义?它可能意味着什么? - Oded我知道这是一篇旧帖子,但我想指出user9147812的答案比其他建议都更好。
这就是我如何堆叠整个东西的方法。
<style>
* {
padding: 0;
margin: 0 border:0;
outline: 0;
}
.outer_anchor {
display: inline-block;
padding: 5px 8px;
margin: 2px;
border: 1px solid #252632;
border-radius: 3px;
background: #1c1d26;
color: #fff;
text-shadow: 0 1px 0 #616161;
box-shadow: 1px 1px 3px #000;
transform: translateY(0);
transition: background 250ms;
}
.inner_anchor {
display: inline-block;
padding: 5px 8px;
margin: 2px;
border: 1px solid #252632;
border-radius: 3px;
background: #1c1d26;
color: #fff;
transform: translate(0px);
}
.inner_anchor:hover {
background: #647915;
}
</style>
<a href="#">ItemX<object><a class="elim_btn" href="#" title='Eliminate'>×</a></object></a>
您不能嵌套'a'标签。相反,将外部容器设置为'position:relative',第二个'a'设置为'position:absolute'并增加其z-index值。您将获得相同的效果。
<div style="position:relative">
<a href="page2.php"><img src="image-1.png"></a>
<a style="position:absolute;top:0;z-index:99" href="page1.php"></a>
</div>
.outer {
position: relative;
background-color: red;
}
.outer > a {
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
}
.inner {
position: relative;
pointer-events: none;
z-index: 1;
}
.inner a {
pointer-events: all;
}
<div class="outer">
<a href="#overlay-link"></a>
<div class="inner">
You can click on the text of this red box. It also contains a
<a href="#inner-link">W3C compliant hyperlink.</a>
</div>
</div>
a > div > a
,Chrome 和 Firefox 都能够按照我编写的方式存在,并且它们在解析过程中不会将其重组(我还未测试 Edge)。 - trusktra > div > a
这样的结构也会被转换成 <a></a><div><a></a></div>,所以浏览器确实不允许嵌套链接(即使中间有个 div)。 - G. Egli