У меня есть диаграмма с 10 сериями, поэтому я хочу разбить легенды серий на 4 в первой строке и 6 в другой. Есть ли способ сделать это? Игра с legend.itemWidth и legend.width бесполезна. Пожалуйста, дайте мне знать, если это известная проблема? Или есть обходной путь для этого. Ниже я прикрепил скриншот того, чего я пытаюсь достичь.
Любая помощь будет оценена по достоинству.
Не могли бы вы также добавить свой код highcharts? По крайней мере, то, что у вас есть до сих пор относительно легенды, чтобы было легче возиться с кодом.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как отметила Сачи Текина, лучший способ добиться этого - создать собственную легенду. То, как легенды Highcharts построены и собраны, означает, что вы не можете разбить их на две строки, как вы показали в своем примере, ни в параметрах кода, ни после факта использования CSS (в основном потому, что они используют position: absolute, который может оказаться монументальная боль, с которой нужно возиться).
Вот пример специальной легенды, которую я построил с помощью одной из демонстраций Highcharts: http://jsfiddle.net/brightmatrix/g0tfe12j/
Сначала создайте свою собственную легенду, используя флажки. Обратите внимание на тег разрыва, чтобы переместить некоторые во вторую строку.
<div align = "center">
<form id = "test" name = "test" method = "post">
<input type = "checkbox" class = "myCheckboxClass" name = "myCheckbox" series = "Tokyo" id = "checkbox1" checked><label for = "checkbox1">Tokyo</label>
<input type = "checkbox" class = "myCheckboxClass" name = "myCheckbox" series = "New York" id = "checkbox2" checked><label for = "checkbox1">New York</label>
<br />
<input type = "checkbox" class = "myCheckboxClass" name = "myCheckbox" series = "Berlin" id = "checkbox3" checked><label for = "checkbox1">Berlin</label>
<input type = "checkbox" class = "myCheckboxClass" name = "myCheckbox" series = "London" id = "checkbox4" checked><label for = "checkbox1">London</label>
</form>
</div>
Затем вы можете использовать функцию, которая запускается всякий раз, когда щелкают флажки. Эта функция будет смотреть на настраиваемый атрибут в каждом флажке ("серии") и включать или выключать связанные серии на вашей диаграмме:
// when a checkbox is clicked, trigger the function
$(".myCheckboxClass").on('click',function() {
// get the value of "series", a custom attribute for the checkbox
var seriesName = $(this).attr("series");
// if that value matches a series, show or hide it in the chart
for (i = 0; i < $("#container").highcharts().series.length; i++) {
if ($("#container").highcharts().series[i].name == seriesName) {
// if the checkbox is checked, show the dataset
if ($(this).prop("checked")) {
$("#container").highcharts().series[i].show();
// if the checkbox is unchecked, hide the dataset
} else {
$("#container").highcharts().series[i].hide();
}
}
}
});
Затем вы можете использовать любые стили, чтобы сопоставить настраиваемую легенду с вашей диаграммой.
Надеюсь, это будет вам полезно.
Спасибо за предложение @Mike. Вопрос, как бы вы внедрили этот html в оболочку drawLegendSymbol или во фреймворк, такой как Backbone?
@arjary Боюсь, у меня нет опыта, чтобы посоветовать вам, как поместить HTML в оболочку или Backbone; Я тоже не знаком. Когда я создаю собственные легенды, они являются частью HTML-содержимого, которое я использую, при этом JS либо складывается, либо добавляется отдельно от проприетарных сценариев. Вот еще один пример, который я построил: frbatlanta.org/research/inflationproject/stickyprice.aspx. В этом случае HTML-часть объекта находится в нашей системе управления контентом, а JS - это встроенный код.
Спасибо за ответ. Что ж, это не сработает для меня, поскольку у меня есть фреймворк, например backbone, который имеет представление и концепцию шаблона. Ваш ответ потребует, чтобы я поместил этот html в отдельный шаблон, даже если бы я сделал это, установление связи между диаграммой и представлением html было бы сложной задачей. Было бы здорово, если бы я мог внедрить этот html в функцию-оболочку или как-то еще в highcharts.
Вы можете использовать метод Highcharts сворачивать, чтобы создать свою собственную настройку для макета легенды:
Highcharts.wrap(Highcharts.Legend.prototype, 'render', function(proceed) {
proceed.apply(this, Array.prototype.slice.call(arguments, 1));
var legend = this,
legendWidth = legend.legendWidth,
items = legend.allItems,
firstLineWidth = 0,
secondLineWidth = 0,
firstStartPoint,
secondStartPoint;
Highcharts.each(items, function(item, i) {
if (i < 4) {
firstLineWidth += item.itemWidth;
} else {
secondLineWidth += item.itemWidth;
}
});
firstStartPoint = (legendWidth - firstLineWidth) / 2;
secondStartPoint = (legendWidth - secondLineWidth) / 2;
Highcharts.each(items, function(item, i) {
if (i < 4) {
item.legendGroup.attr({
translateX: firstStartPoint
});
firstStartPoint += item.itemWidth;
} else {
item.legendGroup.attr({
translateX: secondStartPoint,
translateY: 18
});
secondStartPoint += item.itemWidth;
}
});
});
Живая демонстрация: http://jsfiddle.net/BlackLabel/7he9btvg/
Документы: https://www.highcharts.com/docs/exnding-highcharts/exnding-highcharts
Спасибо за предложение. Я попробовал вашу функцию-оболочку, я получил пустой массив для legend.allItems. что-то мне не хватает?
Правильно ли работает пример на jsfiddle?
возможно, вы могли бы вместо этого создать собственную легенду