Lars Kotthof имеет хорошее объяснение здесь о том, как создавать SVG элементы, которые соответствуют размеру текста. Тем не менее, я хочу сделать это динамически с данными, вытащенными из JSON или CSV.
svg.selectAll('rect')
.data(states.features)
.enter()
.append('rect')
.attrs({
x: function(d) { return path.centroid(d)[0] - 50; },
y: function(d) { return path.centroid(d)[1] - 13; },
'text-anchor': 'middle',
'width': 100,
'height': 18,
'fill': 'rgba(232, 232, 232, 0.8)',
'opacity': 1,
'rx': 7,
'ry': 7
});
svg.selectAll('text')
.data(states.features)
.enter()
.append('text')
.text(function(d) { return d.properties.name; })
.attrs({
x: function(d) { return path.centroid(d)[0]; },
y: function(d) { return path.centroid(d)[1]; },
'text-anchor': 'middle',
'font-size': '7pt',
'fill': 'rgb(25,25,25)',
'opacity': 1
});
Я не понимаю, как я могу написать функцию, похожую на Lars, которая создает как <rect>
и <text>
и использует размеры текста для определения размеров прямоугольника.
Вот решение и связанный с ним скрипт. В основном то, что я сделал, присваивается соответствующим идентификаторам каждому прямоугольнику и тексту, а затем после того, как тексты были сгенерированы, поправьте размер прямоугольника на основе текста. Кроме того, необходимо было соответственно отрегулировать положение текста в тексте x.
svg.selectAll('rect')
.data(states.features)
.enter()
.append('rect')
.attrs({
y: function(d) { return path.centroid(d)[1] - 13; },
'text-anchor': 'middle',
'width': 100,
'height': 18,
'fill': 'rgba(232, 232, 232, 0.8)',
'opacity': 1,
'rx': 7,
'ry': 7
});
svg.selectAll('text')
.data(states.features)
.enter()
.append('text')
.text(function(d) { return d.properties.name; })
.attrs({
x: function(d) { return path.centroid(d)[0]; },
y: function(d) { return path.centroid(d)[1]; },
'text-anchor': 'middle',
'font-size': '7pt',
'fill': 'rgb(25,25,25)',
'opacity': 1,
id: function(d) { return 'text' + d.id }
});
svg.selectAll('rect')
.attr('width', function(d) { return document.getElementById('text'+d.id).getBBox().width; })
.attr('x', function(d) { return path.centroid(d)[0] - document.getElementById('text'+d.id).getBBox().width / 2; });
filter
я получил проблемы сглаживания. Мне любопытно, какое влияние это оказывает на время загрузки, но этот метод поможет мне в решении новых проблем.
filter
похоже, вызывает проблемы с сглаживанием.