javascript - 在悬停时反应 SVG 样式元素
问题描述
我在基于 SVG 的 React 组件中有一个正方形数组,我需要在悬停时将自定义样式(fill
颜色设置为purple
)应用于光标下的正方形。
我用 CSS :hover 和onMouseOver
events 都试过了,都没有用。
非常感谢任何线索
const { render } = ReactDOM,
rootNode = document.getElementById('root')
const Matrix = ({m, n}) => (
<svg
viewBox={`0 0 ${m*10+10} ${n*10+10}`} xmlns="http://www.w3.org/2000/svg"
>
<defs>
<rect
id="cell"
width="5"
height="5"
className="cell"
onMouseOver={({target}) => target.style.cssText="fill:purple"}
/>
</defs>
<g>
{
Array(n).fill().map((row, rowIdx) => (
<g key={rowIdx}>
{
Array(m).fill().map((col, colIdx) => (
<g key={colIdx}>
<use
x={5+colIdx*5}
y={5+rowIdx*5}
xlinkHref="#cell"
fill="lightgray"
stroke="white"
strokeWidth=".4"
/>
</g>
))
}
</g>
))
}
</g>
</svg>
)
render (
<Matrix m={10} n={10} />,
rootNode
)
#cell:hover {
fill: purple;
}
.cell:hover {
fill: purple;
}
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script></script><div id="root"></div>
解决方案
如果您必须为每个正方形着色,则必须.cell
在<use />
每个单元格中使用您的类:
<use
className="cell"
x={5+colIdx*5}
y={5+rowIdx*5}
xlinkHref="#cell"
fill="grey"
stroke="white"
strokeWidth=".4"
/>
现在您可以使用您的 css 样式:
.cell:hover {
fill: purple;
}
片段:
const { render } = ReactDOM,
rootNode = document.getElementById('root')
const Matrix = ({m, n}) => (
<svg
viewBox={`0 0 ${m*10+10} ${n*10+10}`} xmlns="http://www.w3.org/2000/svg"
>
<defs>
<rect
id="cell"
width="5"
height="5"
/>
</defs>
<g>
{
Array(n).fill().map((row, rowIdx) => (
<g key={rowIdx}>
{
Array(m).fill().map((col, colIdx) => (
<g key={colIdx}>
<use
className="cell"
x={5+colIdx*5}
y={5+rowIdx*5}
xlinkHref="#cell"
fill="grey"
stroke="white"
strokeWidth=".4"
/>
</g>
))
}
</g>
))
}
</g>
</svg>
)
render (
<Matrix m={10} n={10} />,
rootNode
)
.cell:hover {
fill: purple;
}
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script></script><div id="root"></div>
推荐阅读
- reactjs - 将网络应用上传到 Firebase 的过程
- c++ - 删除彼此太近的矢量线?
- azure-devops - 无法在 azure board 中对任务转换应用规则
- android - 如何在android 12中通过听筒播放音频?
- javascript - JavaScript:如何从 URL 获取第一个参数,实际上是第一个键?
- c - 使用带有 open() 的十六进制值访问文件
- c++ - 抛出异常:读取访问冲突。**这**是 0xCCCCCCCC
- algorithm - 在 Matrix 中查找特定对
- c# - VSCode + Unity 的测试框架?
- python - 我可以将文件保存在无服务器服务器中吗?