2016-12-14 2 views
1

Это может быть тривиально для некоторых людей, но я новичок в D3JS.D3JS колебательные пузыри

Я пытаюсь построить два статических пузырька с изменением непрозрачности относительно массива. Я могу построить пузырьки, но я не могу постоянно менять их прозрачность. Я использую transition и delay, а непрозрачность может меняться только один раз. Вот мой пример кода

(function() { 

    var dropsize = 100; 
    var gapsize = 20; 
    var osc = [[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5],[1, 1],[0.5, 0.5],[0, 0],[0.5, 0.5]]; 
    var radius = dropsize/2; 
    var h = 100; 
    var w = (4 * radius + 3 * gapsize); 
    var svg = d3.select("#chart").append("svg"); 
    var svg = d3.select("body") 
    .append("svg") 
    .attr("width", w) 
    .attr("height", h) 
    .style("background-color", "teal"); 
    var circles = svg.selectAll("circle") 
    .data([radius, 3 * radius]) 
    .enter() 
    .append("circle"); 
    circles.attr("cx", function(d, i) { 
     return d + (i + 1) * gapsize; 
    }) 
    .attr("cy", h/2) 
    .attr("r", function(d, i) { 
     return radius; 
    }) 
    .attr("fill", "orange") 
    .attr("class", "droplet") 
    .attr("id", function(d, i) { 
     return "c_" + (i + 1); 
    }); 
    d3.select("#c_1") 
    .data(osc) 
    .transition().delay(function(d, i) { 
     return i * 1000; 
    }) 
    .duration(1000) 
    .attr("opacity", function(d) { 
     return d[0] 
    }); 
})(); 

Смотрите Pen Bubble Chart with D3.js using Realtime Data

ответ

2

Если по «непрерывно» означает, что вы хотите бесконечно запускать переход, используйте on("end"), чтобы снова вызвать функцию перехода.

Вот пример:

var toggle; 
 

 
var data = [0, 1]; 
 

 
transition(); 
 

 
function transition() { 
 
    toggle ^= 1; 
 
    d3.select("circle") 
 
     .transition() 
 
     .duration(1000) 
 
     .style("opacity", data[toggle]) 
 
     .on("end", transition); 
 
}
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="100" cy="100" r="50"></circle> 
 
</svg>

+0

Это прекрасно работает. Спасибо @Gerardo Furtado. Оба пузырька должны иметь возможность осциллировать с различной непрозрачностью. Таким образом, одна пара содержит непрозрачность для каждого пузыря соответственно. – kthouz

+0

Теперь это имеет смысл! Имейте в виду, что в моем коде два значения в массиве данных представляют собой два осциллирующих значения для непрозрачности. –

+1

Да, понял. Однако из-за какой-то будущей заявки я решил использовать 'setInterval' следующим образом: ' tic = new Date(); setInterval (function() { dt = Math.round ((new Date() - tic)/50)% osc.length; d3.select ("# c_1") .переход(). Duration (100). («opacity», function() {return osc [dt] [0]}); d3.select ("# c_2"). transition(). duration (100) .style ("opacity", function() {return osc [dt] [1]}); }) ' – kthouz

0

я предполагаю, непрерывно вы имеете в виду плавно переход, а не переключаться сразу из одного состояния непрозрачности к другому, в отличие от повторения перехода.

Сначала необходимо установить начальную непрозрачность на кружках при их создании:

.attr("opacity", 0) 

И затем использовать d3.selectAll вместо d3.select, или лучше ваша переменная circles

... 

circles 
    .data(osc) 
    .transition()       
    .delay(function(d,i){ return i*1000; }) 
    .duration(1000) 
    .attr("opacity",function(d){ return d[0] }); 
+0

Основная проблема заключается они не имеют непрозрачность перехода от. Поэтому вам нужно дать им это начальное значение –

+0

Посмотрите на мой пример: он не имеет начального значения для непрозрачности, но он работает. Кроме того, нет никакой разницы между 'selectAll' и' select'here, особенно потому, что OP выбирает по ID (поэтому 'selectAll' не имеет смысла). –

+0

@GerardoFurtado Я запустил код OP в его CodePen, и это не сработало, пока я не добавил исходную непрозрачность. Я не смотрел ваш код, но вы можете обнаружить, что без начального значения ваш браузер специфичен для браузера. Кроме того, мое чтение того, что ищет OP, отличается от вашего, что в моем чтении 'selectAll' имеет смысл –

Смежные вопросы