Highcharts dataLabels allowOverlap не работает - PullRequest
1 голос
/ 16 июня 2020

В моих параметрах dataLabels для серии я установил allowOverlap на false. Тем не менее, я все еще получаю перекрывающиеся ярлыки. Моя реальная реализация, по общему признанию, действительно индивидуальна и сделана на заказ, и я попытался создать простой jsfiddle, чтобы воспроизвести это, но не могу.

Однако я отследил это до того, что, по моему мнению, является проблемой, по крайней мере, на выходе html.

В этом примере , когда я проверяю элементы меток в Chrome Dev Tools, я вижу что-то вроде следующего для первых нескольких меток:

enter image description here

Кажется, что класс highcharts-data-label-hidden идет вместе с opacity: 0, и это действует, чтобы скрыть соответствующую метку. Если метка класса не применяется, opacity устанавливается на 1, чтобы метка отображалась. Работает как надо; в этом примере нет перекрывающихся меток.

Однако с выводом моего собственного кода я вижу что-то вроде:

enter image description here

В моем выводе показаны все метки; никто не скрыт; и многие пересекаются. Кажется, что класс highcharts-data-label-hidden правильно применяется к определенным меткам, т.е. к тем, которые должны быть скрыты, чтобы избежать перекрытия. Но в то же время для opacity этих элементов установлено значение 1, а не 0 ... на самом деле все элементы имеют opacity из 1 ... и следовательно, все мои ярлыки отображаются, и в результате многие из них перекрываются.

Конечно, если я динамически редактирую теги стиля в Dev Tools, чтобы изменить opacity на 0 для те элементы, которые имеют класс highcharts-data-label-hidden, метки красиво выложены без какого-либо перекрытия.

Я тщетно пытался в течение нескольких часов выяснить, почему мой код устанавливает opacity на 1 даже для этих метки, которые должны быть скрыты, несмотря на то, что класс highcharts-data-label-hidden явно назначен правильно. Мне нужна ваша помощь, даже на основании этой, по общему признанию, ограниченной информации.

Одним из ключей может быть то, что я также заметил, что класс highcharts-data-label-color-0 появляется в рабочем примере для каждого элемента, тогда как highcharts-data-label-color-undefined появляется в моем. Глядя на исходный код H C, похоже, что это dataLabel.addClass(' highcharts-data-label-color-' + point.colorIndex ..., поэтому point.colorIndex в моем случае должно оканчиваться как undefined, но я не уверен, почему и связано ли это с проблемой. Я смотрю с нескрытыми ярлыками. Я делаю некоторые «продвинутые» вещи с раскраской точек и меток в своем коде, так что я могу установить цвет метки в соответствии с цветом точки, даже если действует цветовой градиент (это делается после диаграммы нагрузки). Но я ничего не делаю с непрозрачностью метки, насколько я знаю ... даже не знаю как ... объект dataLabels даже не имеет элемента opacity, который нужно изменить.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ

Наконец удалось сделать простую копию , просто чтобы доказать, что я не схожу с ума ! Если вы запустите этот пример и проверите перекрывающиеся элементы меток, вы увидите, что (как описано выше) многие из них имеют класс highcharts-data-label-hidden и, тем не менее, имеют opacity: 1, что делает их видимыми, когда они не должны быть.

(частичное) решение, похоже, состоит в том, чтобы делать series.update(false) после каждой серии l oop (только одна серия в этом примере), а не chart.update() в конце ... согласно этот обновленный пример . Вопрос: почему не обязательно передавать true в обновление?

Однако, хотя это улучшение, все же есть странность ... после загрузки попробуйте нажать кнопку Unset Extremes .. . метки снова перекрываются.

И это не просто вызов setExtremes() без аргументов ... загрузите этот пример и нажмите Set Extremes один раз (OK), а затем дважды ( НЕ ОК) ... единственное изменение в этом примере - использование более широких крайностей, чем в оригинале, так что метки перекрываются. Что еще более странно в этом примере, некоторые ярлыки остаются скрытыми, а другие нет ... это не все или ничего.

Даже с первым простым воспроизведением , которое не работает при открытии, если вы нажмете Set Extremes, затем Unset Extremes, метки больше не будут перекрываться. Но снова нажмите Unset Extremes, и они снова перекрываются. Не могу понять, что здесь происходит.

На самом деле, потратив некоторое время на создание этого репро, я теперь замечаю, что оригинальный пример , который я привел в самом начале моего поста также показывает это поведение, без необходимости в событии load() ... откройте это снова ... сначала выглядит нормально, но затем нажмите кнопку Unset Extremes ... метки перекрываются! И в этой небольшой модификации все, что я сделал, это расширил диапазон для Set Extremes ... загрузите это и нажмите Set Extremes (ОК), а затем снова (НЕ ОК).

Как сделать Я гарантирую, что метки не перекрываются в этом контексте, всегда, независимо от того, какие крайние значения оси установлены (и в каком порядке установлены крайние значения)?

1 Ответ

2 голосов
/ 18 июня 2020

Спасибо за воспроизведение проблемы. Как я и думал раньше - это регресс. Раньше все нормально работало в версии 8.0.4. Я уже сообщал об этом на канале проблем Highcharts GitHub, где вы можете следить за этой веткой:

https://github.com/highcharts/highcharts/issues/13742

Последняя стабильная версия: https://jsfiddle.net/BlackLabel/vwc34nhz/

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://code.highcharts.com/8.0.4/highcharts.js"></script>

<div id="container"></div>

<button id="setextremes">Set extremes</button>
<button id="unsetextremes">Unset extremes</button>

Если вам не нужны новые функции, используйте версию 8.0.4, пока наши основные разработчики не исправят эту проблему.

...