Пользовательские стили на легендах Highcharts

1

У меня есть пользовательские стили в легендах Highcharts, которые отлично работают. Когда я нажимаю элемент, я хочу применить другой стиль, чтобы отобразить отключение кнопки. Для этого я использовал счетчик, т.е. Когда счетчик ровный, должен применяться активный стиль, а нечетный счетчик должен использоваться нечетным. Это не работает должным образом, я думаю, проблема связана с областями. Вы найдете следующий код:

var clickCounter = 0;
Highcharts.chart('container', {

    plotOptions: {

        series: {
            events: {
                legendItemClick: function () {
                    clickCounter++;
                    return clickCounter;
                }
            },
            showInLegend: true
        }
    },

    legend: {
        useHTML: true,
        labelFormatter: function (clickCounter) {
        		if(clickCounter%2 == 0)
            return '<span class="span-legend-active">' + this.name + '</span>'
            else
            return '<span class="span-legend-item-inactive">' + this.name + '</span>'
        }
    },

    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },

    series: [{
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
    }, {
        data: [11.9, 31.5, 78.4, 29.2, 44.0, 76.0, 95.6, 48.5, 116.4, 114.1, 35.6, 154.4]
    }]
});
.span-legend-active {
    background-color: white;
    border: 1px solid green;
    /* border: none; */
    color: black;
    padding: 3px 7px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 13px;
    
}

.span-legend-item-inactive {
    background-color: white;
    border: 1px solid #cccccc;
    color: #cccccc;
    padding: 3px 7px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 13px;
  
}
<script src="https://code.highcharts.com/highcharts.js"></script>

<div id="container" style="height: 400px"></div>

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

Теги:
highcharts

2 ответа

1
Лучший ответ

Я думаю, вам не нужно использовать событие legendItemClick для этого. Вы можете попытаться изменить свои селектор CSS с помощью:

.highcharts-legend-item > span > span {
    (active style)
}
.highcharts-legend-item-hidden > span > span {
    (inactive style)
}

Ваш измененный код здесь.

  • 0
    Благодарю. Я думаю, что это лучший способ сделать это
0

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

Я сделал jsfiddle для переключения CSS ваших предметов легенды.

Вы можете установить класс в свою легенду, щелкнув вот так,

events: {
  legendItemClick: function(event) {
                     //console.log(event);
                     if(this.visible)
                       event.target.legendItem.element.firstChild.className = 'span-legend-item-inactive';
                     else
                       event.target.legendItem.element.firstChild.className = 'span-legend-active';
                   }
  }

Здесь this.visible является логической переменной, заданной Hightcharts, для обозначения видимости легенды или нет. Проверьте jsfiddle ссылки с сайта Highcharts.

Если он отображается во время onclick, вы можете назначить свой .span-legend-item-inactive класс, чтобы он был отключен. Аналогично, если он не отображается во время onclick, вы можете назначить .span-legend-active чтобы он выглядел включенным. Вы можете предоставить имена разделенных пространствами, если вы хотите назначить несколько классов или использовать event.target.legendItem.element.firstChild.classList

Кроме того, Highcharts передает event объекта к этим функциям событий. Вы можете отключить его и проверить методы или переменные, которые вы можете использовать для своей цели.

Кроме того, this.color даст текущий цвет строки строки. Таким образом, вы можете использовать это, чтобы установить цвет легенды или цвет границы в labelFormatter с чем-то вроде этого,

return '<span class="span-legend-active" style="border-color:${this.color}">${this.name}</span>'

Ссылка на jsfiddle.

Старый ответ:

Функция labelFormatter() не предоставляет никаких аргументов для функции, поэтому clickCounter undefined.

Поэтому не давайте clickCounter вашей функции labelFormatter, она будет взята из глобальной области.

   legend: {
        useHTML: true,
        labelFormatter: function () {}
    }
  • 0
    Я попытался удалить то же самое, и это берет из глобальной области, но увеличение clickCounter не отражает. Следовательно, логика не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню