Разбейте элементы легенды высоких диаграмм на две строки

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

Разбейте элементы легенды высоких диаграмм на две строки

Любая помощь будет оценена по достоинству.

возможно, вы могли бы вместо этого создать собственную легенду

Sachi Tekina 26.07.2018 07:18

Не могли бы вы также добавить свой код highcharts? По крайней мере, то, что у вас есть до сих пор относительно легенды, чтобы было легче возиться с кодом.

user9420984 26.07.2018 09:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
828
2

Ответы 2

Как отметила Сачи Текина, лучший способ добиться этого - создать собственную легенду. То, как легенды 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 26.07.2018 16:10

@arjary Боюсь, у меня нет опыта, чтобы посоветовать вам, как поместить HTML в оболочку или Backbone; Я тоже не знаком. Когда я создаю собственные легенды, они являются частью HTML-содержимого, которое я использую, при этом JS либо складывается, либо добавляется отдельно от проприетарных сценариев. Вот еще один пример, который я построил: frbatlanta.org/research/inflationproject/stickyprice.aspx. В этом случае HTML-часть объекта находится в нашей системе управления контентом, а JS - это встроенный код.

Mike Zavarello 26.07.2018 16:19

Спасибо за ответ. Что ж, это не сработает для меня, поскольку у меня есть фреймворк, например backbone, который имеет представление и концепцию шаблона. Ваш ответ потребует, чтобы я поместил этот html в отдельный шаблон, даже если бы я сделал это, установление связи между диаграммой и представлением html было бы сложной задачей. Было бы здорово, если бы я мог внедрить этот html в функцию-оболочку или как-то еще в highcharts.

arjary 26.07.2018 17:06

Вы можете использовать метод 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. что-то мне не хватает?

arjary 26.07.2018 20:06

Правильно ли работает пример на jsfiddle?

ppotaczek 26.07.2018 20:12

Другие вопросы по теме