RaphaelJS 条带化成 SVG

Posted

技术标签:

【中文标题】RaphaelJS 条带化成 SVG【英文标题】:RaphaelJS stripes into a SVG 【发布时间】:2014-07-29 07:53:30 【问题描述】:

我正在使用 AngularJS 和 RaphaelJS 制作动态地图。

我的整个 SVG 对象被创建成一个指令;我想给地图的每个区域涂上颜色。

对于某些地区,我想做条纹;我一直在寻找很长时间的方法,它看起来像:

background-color: orange;
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(0,0,0,1) 5px, rgba(0,0,0,1) 10px);

我还会在悬停时更改此图案(黑色和红色条纹),并在鼠标移出时返回黑色和橙色条纹。

但是我意识到 RaphaelJS 中没有“重复线性渐变”的等价物(对吗?),我真的不知道该怎么做。

我至少尝试过使用渐变,但它不起作用(鼠标悬停的结果不是预期的。为什么?)

这是我在指令中的代码:

var paper = new Raphael(element[0], 600, 600);

var attr = 
    fill: "#f5f5f5",
    stroke: "#222",
    "stroke-width": 1,
    "stroke-linejoin": "round"
;

var fr = ;
fr.area1 = paper.path("...").attr(attr).attr(href: "#");
fr.area1 = paper.path("...").attr(attr).attr(href: "#");
fr.area1 = paper.path("...").attr(attr).attr(href: "#");

[...]

var state = area 3;

attr =       
 fill: '45-' + color1 + '-' + color2,
 stroke: "#222";

fr[state].attr(attr);


            (function(state) 

                var area = fr[state];

                area[0].style.cursor = "pointer";
                area[0].onmouseover = function() 

                    area.animate(
                        fill: '45-' + color3 + '-' + color2,
                        stroke: "#222"
                    , 10);
                    area.toFront();
                ;

                area[0].onmouseout = function() 
                    area.animate(
                        fill: '45-' + color1 + '-' + color2,
                        stroke: "#222"
                    , 300);
                    area.toFront();
                ;
            )(state);

谢谢,

【问题讨论】:

认为将其分解为突出特定问题的 jsfiddle 可能更有用。 【参考方案1】:

RaphaelJS 的动画渐变似乎是 not be supported。您必须使用 0 ms 调用 animate 以避免在动画期间出现黑色闪光效果。这是您的工作示例的fiddle。

要实现剥离效果,您可以使用此功能(this answer 的修改版):

function gradientString(colors, step) 
    var gradient = '45-' + colors[0],
        stripe = false,
        len = colors.length,
        i;

    for (i = 0; i < 100/step; i += 1) 
        gradient += '-' + colors[i % len] + ':' + i * step + '-' + colors[(i+1) % len] + ':' + i * step;
    

    return gradient;

这是一个fiddle 使用此函数来实现您想要的条纹和行为。

【讨论】:

以上是关于RaphaelJS 条带化成 SVG的主要内容,如果未能解决你的问题,请参考以下文章

在 RaphaelJS 中自动将文本换行到一个宽度?

Jquery / RaphaelJS SVG rect 禁用点击

使用 vanilla JS 而不是 JQuery $ 选择器按 id 选择 div 以应用 Raphaeljs 方法

离子框架中的 RaphaelJS:TypeError:无法读取未定义的属性“路径”

让 RaphaelJS SVG 填满整个容器

raphael.js 使用指南