Хорошо, я понял, что вы хотели :)
Мы можем просто использовать пара дополнительных функций в нашем c3.generate
вызовите и немного расширьте библиотеку, это даст вам еще больше гибкости ibility. Просто определите свои длинные метки внутри функции oninit
.
Вот это jsFiddle, наведите курсор на легенду, чтобы увидеть: https://jsfiddle.net/abacaj90/6v2tpft2/14/
function insertAfter(referenceNode, newNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
function legendFollowMouse(e) {
var x = e[0];
var y = e[1];
return {
x: x - 50 + 'px',
y: y + 20 + 'px'
}
}
function createLegendTooltip() {
var svg = this.svg[0][0];
var frag = document.createDocumentFragment();
var div = document.createElement('div');
var span = document.createElement('span');
div.className = 'c3-legend-tooltip-container';
span.className = 'c3-legend-tooltip';
div.appendChild(span);
frag.appendChild(div);
insertAfter(svg, frag);
this.legendHoverNode = span;
}
function generateLegendHoverLabels(labels) {
createLegendTooltip.call(this);
var obj = {};
this.data.targets.map(function(data, i) {
if(typeof labels[i] !== 'undefined') {
obj[data.id] = data.id + ': ' + labels[i];
}
})
return obj;
}
var chart = c3.generate({
data: {
columns: [
['data1', 30, 200, 100, 400, 150, 250],
['data2', 20, 180, 240, 100, 190, 250],
['data3', 20, 180, 240, 100, 190, 250]
],
},
oninit: function() {
// declare your extra long labels here
var legendLongLabels = ['long content here, data3 doesnt have a tooltip!','even longer content here, you can style me with css!'];
this.legendHoverContent = generateLegendHoverLabels.call(this, legendLongLabels);
},
legend: {
item: {
onmouseover: function (id) {
// keep default behavior as well as our tooltip
d3.select(this.svg[0][0]).classed('c3-legend-item-focused', true);
if (!this.transiting && this.isTargetToShow(id)) {
this.api.focus(id);
}
// if we defined the long labels, display them
if (this.legendHoverContent.hasOwnProperty(id)) {
var coords = legendFollowMouse(d3.mouse(this.svg[0][0]))
this.legendHoverNode.parentNode.style.display = 'block';
this.legendHoverNode.parentNode.style.top = coords.y;
this.legendHoverNode.parentNode.style.left = coords.x;
this.legendHoverNode.innerHTML = this.legendHoverContent[id];
}
},
onmouseout: function (id) {
// keep default behavior as well
d3.select(this.svg[0][0]).classed('c3-legend-item-focused', false);
this.api.revert();
// just hide the tooltips
this.legendHoverNode.parentNode.style.display = 'none';
}
}
}
});
Вы хотите сказать, вы хотите иметь короткое имя данных, но показать свою полную длину в виде всплывающей подсказки при наведении над? – Aziz
Не обязательно, содержимое всплывающей подсказки может отличаться от исходного. Значит, я не хочу обрезать текст и показывать всю длину при наведении. имя данных может быть «привет», а затем «зависать». Сегодня это прекрасный день! – delmalki
Хорошо, но вы не хотите иметь более короткие значения? – Aziz