【问题标题】:text-decoration: apparent discrepancy between appearance and computed values文本装饰:外观和计算值之间的明显差异
【发布时间】:2019-08-27 21:07:01
【问题描述】:

我在玩与a:link around div - styling inside div 相关的代码时注意到了这一点(奇怪?)

鉴于此 HTML:

<a id="foo" href="foobar">
  <div id="bar">
    <h2 id="baz">Foo</h2>
  </div>
</a>

还有这个 CSS(添加背景颜色以显示结构):

a {
  display: block;
  padding: 20px;
  background-color: rgb(240,240,240);
}

#bar {
  width: 200px;
  height: 100px;
  background-color: rgb(220,220,220);
}

#baz {
  padding: 20px;
  text-decoration: none;
}

Fiddle


Chrome 将匹配的 CSS 规则显示为包含 text-decoration: none;,但文本确实带有下划线:


(来源:pangram.net


同样,使用 Firebug,Firefox 会为 textDecoration 计算样式返回 null


(来源:pangram.net

MDN says that text-decoration applies to all elements.

我意识到将text-decoration 属性应用于a 链接有一个简单的解决方法,但这不是我所期望的行为。谁能解释这个(明显的)差异?

编辑:我相信答案就在这里:Line Decoration: Underline, Overline, and Strike-Through

当指定或传播到一个块容器时 内联格式化上下文,装饰被传播到 包装所有流入内联级子级的匿名内联框 块容器。

但我仍然不完全明白发生了什么。

【问题讨论】:

    标签: css


    【解决方案1】:

    您可能知道,Chrome 和 Firefox 默认为超链接加下划线。

    这里发生的情况是,虽然 text-decoration#baz 上被 计算none(如您的 CSS 规则中所指定),但 used 值 结束了是 underline 是因为从其祖先 a 元素传播浏览器的默认样式。在将页面渲染到画布上时,这个使用的值替换计算值,但就 DOM 而言,计算值仍然是 none,仅基于级联分辨率。

    因此,这里的差异在于计算值和使用值之间的差异。定义见section 6.1

    这种将text-decoration 值传播到后代框中的行为独立于级联进行,在here 中进行了概述:

    当在内联元素上指定或传播到内联元素时,它会影响该元素生成的所有框,并进一步传播到分割内联的任何流入块级框(请参阅section 9.2.1.1)。

    【讨论】:

    • 事实证明,这种行为比我想象的要复杂(通常是我的情况 ;-) 仅添加 position: fixed/absolutefloat: left/right 也会删除下划线,因为它会从内联流中删除元素。 Fiddle
    • @steveax:是的,大部分内容都包含在text-decoration 的散文中,即使如此,CSS2.1 中也省略了一些部分,例如块级表。 (它们在 text-decor-3 中了吗?)
    • 我会接受这个(为什么我不惊讶 BoltClock 得到接受?)但我认为这并不是计算值和使用值之间的差异,而是由于decorations are propagated to an anonymous inline box that wraps all the in-flow inline-level children of the block container .当然足够接近了!
    • @steveax:啊,我将您的问题解释为询问为什么在已经意识到传播行为的情况下计算值和渲染值存在差异。还有,不用恭维我了;)
    • BoltClock,澄清一下,通过阅读规范,我相信text-decoration: underline 属性不适用于h2,而是适用于生成的匿名内联框。你是这么读的?
    【解决方案2】:

    “text-decoration”是'a'标签的属性......所以只需将它添加到'a'标签及其工作......请参阅演示here

    a {
      display: block;
      padding: 20px;
      background-color: rgb(240,240,240);
      text-decoration: none;
    }
    

    【讨论】:

    • -1 OP 在问题中特别指出他知道这一点。问题是为什么
    • 再说一次,这不是我的问题。重申一下:为什么浏览器会报告该元素没有文本修饰?
    • @steveax: 是的,'text-decoration' 适用于所有元素......但是在 steveax 提到的情况下,'text-decoration' 样式指的是 'a' 标签的默认值仅.. 参见演示 here... 该属性也适用于 h2 标签。所以解决方案是仅设置“a”标签的样式...
    • 有趣的小提琴。它确实表明text-decoration: underline 属性来自h2 上的属性以外的其他地方
    【解决方案3】:

    您需要将text-decoration: none 放在a 链接上以删除下划线

    fiddle

    我认为下划线仍然存在,因为元素位于 a 链接或 a 标记内,浏览器将其识别为链接,但元素本身没有文本装饰..

    【讨论】:

    • 是的,我在我的问题中说这是没有下划线的解决方案,但这不是我的问题。
    • -1 OP 在问题中特别指出他知道这一点。问题是为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2019-06-03
    • 2014-07-21
    • 1970-01-01
    • 2022-08-06
    • 2022-09-23
    相关资源
    最近更新 更多