javascript - 悬停过渡停止初始过渡

标签 javascript d3.js transition

我正在使用 d3.js 制作径向直方图。

问题如下:我有一个初始过渡,使条形“增长”到它们的实际高度(eyecandy)。

一切正常。现在我想添加一个悬停过渡,即所有项目的不透明度应在悬停时过渡到 .5,并在悬停状态结束时返回到 1。

它自己也能正常工作。

如果在初始转换仍在发生时触发悬停状态,它将停止正常工作。然后初始过渡就停止了,条形图没有达到它们的最终高度。

问题:我怎样才能使两个过渡一起工作,以便悬停过渡不会停止初始过渡?

Here is a jsfiddle .这是它自己的代码:

<script src="http://d3js.org/d3.v3.js"></script>

<div id="chart"></div>

<script>
    var margin = {
            top: 0,
            right: 0,
            bottom: 0,
            left: 0
        },
        width = 500 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;

    var arcMin = 150;
    var arcMax = 250;
    var pi = Math.PI;

    var color = d3.scale.category10();


    var data = [
        {
            "value": 20,
            "category": "category1"
  },
        {
            "value": 24,
            "category": "category1"
  },
        {
            "value": 9,
            "category": "category1"
  },
        {
            "value": 93,
            "category": "category1"
  },
        {
            "value": 82,
            "category": "category1"
  },
        {
            "value": 56,
            "category": "category1"
  },
        {
            "value": 29,
            "category": "category1"
  },
        {
            "value": 6,
            "category": "category1"
  },
        {
            "value": 10,
            "category": "category1"
  },
        {
            "value": 4,
            "category": "category1"
  },
        {
            "value": 45,
            "category": "category1"
  },
        {
            "value": 25,
            "category": "category1"
  },
        {
            "value": 26,
            "category": "category2"
  },
        {
            "value": 53,
            "category": "category2"
  },
        {
            "value": 60,
            "category": "category2"
  },
        {
            "value": 87,
            "category": "category2"
  },
        {
            "value": 77,
            "category": "category2"
  },
        {
            "value": 40,
            "category": "category2"
  },
        {
            "value": 12,
            "category": "category2"
  },
        {
            "value": 80,
            "category": "category2"
  },
        {
            "value": 23,
            "category": "category2"
  },
        {
            "value": 53,
            "category": "category2"
  },
        {
            "value": 26,
            "category": "category2"
  },
        {
            "value": 34,
            "category": "category2"
  },
        {
            "value": 79,
            "category": "category2"
  },
        {
            "value": 98,
            "category": "category3"
  },
        {
            "value": 1,
            "category": "category3"
  },
        {
            "value": 13,
            "category": "category3"
  },
        {
            "value": 80,
            "category": "category3"
  },
        {
            "value": 66,
            "category": "category3"
  },
        {
            "value": 5,
            "category": "category3"
  },
        {
            "value": 36,
            "category": "category3"
  },
        {
            "value": 74,
            "category": "category3"
  },
        {
            "value": 32,
            "category": "category3"
  },
        {
            "value": 4,
            "category": "category3"
  },
        {
            "value": 54,
            "category": "category3"
  },
        {
            "value": 8,
            "category": "category3"
  },
        {
            "value": 64,
            "category": "category3"
  },
        {
            "value": 5,
            "category": "category3"
  },
        {
            "value": 58,
            "category": "category3"
  },
        {
            "value": 41,
            "category": "category3"
  },
        {
            "value": 81,
            "category": "category3"
  },
        {
            "value": 73,
            "category": "category3"
  },
        {
            "value": 20,
            "category": "category3"
  },
        {
            "value": 32,
            "category": "category3"
  },
        {
            "value": 42,
            "category": "category3"
  },
        {
            "value": 55,
            "category": "category3"
  },
        {
            "value": 74,
            "category": "category3"
  },
        {
            "value": 17,
            "category": "category3"
  },
        {
            "value": 6,
            "category": "category3"
  },
        {
            "value": 96,
            "category": "category3"
  },
        {
            "value": 18,
            "category": "category3"
  },
        {
            "value": 1,
            "category": "category3"
  },
        {
            "value": 18,
            "category": "category3"
  },
        {
            "value": 40,
            "category": "category3"
  },
        {
            "value": 9,
            "category": "category3"
  },
        {
            "value": 30,
            "category": "category3"
  },
        {
            "value": 28,
            "category": "category3"
  },
        {
            "value": 25,
            "category": "category3"
  },
        {
            "value": 44,
            "category": "category3"
  },
        {
            "value": 20,
            "category": "category3"
  },
        {
            "value": 99,
            "category": "category3"
  },
        {
            "value": 95,
            "category": "category3"
  },
        {
            "value": 50,
            "category": "category3"
  },
        {
            "value": 65,
            "category": "category3"
  },
        {
            "value": 66,
            "category": "category3"
  },
        {
            "value": 7,
            "category": "category3"
  },
        {
            "value": 70,
            "category": "category4"
  },
        {
            "value": 39,
            "category": "category4"
  },
        {
            "value": 12,
            "category": "category4"
  },
        {
            "value": 94,
            "category": "category4"
  },
        {
            "value": 55,
            "category": "category4"
  },
        {
            "value": 15,
            "category": "category4"
  },
        {
            "value": 84,
            "category": "category4"
  },
        {
            "value": 31,
            "category": "category4"
  },
        {
            "value": 48,
            "category": "category4"
  },
        {
            "value": 26,
            "category": "category4"
  },
        {
            "value": 70,
            "category": "category4"
  },
        {
            "value": 30,
            "category": "category4"
  },
        {
            "value": 26,
            "category": "category4"
  },
        {
            "value": 75,
            "category": "category4"
  },
        {
            "value": 43,
            "category": "category4"
  },
        {
            "value": 83,
            "category": "category4"
  },
        {
            "value": 64,
            "category": "category5"
  },
        {
            "value": 52,
            "category": "category5"
  },
        {
            "value": 37,
            "category": "category5"
  },
        {
            "value": 11,
            "category": "category5"
  },
        {
            "value": 77,
            "category": "category6"
  },
        {
            "value": 94,
            "category": "category6"
  },
        {
            "value": 37,
            "category": "category6"
  },
        {
            "value": 64,
            "category": "category6"
  },
        {
            "value": 92,
            "category": "category6"
  },
        {
            "value": 58,
            "category": "category6"
  },
        {
            "value": 70,
            "category": "category6"
  },
        {
            "value": 47,
            "category": "category6"
  },
        {
            "value": 87,
            "category": "category6"
  },
        {
            "value": 6,
            "category": "category6"
  },
        {
            "value": 87,
            "category": "category6"
  },
        {
            "value": 32,
            "category": "category6"
  },
        {
            "value": 70,
            "category": "category6"
  },
        {
            "value": 38,
            "category": "category6"
  },
        {
            "value": 38,
            "category": "category6"
  },
        {
            "value": 31,
            "category": "category6"
  },
        {
            "value": 82,
            "category": "category6"
  },
        {
            "value": 44,
            "category": "category6"
  },
        {
            "value": 21,
            "category": "category6"
  },
        {
            "value": 78,
            "category": "category6"
  },
        {
            "value": 97,
            "category": "category6"
  },
        {
            "value": 67,
            "category": "category6"
  },
        {
            "value": 29,
            "category": "category6"
  },
        {
            "value": 6,
            "category": "category6"
  }
];


    var vis = d3.select("#chart").append("svg").attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    var min = 1;
    var max = data.length;

    var middle = Math.round((max + min) / 2) - 0.5;

    var innerArc = d3.svg.arc()
        .innerRadius(arcMin)
        .outerRadius(arcMin + 10)
        .startAngle(function (d, i) {
            return (i + 0.1 - middle) * (pi / middle);
        })
        .endAngle(function (d, i) {
            return (i + 1 - 0.1 - middle) * (pi / middle);
        });

    var outerArc = d3.svg.arc()
        .innerRadius(arcMin)
        .outerRadius(function (d, i) {
            // Use min-max-normalization to scale value into interval [arcMin, arcMax]
            return (d.value - min) * ((arcMax - arcMin) / (max - min)) + arcMin;
        })
        .startAngle(function (d, i) {
            return (i + 0.1 - middle) * (pi / middle);
        })
        .endAngle(function (d, i) {
            return (i - 0.1 + 1 - middle) * (pi / middle);
        });

    var lines = vis.selectAll(".line")
        .data(data)
        .enter()
        .append("path")
        .attr("class", function (d) {
            return d.category + " line";
        })
        .attr("d", innerArc)
        .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
        .attr("fill", function (d) {
            return color(d.category);
        })
        .on("mouseleave", function () {
            d3.selectAll(".line")
                .transition()
                .duration(300)
                .style("opacity", 1);
        })
        .on("mouseenter", function (d, i) {
            d3.selectAll(".line")
                .transition()
                .duration(150)
                .style("opacity", .5);
        })
        .transition()
        .duration(2000)
        .delay(function (d) {
            return ((d.value - min) / (max - min)) * 500;
        })
        .attr("d", outerArc);
