一个 SVG 文件,里面有很多 SVG 渐变

发布于 2024-09-06 17:45:51 字数 1469 浏览 7 评论 0原文

我正在制作一组使用动态渐变的按钮。我已经通过使用 Firefox 3.6+ 和 WebKit 专有的 CSS 扩展来处理它们,我所需要做的就是使用 background-image: url("gradient.svg") 支持 Opera、iOS 和 IE9。

这相对简单,我制作了一个 SVG 文件,链接它并让它工作。然而,我正在制作一组,所以我需要至少 6 个渐变。当我通常在图像中执行此操作时,我会创建一个精灵以进行快速 HTTP 访问。我不确定如何在 SVG 中实现这一目标 - 我可以使用一个文件并通过使用 #identifiers 访问其 XML 的不同部分,就像 XBL 那样吗?

我当前的 SVG:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
         "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <linearGradient id="select-gradient" x1="0" x2="0" y1="0" y2="1">
            <stop offset="0%" stop-color="rgb(231,244,248)"/>
            <stop offset="100%" stop-color="rgb(207,233,241)"/>
        </linearGradient>
        <style type="text/css">
          rect {
          fill: url(#select-gradient);
          }
      </style>
    </defs>
    <rect x="0" y="0" rx="6" ry="6" height="100%" width="100%"/>
</svg> 

然后我有 CSS:

.button-1 {
  background-image: url("gradient-1.svg");
}

.button-2 {
  background-image: url("gradient-2.svg");
}

我想做这样的事情:

.button-1 {
  background-image: url("gradient.svg#gradient1");
}

.button-2 {
  background-image: url("gradient.svg#gradient2");
}

这可能吗?你能帮我一下吗?当我可以用一个 XML 文件来完成时,我真的不想推送 6 个 XML 文件。

I’m making a set of buttons which use dynamic gradients. I’ve taken care of Firefox 3.6+ and WebKit by using their proprietary CSS extensions and all I need to do is support Opera, iOS and IE9 by using background-image: url("gradient.svg").

This is relatively easy, I made an SVG file, linked it and got it working. However, I’m making a set so I need at least 6 gradients. When I normally do it in images, I create a sprite for fast HTTP access. I’m not sure how to achieve this in SVG – can I use one file and access different parts of its XML by using #identifiers, like XBL does?

My current SVG:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
         "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <linearGradient id="select-gradient" x1="0" x2="0" y1="0" y2="1">
            <stop offset="0%" stop-color="rgb(231,244,248)"/>
            <stop offset="100%" stop-color="rgb(207,233,241)"/>
        </linearGradient>
        <style type="text/css">
          rect {
          fill: url(#select-gradient);
          }
      </style>
    </defs>
    <rect x="0" y="0" rx="6" ry="6" height="100%" width="100%"/>
</svg> 

And then I have CSS:

.button-1 {
  background-image: url("gradient-1.svg");
}

.button-2 {
  background-image: url("gradient-2.svg");
}

I want to do something like this:

.button-1 {
  background-image: url("gradient.svg#gradient1");
}

.button-2 {
  background-image: url("gradient.svg#gradient2");
}

Is it even possible? Can you help me out? I really don’t wanna push 6 XML files when I can do it with one.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

神爱温柔 2024-09-13 17:45:51

如果你只想要按钮背景的渐变,大部分都可以在 css 中实现。对于其余浏览器,ie6+可以使用ms过滤器:
http://msdn.microsoft.com/en-us/library/ms532847.aspx

iOS 使用 webkit 进行渲染,因此可以使用 -webkit 供应商前缀。不幸的是,opera 仍然需要 svg,但这可能会让事情变得更容易(或者对于 opera 的 1% 用户来说,只使用普通的图像精灵)

If you just want gradients for button backgrounds, most of this can be acheived in css. For the remaining browsers, ie6 + can user ms filters:
http://msdn.microsoft.com/en-us/library/ms532847.aspx

iOS uses webkit to render, so you can use -webkit vendor prefix. Unfortunately you will still need svg for opera, but this may make it easier (or just use a normal image sprite for opera's 1% of users)

少女七分熟 2024-09-13 17:45:51

理论上 - 根据 SVG 文档#Params 它是可能的。您可以使用 2 个参数来设置两种颜色,您可以创建多个具有不同渐变的矩形,高度设置为 0,然后仅制作一个 100%(如 ?gradient2=100%)

in theory - according to SVG documentation #Params it is possible. You could use 2 params for setting up both colors, you could create multiple rects with different gradients, height set to 0 and then make only one 100% (like ?gradient2=100%)

终难愈 2024-09-13 17:45:51

您可以做的是首先加载包含所有定义的 SVG 文件,然后加载其他 SVG 文件。

使用 Firefox、 jQuery SVG 以及框架的一个小镜头...

的 XHTML 中

    <div id="common_svg_defs"><!--ieb--></div>
    <div id="first_thing"><!--ieb--></div>
    <div id="second_thing"><!--ieb--></div>

在您 JavaScript:

    var do_stuff = function()
    {
      // load your common svg file with this goo.
      $('#common_svg_defs').svg({
        loadURL: 'path/filename.svg',
        onLoad: function(svg, error) { run_test(svg, error);} });
    }

    var run_test = function(svg, error)
    {
      if (typeof(error) !== "undefined")
      {
        if (typeof(console.log) !== "undefined")
        {
          console.log(error);
        }
      }
      else
      {
        // load your other svg files here, or just
        // set a flag letting you know it's ready.
        $('#first_thing').svg({
          loadURL: 'path/anotherfilename.svg',
          onLoad: function(svg, error) { somecallback(svg, error);} });
        $('#second_thing').svg({
          loadURL: 'path/anotherfilename.svg',
          onLoad: function(svg, error) { somecallback(svg, error);} });
      }
    }

因为 id 可以在文档范围内找到,所以 SVG 能够找到 IRI 引用。

这允许您一次定义事物(否则不会在 css 中定义)并避免 id 冲突。

干杯,
克里斯托弗·史密森

What you could do is load your SVG file that contains all of the definitions first, and then load your other SVG files.

Using Firefox, jQuery SVG , and a minor shot of framework...

in your XHTML:

    <div id="common_svg_defs"><!--ieb--></div>
    <div id="first_thing"><!--ieb--></div>
    <div id="second_thing"><!--ieb--></div>

in your JavaScript:

    var do_stuff = function()
    {
      // load your common svg file with this goo.
      $('#common_svg_defs').svg({
        loadURL: 'path/filename.svg',
        onLoad: function(svg, error) { run_test(svg, error);} });
    }

    var run_test = function(svg, error)
    {
      if (typeof(error) !== "undefined")
      {
        if (typeof(console.log) !== "undefined")
        {
          console.log(error);
        }
      }
      else
      {
        // load your other svg files here, or just
        // set a flag letting you know it's ready.
        $('#first_thing').svg({
          loadURL: 'path/anotherfilename.svg',
          onLoad: function(svg, error) { somecallback(svg, error);} });
        $('#second_thing').svg({
          loadURL: 'path/anotherfilename.svg',
          onLoad: function(svg, error) { somecallback(svg, error);} });
      }
    }

Because the id can be found in the documents scope, the SVG are capable of finding the IRI reference.

This allows you to define things once (that would not otherwise be defined in a css) and avoid id collisions.

Cheers,
Christopher Smithson

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文