如何检测一个点是否在复杂的不规则矢量形状(SVG)内?
How to detect if a point is inside complex, irregular vector shape (SVG)?
我对这一切多少有些陌生。我正在尝试使用 SVG 创建一个应用程序(因为我宁愿使用可以缩放而不会降低质量的矢量形状)。使用网络技术,稍后将迁移到 react-native。
有什么方法可以让我找出一个点 (x,y 这也将由 CSS 的 left 和 top properties) 是在一个高度复杂的、不规则的矢量形状中?
我知道我的问题充满了局限性,因此很难回答,即使指向正确的文档也会有所帮助。
PS:我尝试了 elementFromPoint() 方法,但它 returns DOM 围绕我的 SVG 放置的边界矩形。这完全违背了我的目的,我想确保只在 SVG 路径中检测到该点并塑造自身。
任何帮助表示赞赏,
谢谢!
只要您使用内联 SVG,elementFromPoint()
应该可以正常工作:
const shape = document.querySelector('#shape'),
status = document.querySelector('#inout');
document.body.addEventListener('mousemove', function(e) {
const x = e.clientX,
y = e.clientY;
if(document.elementFromPoint(x, y) === shape) {
status.className = status.textContent = 'inside';
}
else {
status.className = status.textContent = 'outside';
}
});
h2 { margin: 0; }
.inside { color: lime; }
.outside { color: red; }
<h2>The cursor is: <span id="inout" class="outside">outside</span></h2>
<svg xmlns="http://www.w3.org/2000/svg" width="250" height="200">
<path id="shape" d="M150,120 q26,75 -80,50 c-80,-25 -53,-125 -26,-125 c53,-25 107,-25 107,50 q107,-50 53,50 z"
stroke-width="4" fill="yellow" stroke="limegreen" />
</svg>
我对这一切多少有些陌生。我正在尝试使用 SVG 创建一个应用程序(因为我宁愿使用可以缩放而不会降低质量的矢量形状)。使用网络技术,稍后将迁移到 react-native。
有什么方法可以让我找出一个点 (x,y 这也将由 CSS 的 left 和 top properties) 是在一个高度复杂的、不规则的矢量形状中?
我知道我的问题充满了局限性,因此很难回答,即使指向正确的文档也会有所帮助。
PS:我尝试了 elementFromPoint() 方法,但它 returns DOM 围绕我的 SVG 放置的边界矩形。这完全违背了我的目的,我想确保只在 SVG 路径中检测到该点并塑造自身。 任何帮助表示赞赏, 谢谢!
只要您使用内联 SVG,elementFromPoint()
应该可以正常工作:
const shape = document.querySelector('#shape'),
status = document.querySelector('#inout');
document.body.addEventListener('mousemove', function(e) {
const x = e.clientX,
y = e.clientY;
if(document.elementFromPoint(x, y) === shape) {
status.className = status.textContent = 'inside';
}
else {
status.className = status.textContent = 'outside';
}
});
h2 { margin: 0; }
.inside { color: lime; }
.outside { color: red; }
<h2>The cursor is: <span id="inout" class="outside">outside</span></h2>
<svg xmlns="http://www.w3.org/2000/svg" width="250" height="200">
<path id="shape" d="M150,120 q26,75 -80,50 c-80,-25 -53,-125 -26,-125 c53,-25 107,-25 107,50 q107,-50 53,50 z"
stroke-width="4" fill="yellow" stroke="limegreen" />
</svg>