css – 如何引用SVG精灵符号内部的渐变定义?

前端之家收集整理的这篇文章主要介绍了css – 如何引用SVG精灵符号内部的渐变定义?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
概要:SVG精灵包含五个图标<符号>块,其中之一通过ID引用其自己的渐变定义.它不再能够找到这个渐变并正确渲染.

JSFIDDLE:http://jsfiddle.net/Qtq24/1/

我正在将一些图形转换为SVG,并且它们是图标(在这种情况下用于社交网络配置文件),我想让它们保持在一个精灵(就像我以前在PNG中).

我跟着this guide to SVG sprites on CSS-tricks.com(连同this follow-up which advises using <symbol> instead of <g>).

我现在有一个SVG精灵文件,social-sprite.svg,您可以在here中查看.

这是一个完整的< svg>包含五个不同的<符号>块,每个都有一个id和一个viewBox属性.在每种情况下,我通过在Adobe Illustrator中准备官方图标并保留处理代码的相关部分,获得每个符号的SVG代码.

< body>之后,.svg文件将通过PHP包含.标签打开(这就是为什么其中的主要< svg>容器被标记为style =“display:none;”),以便对每个符号的引用从HTML工作.

四个图标完美工作,唯一一个我遇到麻烦的是YouTube图标,因为它使用内部定义的渐变.以下是SVG代码的YouTube部分:

<symbol id="youtube" viewBox="0 0 400 281.641">
    <path id="Triangle" fill="#FFFFFF" d="M159.845,191.73l106.152-54.999L159.845,81.348V191.73z"/>
    <path id="The_Sharpness" opacity="0.12" fill-rule="evenodd" clip-rule="evenodd" fill="#420000" d="M159.845,81.348l93.091,62.162
    l13.061-6.778L159.845,81.348z"/>
    <g id="Lozenge">
        <g>
            <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="200.4204" y1="2.6162" x2="200.4204" y2="278.9292">
                <stop  offset="0" style="stop-color:#E52D27"/>
                <stop  offset="1" style="stop-color:#BF171D"/>
            </linearGradient>
            <path fill="url(#SVGID_1_)" d="M392.928,62.226c0,0-3.839-27.073-15.617-38.995C362.371,7.583,345.626,7.506,337.947,6.59
            c-54.975-3.974-137.441-3.974-137.441-3.974h-0.171c0,0-82.464,0-137.44,3.974c-7.68,0.916-24.419,0.993-39.364,16.641
            C11.753,35.153,7.92,62.226,62.226s-3.929,31.792-3.929,63.583v29.805c0,31.791,3.929,63.582,63.582
            s3.833,27.073,15.611,38.995c14.945,15.646,34.575,15.152,43.318,16.792c31.43,3.015,133.571,3.946,3.946
            s82.552-0.124,137.526-4.099c7.679-0.915,24.424-0.993,39.363-16.64c11.778-11.922,15.617-38.995,15.617-38.995
            s3.923-31.791,3.923-63.582v-29.805C396.851,94.017,392.928,62.226z M159.863,191.73l-0.018-110.383
            l106.152,55.384L159.863,191.73z"/>
        </g>
    </g>
</symbol>

这在HTML中被称为:

<svg width="30" height="21">
    <use xlink:href="#youtube" src="fallback.png" width="30" height="21" />
</svg>

开放的两个路径工作正常,问题是在这个新组合的精灵SVG文件中,每个图标被分隔为< symbol>,“Lozenge”< path>无法找到< linearGradient>的#SVGID_1_引用.

在Firefox中,这会导致菱形显示为白色(我认为,也许它根本没有显示 – 没有真正看到它):

而Chrome则呈现黑色:

显然这两者都不可接受.目前唯一可以做的就是在路径上移除fill =“url(#SVGID_1_)”,只需填写适合YouTube徽标的平面颜色红色.这不是一个正确的解决方案,尽管如此,即使这样的事实,以这种方式欺骗YouTube标志也不会被他们的品牌指导所接受.

我试过的东西(没有运气):

>去除两个< g>围绕梯度和路径的包装器,因此整个符号只是< path> – < path> – < linearGradient> – < path>
将渐变定义包含在< defs>容器
>将其包装在< defs>并且还将其移动到SVG文件的顶部,即在YouTube特定的<符号>的范围之外.
>更改ID名称(你永远不会知道!)
>用百分比重新定义渐变,而不是像素值

那么如何获得已经内部的< symbol>以引用一个内部< linearGradient>定义?

编辑:结果当整个< svg>块被标记为style =“display:none;”.如果删除此样式,渐变呈现正确.但是作为一个提醒,添加了这个样式,以便当您导入SVG精灵时,它不会在页面上立即呈现,只允许您根据需要引用id定义的符号.

可见性:隐藏或不透明度:0都允许梯度呈现正确,显然它们不提供适当的解决方案,尽管它们仍然标注SVG会占用的空间(如果可见).

发现所有这些之后,我很确定这是完全可见的< svg>没有添加样式INSIDE一个容器< div>这是隐藏的.但是,即使这样也不会渲染渐变.我没有更接近解决这个问题.

解决方法

首先请注意编辑我的问题,于是我发现使用display:none来隐藏SVG符号,直到我们需要它们为止.

我一直处于困境,并处于这个“完美”的“答案”之上,但对于任何这种情况,仍然是可靠的.

所有您需要做的是将整个< svg> < div>中的代码容器必须显示,但永远不会影响布局,所以我刚刚通过超大的杀毒CSS做了这样的事情,如:

身高:0;宽度:0;位置:绝对能见度:隐藏;

这样做很棒.看到最后的小提琴:http://jsfiddle.net/Qtq24/5/

如果任何人有更好的解决方案,我很乐意听到它,因为这感觉像一个黑客的方式,但我猜不要比使用display:none更麻烦;无论如何.

猜你在找的CSS相关文章