SVG foreignObject behaves as though absolutely positioned in Webkit browsers
我正在HTML文档中使用SVG。出于某些原因,在Chrome中,任何 元素中的任何内容都显示在 元素的父元素的左上角;好像 元素是绝对定位的。我在Firefox中没有这个问题。
是什么原因造成的?我该如何解决?
这是我的测试用例:(示例也在JsFiddle上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
<!DOCTYPE html>
<html>
<head>
SVG bug in Chrome?
<style type= "text/css" >
code {
background : #FFFAEE ;
}
pre code {
display : block ;
}
.widget-body {
background : yellow ;
position : relative ; /* This is the problem! */
}
</style>
<body>
SVG bug in Chrome?
<p> <center> [ wp_ad_camp_2] </center> </p> <p>
The elemts in the <foreignObject> are not positioned properly unless the <wyn> .widget-body</wyn> rule is changed to:
[ cc lang = "css" ] .widget-body {
background : yellow ;
/* position: relative; /* This is the problem! */
position : static ;
}
这个例子:
<外国对象指针事件=" fill" width =" 300" height =" 350">
<身体>
我的窗口小部件标题 span>
这个黄色正方形的位置 应该大约(100,200)
这个红色方块 应该在黄色方块的右下角 。
td>
tr>
tbody>
table>
body>
foreignobject> g>
g>
svg>
body>
html>
code> pre>
我期望看到的(这是我在FireFox中看到的)是:
我在Chrome(Fedora和Android平板电脑上为15.0.874.121)中得到的是:
我对HTML内容的控制极小,因为我同时将JavaScript框架用于丰富的应用程序和预先存在的小部件。
Chrome中的错误?您可以在问题中添加一个简单的测试用例吗?
哇!我实际上问过这个问题吗?完全忘了! @robertc-我将尝试创建一个测试用例。
@robertc-添加了示例/测试用例。
对我来说很好。但是我有dev 版本的chrome。 17.0.942.0 dev-m 您使用什么版本?可能是您版本中的这个错误?
@antyrat-版本15.0.874.121。听起来对我来说是个好消息;未来版本的Chrome可能没有此问题! :D
@RichardJPLeGuen:我在Ubuntu 10.04.3 LTS上具有Chrome 15.0.874.121,它可以正确显示。
@DanCruz-图片还是没有发生! :P我在Fedora和Ubuntu中都尝试过,但遇到了同样的问题;您介意提供屏幕截图吗?
@antyrat-我刚安装了Chrome 17.0.942.0 dev ,但仍然遇到相同的问题。 ?我在Fedora14中...你呢?
@Richard JP Le Guen-我使用Windows7。也许这是操作系统特定的问题...
Windows 7上的Chrome 15.0.874.121 m没问题
超级奇怪-我在Windows和Linux中都看到了这一点!
此问题不是特定于Chrome的,因为我可以在适用于Macintosh的Chrome 15.0.874.121和Safari 5.1.2中重现该问题。 (它也发生在旧版的Firefox for Mac(例如3.6.8版)中,但是在当前版本中该行为是正确的。)此当前未解决的Webkit错误很可能是造成此问题的原因。 全局坐标被错误地用于foreignObject内的元素,这意味着当使用绝对定位时,这些元素相对于主文档流而不是foreignObject容器放置,因此SVG转换不适用于这些元素。
我无法找到此问题的一般解决方案。
对于此特定示例,这将修复所有上述浏览器中的布局:
1 2 3 4 5
.widget {
position : relative ;
left : 100px ;
top : 200px ;
}
jsfiddle上的演示。
这些问题实际上是我重点关注的问题。老实说,我什至没有意识到红色盒子是不同的形状! :P我的问题是,黄色框应该没有向上移动,并且不应与左边距齐平。至于标题,实际上没有此规则就在正确的位置;添加此规则(非常类似于我的.widget-body { position: relative; } 如何打破黄色框的行为)会使标头出现相同的错误行为。
(找到了完整的解决方案,Ive删除了将标题与框的其余部分重新组合的示例。它稍微破坏了评论历史记录,但是比保持所有编辑可见,因此给出了更清晰的答案。)
进一步修订...可以肯定的是,它确实很钉。 :)
当然可以达到预期的结果...但是我有几个小部件正遭受这个问题的困扰。 ID必须使所有这些小部件上的 元素转换与CSS属性保持同步。
问题是您在总体上不兼容使用translate(100,200)和position:absolute在红色元素上。 position:absolute将元素和相对于正常流所定位的父元素移出法线流,因此它们没有应用平移。实际上是否有必要绝对定位此元素?
为什么它们不兼容?您是说"根据规范不兼容"吗?该Webkit是在做错事还是Firefox在做错事?
抱歉,我的语言比较宽松。我只是在Webkit浏览器当前实现的上下文中表示"不兼容",根据Ive链接到的错误报告,该行为被认为是错误的行为...
感谢您的悬赏!在修补Webkit之前,如果您设法找到了针对该问题的更通用解决方案,我会很想知道。
确实-但似乎令人怀疑。非常感谢您找到WebKit门票!
绿色勾号-最终,我能够捕捉到移动/调整大小的事件并使用相对位置重新放置事物,就像您说的那样。
...尽管我必须定位 中的 元素,而不仅仅是.widget
这可能只是一个旧答案,并且新的Chrome / WebKit更新(根据Chrome 65)可能已更改,但此答案似乎不再对我有用。 jsfiddle的行为也很奇怪-当我注释掉position:relative 时,文本不会居中,尽管看起来-根据html / css-应该。
position: fixed; 为我解决了这个问题。
已修复,但引起了新问题:z-index
邓肯·巴贝奇(Duncan Babbages)解决方案仍然没有为我工作,但奇怪的是,它确实起作用了,并且没有像我期望的那样吊到角落!但是,与@AiShiguang达成共识,它的确会在Chrome中引起z-index问题-尽管在FireFox中仍然可以正常工作,而没有z-index问题。
这也为我解决了