reactjs - 将包含在 div 中的粘性 SVG 元素定位为溢出
问题描述
有没有办法position: sticky
在 SVG 内部使用?类似于此示例的工作方式。
为了使事情稍微复杂化,我希望position: sticky
在另一个 SVG 元素中div
使用overflow:auto
. 我创建了一个示例,说明我要在此代码框内实现的目标。
编辑 1:不确定这是否会有所不同,但对于我自己的应用程序中的上下文,我正在使用 react 和 react-redux 来包含/排除形状以形成图形。要求是在滚动时将某些元素保留在视口的顶部,就像您要冻结标题/行时 Excel 一样。
编辑 2:更新沙箱以包含答案的代码
解决方案
No. position
是仅适用于 HTML 元素的属性。它在 SVG 中无效。
您将需要使用 Javascript。添加 onscroll 事件处理程序以观察滚动并重新定位 SVG 元素。
window.addEventListener("scroll", function(evt) {
document.getElementById("sticky-rect").setAttribute("y", screenYtoSVGUnits(window.scrollY) + 10);
});
// Converts a screen Y position to SVG units which have a viewBox transform
function screenYtoSVGUnits(val) {
const svg = document.getElementById("mysvg");
let pt = svg.createSVGPoint();
pt.x = 0;
pt.y = val;
pt = pt.matrixTransform(svg.getCTM().inverse());
return pt.y;
}
<svg id="mysvg" viewBox="0 0 100 500">
<line x1="0" y1="0" x2="100" y2="500" stroke="black" stroke-width="1"/>
<rect id="sticky-rect" x="0" y="10" width="100" height="10" fill="red"/>
</svg>
推荐阅读
- arrays - 添加维度numpy数组
- vbscript - 有没有办法在画布类中下载“图像”?
- java - Java:小键/值持久化器
- java - 在用于项目 Gridview 的自定义适配器中实现 Glide
- kendo-ui - 如何更改剑道条形图/折线图的路径填充颜色?
- c# - 有没有办法为 MenuItem ItemSource 的前 10 个项目分配 InputGestureText?
- node.js - 有没有办法通过 Graph API 检查是否已在应用程序上授予 requiredResourceAccess?
- cygwin - 如何修复 apt-cyg 中的“无法找到包”错误
- java - 如何在 Android Studio 中创建 Fuseki SPARQL 服务器连接
- javascript - 如何在组中使用 keydown 事件?