I want to have my svg paths (lines) have borders such that outlines are black, but the inside is another color. Line code:
self.lineFunction = function(dat) {
var self = this
var line = d3.svg.line().interpolate('linear');
var data = dat.map(function(d) {
return [self.xScale(d[0]), self.yScale(d[1].mean)];
});
return line(data);
}
self.lines = self.svg.selectAll('.line')
.data(d3.keys(self.data), function(d) {return d})
.enter()
.append('path')
.attr('d', function(d) {return self.lineFunction(self.data[d])})
.attr('class', 'line')
.style('stroke', 'blue')
.style('stroke-width', '2')
.style('fill', 'none');
A forward-looking answer: if SVG2 was supported you could use the paint-order
property (assuming the fill is opaque):
.pathWithBorder {
paint-order: stroke fill;
stroke-width: 1.8;
stroke: black;
fill: blue;
}
Then there's no need to duplicate the path
element, and the stroke will only be visible outside the shape.
You have to create a slightly thinner line along the same path:
inner = self.svg
.selectAll('.inner')
.data(d3.keys(self.data), function(d) { return d; })
.enter().append('path')
.attr('d', function(d) {return self.lineFunction(self.data[d])})
.attr('class', 'inner')
.style('stroke', 'black')
.style('stroke-width', '1.8')
.style('fill', 'none');
This means you have two lines on top on one another, the lower one slightly protruding from the other, giving the impression of a border.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With