Canvas 光标样式——更改 HTML5 Canvas 图形上的鼠标光标
当用户将鼠标移到 HTML5 Canvas 图形上时,更改鼠标光标。Konva 可以监听各个图形上的鼠标事件,并对舞台容器应用任何 CSS 光标样式,例如 pointer、crosshair、grab、move 或自定义光标。
**操作说明:**将鼠标移到每个五边形上,查看光标变化。
- 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 pentagon1 = new Konva.RegularPolygon({
x: 80,
y: stage.height() / 2,
sides: 5,
radius: 30,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
});
pentagon1.on('mouseover', function (e) {
e.target.getStage().container().style.cursor = 'pointer';
});
pentagon1.on('mouseout', function (e) {
e.target.getStage().container().style.cursor = 'default';
});
const pentagon2 = new Konva.RegularPolygon({
x: 180,
y: stage.height() / 2,
sides: 5,
radius: 30,
fill: 'green',
stroke: 'black',
strokeWidth: 4,
});
pentagon2.on('mouseover', function (e) {
e.target.getStage().container().style.cursor = 'crosshair';
});
pentagon2.on('mouseout', function (e) {
e.target.getStage().container().style.cursor = 'default';
});
const pentagon3 = new Konva.RegularPolygon({
x: 280,
y: stage.height() / 2,
sides: 5,
radius: 30,
fill: 'blue',
stroke: 'black',
strokeWidth: 4,
});
pentagon3.on('mouseover', function (e) {
e.target.getStage().container().style.cursor = 'move';
});
pentagon3.on('mouseout', function (e) {
e.target.getStage().container().style.cursor = 'default';
});
layer.add(pentagon1);
layer.add(pentagon2);
layer.add(pentagon3);
import { Stage, Layer, RegularPolygon } from 'react-konva';
import { useState } from 'react';
// Separate component for polygon that changes cursor directly
const SpecialPolygon = ({ x, y }) => {
// We use e.target approach here because this component doesn't have
// access to the Stage's cursor state from the parent component
const handleMouseOver = (e) => {
e.target.getStage().container().style.cursor = 'pointer';
};
const handleMouseOut = (e) => {
e.target.getStage().container().style.cursor = 'default';
};
return (
<RegularPolygon
x={x}
y={y}
sides={5}
radius={30}
fill="red"
stroke="black"
strokeWidth={4}
onMouseOver={handleMouseOver}
onMouseOut={handleMouseOut}
/>
);
};
const App = () => {
const [cursor, setCursor] = useState('default');
return (
<Stage
width={window.innerWidth}
height={window.innerHeight}
style={{ cursor }}
>
<Layer>
<SpecialPolygon
x={80}
y={window.innerHeight / 2}
/>
<RegularPolygon
x={180}
y={window.innerHeight / 2}
sides={5}
radius={30}
fill="green"
stroke="black"
strokeWidth={4}
onMouseOver={() => setCursor('crosshair')}
onMouseOut={() => setCursor('default')}
/>
<RegularPolygon
x={280}
y={window.innerHeight / 2}
sides={5}
radius={30}
fill="blue"
stroke="black"
strokeWidth={4}
onMouseOver={() => setCursor('move')}
onMouseOut={() => setCursor('default')}
/>
</Layer>
</Stage>
);
};
export default App;
<template>
<v-stage :config="stageSize">
<v-layer>
<v-regular-polygon
v-for="(pentagon, i) in pentagons"
:key="i"
:config="pentagon"
@mouseover="handleMouseOver($event, pentagon.cursor)"
@mouseout="handleMouseOut"
/>
</v-layer>
</v-stage>
</template>
<script setup>
const stageSize = {
width: window.innerWidth,
height: window.innerHeight
};
const pentagons = [
{
x: 80,
y: window.innerHeight / 2,
sides: 5,
radius: 30,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
cursor: 'pointer'
},
{
x: 180,
y: window.innerHeight / 2,
sides: 5,
radius: 30,
fill: 'green',
stroke: 'black',
strokeWidth: 4,
cursor: 'crosshair'
},
{
x: 280,
y: window.innerHeight / 2,
sides: 5,
radius: 30,
fill: 'blue',
stroke: 'black',
strokeWidth: 4,
cursor: 'move'
}
];
const handleMouseOver = (e, cursor) => {
e.target.getStage().container().style.cursor = cursor;
};
const handleMouseOut = (e) => {
e.target.getStage().container().style.cursor = 'default';
};
</script>