在SVG或raphaeljs中制作1像素宽的线条是可行的吗?
以下是代码:
var p = Paper.path("M1 1 L50 1");
p.attr("stroke", "#D7D7D7");
p.attr("stroke-width", "1");
p.attr("opacity", 0.5);
如何绘制看起来像是 2px 或者 3px 的线条?有没有其他的替代方案?
在SVG或raphaeljs中制作1像素宽的线条是可行的吗?
以下是代码:
var p = Paper.path("M1 1 L50 1");
p.attr("stroke", "#D7D7D7");
p.attr("stroke-width", "1");
p.attr("opacity", 0.5);
如何绘制看起来像是 2px 或者 3px 的线条?有没有其他的替代方案?
SVG线条位于它们表面上的正确坐标之间,所以当你声明M1 1 L50 1
时,它将在像素顶部绘制半个像素,并在像素底部绘制另一半,使得它看起来像是一条厚重的半透明线。
要解决这个问题,你需要在半个像素处进行绘制,或者将元素平移半个像素,例如:element.translate(0.5, 0.5)
你可以在这里查看模糊和清晰的线条效果:http://jsfiddle.net/k8AKy/
Paper.renderfix()
函数,因为你不知道用户将使用哪种浏览器。修复了Firefox和IE9关于亚像素渲染的问题。如果画布依赖于其他元素,那么在重排后它可能会移动半个像素,导致线条失去清晰度。这个方法可以解决这个问题。
+0.5:
SVG_Area.setAttribute("viewBox", "0.5 0.5 " + width + " " + height);或者通过包装器:
function fiXY(x) { return parseInt(x) + 0.5; }或者通过:
var rect = document.createElementNS(SVGobj.svgNS, "rect"); rect.setAttribute("x", fiXY(x)); rect.setAttribute("y", fiXY(y));
SVG_Area.setAttribute("shape-rendering", "crispEdges");这将影响您SVG图像中的所有形状....