【问题标题】:Controlling the fill of a rect through CSS in Raphael在 Raphael 中通过 CSS 控制矩形的填充
【发布时间】:2012-08-20 00:49:31
【问题描述】:

我正在使用 Raphael,我想创建一个矩形并通过 CSS 控制填充属性。

当我以经典方式设置填充属性时,一切正常:

    space = paper.rect(0,0,1000,500).attr({fill: "url('img/cell_background.png')"});

事实上,通过这种方法,我得到了正确的填充。如果检查元素,我可以看到在rect 元素中指定了fill 属性,它引用了svg 的defs 中定义的模式。

<svg>
   ...
   <defs style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); ">
        <pattern style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); " 
         id="E6992022-9B75-4D1E-9D44-6EC45CE420A1" x="0" y="0" 
         patternUnits="userSpaceOnUse" height="5" width="9" 
         patternTransform="matrix(1,0,0,1,0,0) translate(0,0)">
           <image style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); " 
                      x="0" y="0" 
                  href="img/cell_background.png" width="9" height="5">
               </image>
        
            </pattern>
      </defs>
      <rect style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); " 
        x="0" y="0" width="1000" height="500" r="0" rx="0" ry="0" 
    fill="url(#E6992022-9B75-4D1E-9D44-6EC45CE420A1)" stroke="#000" 
    class="space">
      </rect>
    ...
</svg>

如果我改为使用以下代码创建rect:

space = paper.rect(0,0,1000,500);
space.node.setAttribute("class","space");

然后在我定义的 .css 中:

.space {
fill: url('img/cell_background.png');
stroke: #ff0000;
}

然后检查的html显示fill='none'作为rect属性,矩形正确渲染为红色边框,但填充为纯黑色。

一些进一步的观察:

  1. js在js/文件夹,css在css/文件夹,图片在img/文件夹。我尝试使用 '../img'、'./img' 和 'img' 但我的行为相同;
  2. 如果我不添加填充物,我会得到预期的白色填充物;
  3. 如果我输入fill: foobar,我将获得白色背景;
  4. 如果我输入fill: #ff0000,我会得到预期的红色背景;
  5. 如果我使用假文件名,我会得到相同的黑色背景;
  6. 该行为与 Chrome 和 Firefox 一致。

从第四点和第五点开始,似乎找不到文件,但我认为已经用尽了我应该检查的路径组合(css 使用 '../img 在同一文件夹中找到其他图像' 小路)。我认为问题出在其他地方。

有人有类似经历吗?

【问题讨论】:

  • 你在尝试使用 CSS 来设置 SVG 元素的属性?
  • 是的。这是完全错误的吗?由于它与笔画一起使用,我天真地认为它也可以与填充一起使用。傻我!
  • 我检查了你可以在 SVG 上使用 CSS:w3.org/TR/SVG/styling.html#StylingWithCSS
  • 网址应该与 CSS 文件相关,因此 ../img 似乎是正确的。您是在本地运行它还是在 Web 服务器中运行它,因为您可能会遇到本地文件访问安全限制。浏览器错误控制台有什么东西吗?
  • 它是在本地运行的,正如我所说的,如果我不使用css,图像可以正确显示,我认为不是权限问题。在 Firefox Web 控制台上,我看不到与这些行相关的任何错误或警告。我看不到对该图像的任何请求。

标签: javascript css svg raphael


【解决方案1】:

在 SVG 中,您不能像处理 HTML 元素那样只为元素指定位图背景 url。在 SVG 中执行此操作的标准方法是通过 pattern 定义。 Raphael 用一个简单的fill: url(...) 将这种混乱从你身上抽象出来。

您可以使用 CSS 样式表加载模式,例如...

.space {
  fill: url('img/cell_background.svg#bitmap');
  stroke: #ff0000;
}

当然,cell_background.svg#bitmap 仍然需要看起来像......

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
   <defs>
        <pattern id="bitmap" x="0" y="0" patternUnits="userSpaceOnUse" height="5" width="9">
           <image x="0" y="0" xlink:href="img/cell_background.png" width="9" height="5">
           </image>
         </pattern>
    </defs>
</svg>

当然,这只会让事情变得更复杂。

您的矩形显示为黑色的原因是引擎正在尝试加载默认为黑色的缺失填充定义(渐变或图案)。

【讨论】:

  • 我试过了,但它似乎不起作用。我还有黑色的填充物。并且浏览器没有请求获取 cell_background.svg。
  • 更准确地说,之前的测试是在 Chrome 中完成的,在 Firefox 中我得到一个白色填充。
  • 哎呀,我忘了你需要像xlink:href="img/cell_background.png"一样添加xlink(答案已更新)。但即便如此,我还是看到 Webkit 不允许加载外部定义。你想完成什么 Raphael 没有提供的东西?
  • 它可以在 Firefox 上运行,但在 chrome 上仍然不走运。我想要获得的是从 css 中设置所有样式(我希望网页设计师不要接触 js)。无论如何,我都可以创建一个简单的 js 文件,其中只包含有关形状背景的信息。我已经阅读了一些关于外部 defs 的浏览器特质的其他帖子。感谢您的帮助。
猜你喜欢
  • 2014-12-26
  • 2018-02-25
  • 2012-07-23
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多