Решение довольно простое: не используйте attr
для установки непрозрачности, используйте style
вместо:
nodeElements.transition()
.duration(500)
.style('opacity', function(node) {
return setOpacity(node,neighbors, selectedNode);
})
Вот код только с этим изменением: https://jsfiddle.net/uye24zjn/
Объяснение
Объяснение немного сложнее. Во-первых, имейте в виду, что вы никогда не устанавливали предыдущую непрозрачность, будь то с помощью attr
или style
.
При переходе непрозрачность D3 использует геттер для получения исходного значения, применяя соответствующий метод (attr
или style
). И здесь возникает проблема: поскольку вы никогда не устанавливали непрозрачность с помощью метода attr
, предыдущее значение, использующее attr
в качестве получателя, равно null
. Однако, используя style
, значение равно 1
:
const circle = d3.select("g")
.append("circle")
.attr("r", 50);
console.log("The opacity value using 'attr' as a getter is: " + circle.attr("opacity"))
console.log("The opacity value using 'style' as a getter is: " + circle.style("opacity"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg>
<g transform="translate(150,75)"></g>
</svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
В результате D3 попытается перейти с null
(ноль) на 1
, и вы увидите круги, исчезающие в началеперехода. В качестве демонстрации наведите курсор на круг:
const circle = d3.select("g")
.append("circle")
.attr("r", 50);
circle.on("mouseover", function() {
d3.select(this).transition()
.duration(1000)
.attr("opacity", function() {
return 1
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg>
<g transform="translate(150,75)"></g>
</svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
Проблема возникает только при первом наведении курсора мыши (точно так же, как ваш код), потому что после наведения на кружок непрозрачность устанавливается в качестве атрибута, и там будетне более null
, когда attr
используется в качестве получателя.
Как правило, используйте attr
, чтобы установить атрибуты , и style
, чтобы установить стили . Другими словами: используйте style
, чтобы установить все, что вы будете делать с помощью файла CSS.