</script>

最佳答案

在其他转换开始之后添加的转换总是取消那些较早的转换,cf。 the documentation :

Only one transition may be active on a given element at a given time. However, multiple transitions may be scheduled on the same element; provided they are staggered in time, each transition will run in sequence. If a newer transition runs on a given element, it implicitly cancels any older transitions, including any that were scheduled but not yet run.

特别是:

This allows new transitions, such as those in response to a new user event, to supersede older transitions even if those older transitions are staged or have staggered delays.

因此,您正在寻找的用例明确不受 D3 支持。

要实现您想要的效果,将涉及在第二个转换开始时捕获状态并手动合并转换(有关指针,请参阅 here),或在不同元素上进行转换。

关于javascript - 悬停过渡停止初始过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25564780/

相关文章:

javascript - 如何返回这个值?

javascript - 使用 JavaScript 或 JQuery 模拟用户点击

javascript - 当键是用户输入时,我应该如何使用 map 来获取对象的一些值

javascript - D3 路径动画 - 无法读取未定义的属性 'length'

javascript - 如何在 d3 中指定轴刻度线的数量?

插入 View Controller 时快速背景颜色

css - 如何像 Droplr 一样使用 CSS/jQuery 淡入/淡出多个文本?

javascript - 如何在jqgrid的custom_func中显示自定义警告框

javascript - 如何获取表中的所有 tr 和 td,该表中的行按 jQuery 中的属性过滤

javascript - 如果失败,则使用if/else Javascript语句禁用过渡动画