将div放入锚中是否正确?

Tom*_*Tom 506 html

我听说将一个块元素放在内联元素中是一个HTML罪恶:

<a href="http://www.mydomain.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>
Run Code Online (Sandbox Code Playgroud)

但是,如果你display:block在样式表中设置外部锚点的样式呢?还是错吗?块级和内联元素的HTML 4.01规范似乎这样认为:

样式表提供了指定任意元素的呈现的方法,包括元素是呈现为块还是内联.在某些情况下,例如列表元素的内联样式,这可能是合适的,但一般来说,不鼓励作者以这种方式覆盖HTML元素的传统解释.

有没有人对此问题有任何进一步的提示?

Nic*_*itz 718

根据您要使用的HTML版本:

  • HTML 5声明<a>元素"可以围绕整个段落,列表,表格等,甚至整个部分,只要在其中没有交互式内容(例如按钮或其他链接)".

  • HTML 4.01指定<a>元素只能包含内联元素.A<div>块元素,因此它可能不会出现在<a>.

    当然,您可以自由地设置内联元素的样式,使其看起来像一个块,或者确实是一个块的样式,以便它以内联方式呈现.术语inlineblockHTML中的使用是指元素与文档的语义结构的关系,而CSS中的相同术语更多地与元素的视觉样式相关.如果你以一种块状方式显示内联元素,那很好.

    但是,当CSS不存在时,您应该确保文档的结构仍然有意义,例如通过屏幕阅读器等辅助技术访问时 - 或者实际上在强大的Googlebot检查时.

  • 我打算放弃在项目中执行此操作的可能性,直到我阅读关于HTML5的最后一行,这很有用,谢谢. (61认同)
  • Mozilla开发者网络(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)反映了HTML5 <a>元素现在支持流内容元素,如<div>,<ul>或<table>. (16认同)
  • 在HTML5下,*a*元素被归类为*transparent*,这意味着它只能包含*flow*元素(read*default = block*),如果*a*元素的父元素可以包含*flow*元素.否则,仅允许*phrasing*元素(read*default = inline*).因此,如果*a*是*形式*或*div*,它可以包含*div*,但在*p*内,它不能.见http://www.w3.org/TR/html-markup/terminology.html (10认同)
  • 在http://www.w3.org/TR/REC-html40/sgml/dtd.html上有4.01的DTD.A可以包含%inline%; %inline%是一堆不同的东西(你可以按照链接),但DIV不在其中.因此,内部具有DIV的A不是XML可验证的.我认为DTD很好地表达了委员会的意图,所以我会说:不. (4认同)
  • @Ewan:我的回答中的第一个链接是HTML 4.01的相关部分. (2认同)
  • `<!ELEMENT A - - (%inline;)* - (A)`具体来说,规范的`(%inline;)*`部分只包含内联元素.有关阅读DTD文档的更多信息:http://www.w3schools.com/dtd/dtd_elements.asp (2认同)
  • 我发现在`<a>`标签中包装块级元素的一个缺点是,它可能使得难以或不可能在这些元素中选择文本. (2认同)

Elo*_*off 79

不,它不会验证,但是它通常可以在现代浏览器中使用.话虽这么说,在你的锚中使用一个跨度,并display: block在它上面设置,这肯定会在任何地方工作,它将验证!

  • @Hugo:看来HTML4中的限制是语义的,而不是表现性的.从语义上讲,`<div>`是块级的,而`<span>`是内联的,即使文档附带的CSS另有规定. (22认同)
  • @hugo技术上是否重要? (20认同)
  • 如果设置`display:block`,从技术上讲,它不是一个块元素吗? (7认同)
  • 好吧,HTML 4.01指定`a`元素可能只包含内联元素.如果将`span`元素设为块元素,从技术上讲,它不应该在锚点内. (5认同)

Ewa*_*odd 29

W3C文档不使用像错误罪恶这样的概念,但它确实使用那些提供手段,可能适当沮丧的概念.

