为什么我的svg上有100%的垂直滚动条?

Jan*_*Jan 14 html5 svg google-chrome fullscreen internet-explorer-9

有人可以解释为什么我在Chrome和IE9中看到一个带有以下标记的垂直滚动条:

<!DOCTYPE html>
<html>
  <head>
    <title>Fullscreen SVG</title>

    <style>
      html,body {
        margin: 0px; padding: 0px;
        width: 100%; height: 100%;    
      }

      .fullscreen {
        width: 100%; height: 100%;
      }
    </style>
  </head>
  <body>
    <svg class="fullscreen"></svg>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

如果我用div替换svg它可以很好地工作.但是如果我把svg放在那个div中,那么布局会再次被打破:

<div class="fullscreen">
  <svg></svg>
</div>  
Run Code Online (Sandbox Code Playgroud)

将doctype更改为XHTML似乎可以解决问题:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

但是内联SVG是HTML5的一部分,所以......

与此同时,我还提交了一份错误报告.

小智 25

我在这里有点晚了,但当我试图解决另一个问题时,我偶然发现了这一点.

我不认为你遇到的是一个错误.默认情况下,SVG标记是内联元素(对于记录,IMG标记也是如此),DIV被视为块元素.我在这里被抛弃了一点,因为你不应该为内联对象设置高度/宽度(如果你试图在SPAN上执行此操作,则忽略高度/宽度).

您可能会考虑另一种解决方法,但显式将display属性设置为block会删除滚动条.浮动SVG元素也可以解决这个问题.

.fullscreen { display: block }
Run Code Online (Sandbox Code Playgroud)

看来HTML5 DOCTYPE是基于W3C严格的DOCTYPES(不是过渡性的).两个严格声明也显示滚动条.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Run Code Online (Sandbox Code Playgroud)

所以在这一点上,如果你关心严格的与过渡的DOCTYPES,最好引用不同的讨论:浏览器渲染严格/过渡DOCTYPE之间的区别

希望这为讨论增加了一点价值.


ada*_*que 15

建立在Corey的答案之上,inline或者inline-block元素被称为"内联",因为它们旨在被排列在文本行之间.因此,无论它们出现在哪里,空间都被保留用于"下降",这是一个文本行下面的区域,其中小写的g,j和y的dangly部分去.

所以这就是你的svg元素有额外空间的地方display: inline.你可以操纵line-height属性保留的空间量,或者你可以通过设置完全删除它display: block,正如Corey指出的那样.

我相信你能够在元素imgsvg元素上设置高度和宽度,因为它们在CSS用语中是"替换"元素,并且与常规内联元素的行为略有不同.CSS规范更详细地解释了它的工作原理.就规格而言,它实际上非常易读.


Coi*_*_op 5

最简单的解决方案是将CSS规则添加overflow:hidden到html和/或body标签中.

html, body { overflow:hidden; }
Run Code Online (Sandbox Code Playgroud)

编辑

另一种解决方案是使用XHTML doctype.这适用于Chrome,我怀疑它适用于IE9.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

  • 这不是解决方案,这是一种解决方法.我不想要解决方法,我可以自己想出来.我正在寻找是否有这种行为的原因或它是一个错误.我会给你+1,因为这可能对有同样问题并寻找实际答案的人有好处. (2认同)
  • `<!Doctype html>`是一个合适的doctype,我想使用HTML5. (2认同)