使用 Konva 通过名称选择 HTML5 Canvas 形状教程
要用 Konva 按名称选择形状,我们可以使用 find()
方法结合 .
选择器。
find()
方法返回匹配选择器字符串的节点数组。
- 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 circle1 = new Konva.Circle({ x: 50, y: stage.height() / 2, radius: 30, fill: 'red', name: 'myCircle' }); const circle2 = new Konva.Circle({ x: 150, y: stage.height() / 2, radius: 30, fill: 'green', name: 'myCircle' }); const rect = new Konva.Rect({ x: 250, y: stage.height() / 2 - 25, width: 50, height: 50, fill: 'blue', name: 'myRect' }); layer.add(circle1); layer.add(circle2); layer.add(rect); // 按名称查找所有圆形 const circles = layer.find('.myCircle'); circles.forEach(circle => { // 仅对圆形添加动画 circle.to({ duration: 1, rotation: 360, easing: Konva.Easings.EaseInOut }); });
import { Stage, Layer, Circle, Rect } from 'react-konva'; import { useEffect, useRef } from 'react'; const App = () => { const layerRef = useRef(null); useEffect(() => { // 查找所有名称为 myCircle 的圆形并进行动画 const circles = layerRef.current.find('.myCircle'); circles.forEach(circle => { circle.to({ duration: 1, rotation: 360, easing: Konva.Easings.EaseInOut }); }); }, []); return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer ref={layerRef}> <Circle x={50} y={window.innerHeight / 2} radius={30} fill="red" name="myCircle" /> <Circle x={150} y={window.innerHeight / 2} radius={30} fill="green" name="myCircle" /> <Rect x={250} y={window.innerHeight / 2 - 25} width={50} height={50} fill="blue" name="myRect" /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer ref="layerRef"> <v-circle :config="circle1Config" /> <v-circle :config="circle2Config" /> <v-rect :config="rectConfig" /> </v-layer> </v-stage> </template> <script setup> import { ref, onMounted } from 'vue'; import Konva from 'konva'; const stageSize = { width: window.innerWidth, height: window.innerHeight }; const circle1Config = { x: 50, y: window.innerHeight / 2, radius: 30, fill: 'red', name: 'myCircle' }; const circle2Config = { x: 150, y: window.innerHeight / 2, radius: 30, fill: 'green', name: 'myCircle' }; const rectConfig = { x: 250, y: window.innerHeight / 2 - 25, width: 50, height: 50, fill: 'blue', name: 'myRect' }; const layerRef = ref(null); onMounted(() => { // 查找所有名称为 myCircle 的圆形并动画 const circles = layerRef.value.getNode().find('.myCircle'); circles.forEach(circle => { circle.to({ duration: 1, rotation: 360, easing: Konva.Easings.EaseInOut }); }); }); </script>