实际上,在第4节的第 2段中,4.01规范将其单词逐条列举如下

本文件中的关键词"必须","不得","必须","应该","不应该","应该","不应该","推荐","可以"和"可选"按照[RFC2119]中的描述进行解释.但是,为了便于阅读,这些词在本说明书中并未以全部大写字母出现.

考虑到这一点,我认为最终的陈述是在7.5.3块级和内联元素中,它表示

通常,内联元素可能只包含数据和其他内联元素.

条件"通常"似乎引入了足够的歧义,说HTML 4.01确实允许内联元素包含块元素.

当然,CSS2有一个显示属性值,内联块,似乎适合您描述的目的.我不确定它是否得到广泛支持,但似乎有人预料到需要这种行为.

这里的DTD似乎不太宽容,但DTD文本遵循规范:

HTML 4.01规范包含无法在DTD中表达的其他语法约束.

在另一个注释中,您建议您通过将其包装在锚点中来激活块.我不相信HTML禁止这一点,CSS明确允许它.因此,为了回答关于它是否正确的标题问题,我说是的.按照标准,它有时是正确的.

  • 我同意Rob - Stack Overflow用于编程.在我看来,HTML/CSS肯定是编程的. (6认同)
  • 在你提到doctype之前,你有我. (2认同)
  • 我的看法是没有"投票关闭属于doctype.com"选项(也不应该). (2认同)

Kie*_*nHT 23

2023 年 9 月更新:最新 HTML5 版本

这是我从他们的网站上获取的示例:

<a href="/components/badge">
  <div class="mat-list-item-content">
    <div mat-ripple="" class="mat-ripple mat-list-item-ripple"></div>
    <div class="mat-list-text"></div>
  </div>
</a>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的 2022 年更新。很高兴知道这一点。不过,将 div 放在内联元素中仍然感觉很错误...... (2认同)

小智 13

使用HTML5规范......现在可以将块级元素放在内联元素中.所以现在把'div'或'h1'放在'a'元素中是完全合适的.

  • 仅在 *flow* (默认 = *block*) 元素或 *transparent* 元素(如 *a*)内,其父元素允许 *flow* 元素。例如,*p* 不允许 *flow* 元素(如 *div*),而只允许 *phrasing* 元素(默认 = *inline*),因此 *p* 内的 *a* 不能包含 *div *. 但是,*div* 内的 *a* 可以包含 *p*s、*div*s 或任何其他 *flow* 元素。 (3认同)

Gre*_*reg 6

你不能把<div>里面<a>-它不是有效的(X)HTML。

即使您使用 display: block 为 span 设置样式,您仍然不能在其中放置块级元素:(X)HTML 仍然必须遵守 (X)HTML DTD(无论您使用哪个),无论 CSS改变事物。

浏览器可能会根据您的需要显示它,但这并不正确。


Bee*_*pye 6

块级元素<div>可以用<a>HTML5 中的标签包装。尽管 a<div>被认为是流内容容器/包装器,并且根据MDN<a>被认为是流内容。从语义上讲,创建充当块级元素的内联元素可能会更好。


Eug*_*gen 5

如果您想避免将 div 放置在锚标记内的语义麻烦,只需将锚标记放置在与 div 相同的水平上,将它们全部用一个带有位置:相对的容器包裹起来,使您的锚标记位置:绝对并将其扩展为填充容器。另外,如果它不在内容流的末尾,请确保在其中添加 z 索引以将其放置在内容上方。

按照建议,我添加了标记代码:

<div class="div__container>
  <div class="div__one>
  </div>
  <div class="div__two">
  </div>
  <a href="#"></a>
</div>
Run Code Online (Sandbox Code Playgroud)

和CSS:

.div__container {
  position: relative; 
}
.div__container a {
  position: absolute;
  top: 0;
  bottom: 0;      
  left: 0;
  right: 0;
  z-index: 999;
}
Run Code Online (Sandbox Code Playgroud)