【问题标题】:Raphaël Donut chart click and unclick sections拉斐尔甜甜圈图表单击和取消单击部分
【发布时间】:2014-12-16 15:33:47
【问题描述】:

我是一个新手,但我正在尝试创建一个圆环图,其中的部分在单击时会放大,然后当单击不同的部分时,第一部分会恢复到原始大小,而新部分会放大。

我有图表和点击缩放,但现在我只能通过鼠标悬停让该部分恢复到原始大小。

这是我的代码:

 p.click(function () {
            p.stop().animate({transform: "s1.1 1.1 " + cx + " " + cy}, ms, "elastic");
            txt.stop().animate({opacity: 1}, ms, "elastic");
        }).mouseout(function () {
            p.stop().animate({transform: ""}, ms, "elastic");
            txt.stop().animate({opacity: 0}, ms);
        });

小提琴:http://jsfiddle.net/dll416/70twey1o/1/

【问题讨论】:

    标签: javascript jquery raphael donut-chart


    【解决方案1】:

    重要的是能够从点击侦听器函数中选择所有其他扇区和文本标签。

    我创建了一个示例,它通过为每个扇区和文本标签分配一个类来实现您正在寻找的内容,并使用这些类来执行“隐藏”动画:http://jsfiddle.net/8opkfpxs/4/

    设置类:

    p.node.setAttribute('class', 'sector');
    txt.node.setAttribute('class', 'sectorTxt');
    

    点击扇区时访问类:

            p.click(function (e) {
                donut.forEach(function(element) {
                    var className = element.node.getAttribute('class');
                    if(className === 'sector') {
                        element.stop().animate({transform: ""}, ms, "elastic");   
                    }
                    else if(className === 'sectorTxt') {
                        element.stop().animate({opacity: 0}, ms);   
                    }
                });
                p.stop().animate({transform: "s1.1 1.1 " + cx + " " + cy}, ms, "elastic");
                txt.stop().animate({opacity: 1}, ms, "elastic");                    
            });
    

    您还需要将 Raphael 上下文存储在一个变量中 - 在上面的示例中为 donut - 以便能够在点击侦听器中使用 forEach 函数。

    donut = Raphael("holder", 700, 700).donutChart(350, 350, 200, 50, values, labels, "#fff");
    

    【讨论】:

    • 这很好用。我还有几个问题,我将如何添加悬停状态。我希望悬停更改填充并在未悬停时恢复为原始填充,然后在单击部分缩放时恢复。
    • 此外,我现在将文本放在该部分上方,如果鼠标悬停在文本上,则单击不起作用-仅当您单击没有文本的位置时才起作用。无论您是否在文本上,有没有办法让点击发生? Here is the new fiddle
    • @Dab0416 您可以使用 mouseover 和 mouseout 事件侦听器添加悬停状态。至于文本,您也需要将您的点击事件连接到此(以及如果添加悬停事件)并找到相关的扇区进行动画处理。您可能需要找到文本的索引并使用它来搜索具有“扇区”类的扇区数组。
    • 最后一个问题 - 有没有办法在一个部分已经展开的情况下加载图表?
    【解决方案2】:

    移除 mouseOut 功能,在应用变换 onClick 之前重置整个变换和属性更改,也将图表集分成 2。 我还建议您在数组中绘制每个图表。

    我只是更改了这些行:

    chartTxt = this.set(),
    chart = this.set();
    

    p.click(function () {
        chart.transform("");
        chartTxt.attr({opacity: 0});
        this.stop().animate({transform: "s1.1 1.1 " + cx + " " + cy}, ms, "elastic");
        txt.stop().animate({opacity: 1}, ms, "elastic");
    });
    

    chart.push(p);
    chartTxt.push(txt);
    

    http://jsfiddle.net/crockz/m4tcr4tg/

    【讨论】:

    • 这个也可以。我喜欢它,因为它对像我这样的新手来说更容易理解,但我接受了另一个答案,因为在测试这个答案时,我注意到如果你足够快地点击不同的部分,你可以让它同时突出显示两个部分这对我的目的不起作用。不过感谢您的帮助!
    • 没关系,我只是想尽可能简单地回答你的问题Raphaël Donut chart click and unclick section,因为我不知道你的目的图表。对您来说最好的解决方案可能与我的建议相反。作为脚注,请记住,您可以使用 css 控制内联 svg(填充、笔划、过度和向外等)并按照您在 Athms 回答后编写的代码,您应该尝试将按钮和文本放在同一个集合中或绘制不可见动画顶部的按钮。
    • 啊!我使用 css :hover 将鼠标悬停在其中,并在原始图表的顶部添加了一个不可见的图表,并为其分配了点击功能。感谢您的提示!
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多