Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Path 完美水平路径的SVG梯度_Path_Svg_Gradient - Fatal编程技术网

Path 完美水平路径的SVG梯度

Path 完美水平路径的SVG梯度,path,svg,gradient,Path,Svg,Gradient,我正在使用svg绘制折线图,并要求对其应用渐变。对于每一行,我使用一个path元素并将笔划设置为一个lineargradient元素 除了纯水平线,这一切都很好用——在这种情况下,我的线条上根本没有颜色 我做了一把小提琴来说明问题: ​ 纯水平线(第一条路径)不会出现,而第二条(y方向略有变化)会出现 我尝试了一些小技巧来让它运行起来——在一开始就放了一个假的M-1,-1,这似乎在IE和Chrome中解决了这个问题,但在firefox中没有。这让我觉得我在理解SVG梯度和路径时遗漏了一些东西

我正在使用svg绘制折线图,并要求对其应用渐变。对于每一行,我使用一个path元素并将笔划设置为一个lineargradient元素

除了纯水平线,这一切都很好用——在这种情况下,我的线条上根本没有颜色

我做了一把小提琴来说明问题:

纯水平线(第一条路径)不会出现,而第二条(y方向略有变化)会出现

我尝试了一些小技巧来让它运行起来——在一开始就放了一个假的M-1,-1,这似乎在IE和Chrome中解决了这个问题,但在firefox中没有。这让我觉得我在理解SVG梯度和路径时遗漏了一些东西。有没有办法让它工作?

的默认设置是objectBoundingBox。你的关键问题在…的最后一段描述

如果适用图元的几何图形没有宽度或高度,例如水平线或垂直线,则不应使用关键字objectBoundingBox,即使该线在查看时由于笔划宽度非零而具有实际厚度,因为笔划宽度在边界框计算中被忽略。如果适用图元的几何体没有宽度或高度,并且指定了objectBoundingBox,则将忽略给定的效果(例如渐变或过滤器)

如果有一条水平线,为什么不使用带填充的矩形而不是带笔划的路径呢?或者使用userSpaceOnUse单位。

gradientUnits=“userSpaceOnUse”可以修复它



图表是自动生成的,所以它是否是完美的水平面取决于数据。不过userSpaceOnUse单元工作得很好,谢谢@如果路径是从数据动态生成的,那么一个选项可能是稍微抖动路径,使其不完全水平。这样可以保留objectBoundingBox,这可能更适合您,因为停止的百分比属于路径本身
<svg>
    <defs>
        <linearGradient id="grad" x1="0%" x2="100%" y1="0%" y2="0%">
            <stop class="" offset="0%" style="stop-color: red;"></stop>
            <stop class="" offset="33%" style="stop-color: yellow;"></stop>
            <stop class="" offset="66%" style="stop-color: pink;"></stop>
            <stop class="" offset="100%" style="stop-color: blue"></stop>
        </linearGradient>
    </defs>
<-- Gradient not applied -->
<path stroke="url(#grad)" d="M20,20L400,20" style="stroke-width: 10px;"></path>

<-- Gradient applied since height of 1px -->
<path stroke="url(#grad)" d="M20,40L400,41" style="stroke-width: 10px;"></path>

<-- Gradient applied because of fake initial "move to" -->
<path stroke="url(#grad)" d="M-1,-1,M20,60L400,60" style="stroke-width: 10px;"></path>
</svg>​
<linearGradient 
    id="grad" x1="0%" x2="100%" y1="0%" y2="0%" 
    gradientUnits="userSpaceOnUse">
    <stop class="" offset="0%" style="stop-color: red;"></stop>
    <stop class="" offset="33%" style="stop-color: yellow;"></stop>
    <stop class="" offset="66%" style="stop-color: pink;"></stop>
    <stop class="" offset="100%" style="stop-color: blue"></stop>
</linearGradient>