跳到主要内容

Line Join 边角

lineJoin 决定折线拐角的形状。默认的尖角在锐角处会伸出很长,需要留意。

用法​

要为Konva的形状设置线连接,我们可以在实例化形状时设置lineJoin属性,或者我们可以使用lineJoin()方法。

lineJoin属性可以设置为尖角,斜角或圆。 除非另有说明,否则默认线连接为尖角。

说明:鼠标经过三角形以更改其线连接点样式。

<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@10/konva.min.js"></script>
<meta charset="utf-8">
<title>Konva Line Join Demo</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #F0F0F0;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
var width = window.innerWidth;
var height = window.innerHeight;

var stage = new Konva.Stage({
container: 'container',
width: width,
height: height
});
var layer = new Konva.Layer();

var triangle = new Konva.RegularPolygon({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
sides: 3,
radius: 70,
fill: 'red',
stroke: 'black',
strokeWidth: 20,
lineJoin: 'bevel'
});

triangle.on('mouseover', function() {
this.lineJoin('round');
layer.draw();
});

triangle.on('mouseout', function() {
this.lineJoin('bevel');
layer.draw();
});

// add the shape to the layer
layer.add(triangle);

// add the layer to the stage
stage.add(layer);
</script>

</body>
</html>

常见问题​

三种取值该怎么选?​

miter(尖角,默认)适合直角和钝角,视觉上最锐利; round(圆角)适合手绘风格、粗线条,任何角度都平滑; bevel(斜角)是把尖角削平,介于两者之间。

实践中:技术图纸、流程图用 miter;手写笔迹、涂鸦用 round; 不确定角度范围又不想处理尖刺时用 bevel。

为什么锐角处伸出一根很长的刺?​

这是 miter 的固有行为——两条边的外侧延长线相交,角度越尖交点越远。 接近 180 度的折返时,尖角可以长到几十倍线宽。

用 miterLimit 限制:超过这个比例时自动退化为 bevel。 Canvas 的默认值是 10,需要更保守就调小。

或者干脆对可能出现锐角的线条用 round。

设了但看不出效果?​

lineJoin 只作用于折线的拐角。单段直线没有拐角,自然没有区别。

另外它和 lineCap 是两回事:前者管中间的连接处,后者管线条的两端。 想让线头也是圆的,要单独设 lineCap: 'round'。

与其他方案的取舍​

lineJoin 与 lineCap 分工明确:连接处 vs 端点。 做手绘笔迹这类效果时通常两个都设为 round,否则线段的起止端会是方的, 与圆润的拐角不协调。

如果你需要的是「每一段线都有独立的端点样式」,那 Konva.Line 做不到—— 它是一条连续路径。得拆成多个节点,或者用 Konva.Path 写多段子路径。

性能上三种取值差别很小,不必为此纠结。真正影响性能的是线条的顶点数量, 以及是否开了阴影。