HTML5 canvas Line Tutorial
To create line shapes with Konva
, we can instantiate a Konva.Line()
object. Lines can be configured in different ways to create various shapes like simple lines, splines, blobs, and polygons.
For full list of properties and methods, see the Line API Reference.
Simple Line
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const redLine = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round' }); // dashed line const greenLine = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'green', strokeWidth: 2, lineJoin: 'round', dash: [33, 10] }); greenLine.y(50); layer.add(redLine, greenLine);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="red" strokeWidth={15} lineCap="round" lineJoin="round" /> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="green" strokeWidth={2} lineJoin="round" dash={[33, 10]} y={50} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="redLineConfig" /> <v-line :config="greenLineConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const redLineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round' }; const greenLineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'green', strokeWidth: 2, lineJoin: 'round', dash: [33, 10], y: 50 }; </script>
Spline (Curved Line)
To create a curved line, add the tension
property:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const line = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round', tension: 1 }); layer.add(line);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="red" strokeWidth={15} lineCap="round" lineJoin="round" tension={1} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="lineConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const lineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round', tension: 1 }; </script>
Polygon
To create a polygon, set the closed
property to true:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const polygon = new Konva.Line({ points: [73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true }); layer.add(polygon);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93]} fill="#00D2FF" stroke="black" strokeWidth={5} closed /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="polygonConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const polygonConfig = { points: [73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true }; </script>
Blob
To create a blob, combine closed
and tension
properties:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const blob = new Konva.Line({ points: [23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true, tension: 0.3 }); layer.add(blob);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93]} fill="#00D2FF" stroke="black" strokeWidth={5} closed tension={0.3} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="blobConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const blobConfig = { points: [23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true, tension: 0.3 }; </script>