gpt4 book ai didi

javascript - 如何在 Chrome 中使用 javascript 操作 SVG 元素上的转换?

转载 作者:IT王子 更新时间:2023-10-29 03:18:04 24 4
gpt4 key购买 nike

我想使用 JavaScript 操作 SVG 元素的 transform="translate(x,y)" 属性。

所以我得到了这个 HTML 代码:

<body>

<svg id="test" preserveAspectRatio="xMidYMid meet" viewBox="0 0 100% 100%" xmlns="http://www.w3.org/2000/svg" version="1.1">
<rect transform="translate(100,100)" width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)" />
<rect transform="translate(400,400)" width="300" height="400" style="fill:red; stroke-width:1; stroke: yellow" />
</svg>

</body>

还有这段 JavaScript 代码:

var positioner = (function(domUtils){

var svg = document.getElementById("test");
var elementOffset = 100;

function getAbsoluteX(leftElement) {
return domUtils.getWidth(leftElement) + elementOffset;
}

function getAbsoluteY(topElement) {
return domUtils.getHeight(topElement) + elementOffset;
}

var rectangles = document.querySelectorAll("rect");
for(var i = 0; i < rectangles.length; ++i) {
var spaceLeft = 0;
if(i > 0) {
spaceLeft = getAbsoluteX(rectangles[i-1]);
}
var rect = rectangles[i];
var attrValue = "translate(" + spaceLeft + ", 100)";
rect.setAttribute('transform', attrValue);
};
})(domUtils);

其中getAbsoluteX()为自定义函数。

它在 firefox 中运行良好,但在 chrome 中运行不佳。任何人都知道解决方法或如何解决这个问题?

谢谢。问候。

最佳答案

有两种方法可以在 Chrome、Firefox、IE 或任何标准的 SVG 用户代理中获取/设置 SVG 元素的转换值:

通过属性处理转换

// Getting
var xforms = myElement.getAttribute('transform');
var parts = /translate\(\s*([^\s,)]+)[ ,]([^\s,)]+)/.exec(xforms);
var firstX = parts[1],
firstY = parts[2];

// Setting
myElement.setAttribute('transform','translate(30,100)');

优点:易于设置和理解(与标记相同)。
缺点:必须解析字符串值才能找到您想要的内容;对于动画值,当动画处于事件状态时不能请求基值;感觉很脏。

通过 SVG DOM 绑定(bind)处理转换

// Getting
var xforms = myElement.transform.baseVal; // An SVGTransformList
var firstXForm = xforms.getItem(0); // An SVGTransform
if (firstXForm.type == SVGTransform.SVG_TRANSFORM_TRANSLATE){
var firstX = firstXForm.matrix.e,
firstY = firstXForm.matrix.f;
}

// Setting
myElement.transform.baseVal.getItem(0).setTranslate(30,100);

优点:无需尝试自己解析字符串;保留现有的转换列表(您可以查询或调整列表中的单个转换);你得到的是真实的值,而不是字符串。
缺点:一开始可能难以理解;设置简单值时更详细;没有方便的方法从 SVGTransform.matrix 中提取旋转、缩放或倾斜值,缺少 browser support .

您可能会发现我编写的用于探索 DOM 的工具对此很有帮助。

  1. 转到 http://objjob.phrogz.net/svg/object/131
  2. 点击“显示继承的属性/方法?”复选框
  3. 看到 SVGRectElement 有一个 transform 属性,它是一个 SVGAnimatedTransformList
  4. 点击 SVGAnimatedTransformList 查看 the properties and methods that object supports .
  5. 探索!

关于javascript - 如何在 Chrome 中使用 javascript 操作 SVG 元素上的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10349811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com