2016-08-30 2 views
0

Я пытаюсь разработать навигационное меню d3 без использования обычного подхода li/ul. Пока у меня есть 2 уровня, и я использую события мыши, чтобы вызвать изменения. Тем не менее, первый цикл работает нормально, и родительские элементы становятся черными, после чего вещи начинают вести себя странно, и эта строка не выполняется; svg.selectAll (".lvl1"). attr ("fill", "black"); но процесс remove() работает. Я что-то пропустил или это висит на событии? Любые идеи, которые помогут расширить этот подход до уровня 3, также будут оценены. https://jsfiddle.net/sjp700/djcc6kxq/d3 nav bar странное поведение при mouseout

lvl2.selectAll(".band") 
     .attr("width", function (d) { return d.width; }) 
     .attr("height", 18) 
     .style("opacity", .5) // set the element opacity 
     .style("stroke", "black") 
     .attr("class", "tbd") 
     .style("cursor", "move") 
     .on('mouseover', over2) 
     .on('mouseout', out) 
     .attr("link", function (d) { return d.link; });  
    } 


    function out() { 
     var t = d3.select(this); 
     t.attr("fill", "pink") 
     setTimeout(function() { 
     svg.selectAll(".lvl2").remove(); 
     svg.selectAll(".lvl1").attr("fill", "black"); 
     }, 2000);  
    } 
+0

Вы не выбираете правильную вещь. Помните, что вы устраиваете прямоугольник. Поэтому выберите так: svg.selectAll ('. Lvl1 rect) – thatOneGuy

ответ

1

Как уже упоминалось в комментариях, что вам нужно, чтобы стиль прямоугольник а не г элемента.

Обновлено скрипку: https://jsfiddle.net/thatOneGuy/djcc6kxq/1/

Кроме того, я переставил раскраска прямоугольникам, поэтому вы ранее были:

function out() { 
    var t = d3.select(this); 
    t.attr("fill", "pink") 
    //setTimeout(function() { 
    svg.selectAll(".lvl2").remove(); 
    svg.selectAll(".lvl1 rect").attr("fill", "black"); 
// }, 2000); 
} 

Но изменить его на это, чтобы сохранить выбранную вкладку последней цветной розовый:

function out() { 

    //setTimeout(function() { 
    svg.selectAll(".lvl2").remove(); 
    svg.selectAll(".lvl1 rect").attr("fill", "black"); 

    var t = d3.select(this); 
    t.attr("fill", "pink") 
    // }, 2000); 
} 

Если честно, я бы не использовал удаление, как при попытке наведения элементов уровня 2, потому что вы больше не старше родителя, они получают Oved. Я бы просто создал структуру и спрятал сначала. Затем при наведении указателя мыши на родителя, показать дочерние элементы, то есть установите видимость на видимые и на мыши, установите видимость в скрытую. Просто сохраняет вас, удаляя, а затем воссоздавая элементы.

+0

Отличные предложения. Любые идеи о том, как я могу выбрать только детей выбранного родителя, чтобы сделать видимыми? Раньше я отфильтровывал данные перед рисованием: data2 = data.filter (function (d) {return d.level === "two" && d.parent === t.attr ("name");}); – user3359706

+0

Это работает https://jsfiddle.net/sjp700/djcc6kxq/2/, но есть ли лучший способ? var t = d3.select (this); var parent = t.attr ("name") var subset = svg.selectAll (". Lvl2 rect") .filter (function (d) {return d.parent === parent;}); подмножество.стиль («видимость», «видимая»); – user3359706

+0

Какова причина, почему он должен быть полным D3, а не использовать обычный подход, как вы сказали? Если вам нужно сделать это по-своему, я рекомендую построить структуру данных, подобную дереву, из ваших данных. т.е. узел с дочерними элементами и т. д. См. этот пример для удаления ваших данных: http://stackoverflow.com/questions/18017869/build-tree-array-from-flat-array-in-javascript И затем, как только это будет сделано, просто выполните цикл через данные. Итак, на верхнем уровне создайте вкладку, затем на втором уровне создайте выпадающее меню, третье создайте выпадение в сторону второго уровня и так далее. – thatOneGuy

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