两条SVG线重叠时的颜色问题
colour issues when 2 SVG lines are overlapping
在玩台词时遇到了这个问题。
当厚度为1px或1.5px的两条svg线重叠时,即使两条线的颜色相同,线的颜色也会变暗
var myLine = lineGraph.append("svg:line")
.attr("x1", 40)
.attr("y1", 50)
.attr("x2", 450)
.attr("y2", 50)
.style("stroke", "rgb(6,120,155)")
.style("stroke-width", 1);
当线的厚度大于2时,不会发生相同的问题。
这是我计算的例子
这通常会发生在所有奇数宽度的情况下,但与宽度为1的情况相比,它不会那么明显。
原因是您正是在像素边界上绘制1像素线。这意味着,由于抗锯齿,渲染器在一行像素上绘制50%的线,在下面的像素行上绘制50%。
实际上你不能画半个像素,所以它所做的是在每行上以50%的不透明度画像素。
+---+---+---+
|50%|50%|50%|
+---+---+---+ ...etc...
|50%|50%|50%|
+---+---+---+
对于第一行,它绘制了50%的白色(背景)和50%的蓝色的混合。
对于透支线,它绘制了50%蓝白混合和50%蓝的混合。结果变成了深蓝色。
解决方案
确保在半像素点绘制一条像素线,这样线就不会分割成两行像素。例如:
var myLine = lineGraph.append("svg:line")
.attr("x1", 40)
.attr("y1", 100.5)
.attr("x2", 450)
.attr("y2", 100.5)
.style("stroke", "rgb(6,120,155)")
.style("stroke-width", 1);
在这里演示
显然,对于垂直线,您需要在X坐标上添加0.5。
如果由于某种原因无法执行此操作,则另一种解决方案是将shape-rendering
属性设置为crispEdges
。
var myLine = lineGraph.append("svg:line")
.attr("x1", 40)
.attr("y1", 100)
.attr("x2", 450)
.attr("y2", 100)
.attr('shape-rendering', 'crispEdges')
.style("stroke", "rgb(6,120,155)")
.style("stroke-width", 1);
在这里演示
但是要注意,这会关闭线条的抗锯齿功能,所以如果它不是完全水平或垂直的,它看起来会很糟糕。
相关文章:
- Javascript if语句问题,以及如何在jquery中验证颜色
- 单击按钮更改颜色/清除画布时画布出现问题
- 颜色变化基于所列问题的编号
- YUI2 颜色选取器默认值问题
- 常见问题下拉列表 - 单击时文本颜色已更改
- 具有可选行的交替颜色行表的问题
- 条形图 d3.js 的颜色出现问题
- 颜色框的水平滚动问题
- Jquery 边框颜色切换问题
- 图像魔术裁剪 svg 问题:丢失所有颜色
- 堆栈溢出问题突出显示颜色
- 更改googlemapapi标记颜色的问题
- Yii颜色选择器更改事件问题
- CSS背景颜色问题
- 使用javascript更改标签颜色时出现问题
- 在dc.js柱状图上的颜色问题,当过滤到一个狭窄的范围
- jQuery手风琴标签的颜色问题
- HTML到PDF转换器由jspdf, Bg颜色问题
- 导航颜色问题
- 两条SVG线重叠时的颜色问题