我想看看当我手动构造变换矩阵时是否可以正确获得矩阵值。带有
id=One
的元素已经提供了变换元素。对于带有 id=Two
的元素,我手动构造了与 id=One
完全相同的变换元素。然而,当我记录两者的合并矩阵时,它们并不相同。
如何才能使
id=Two
获得与 id=One
相同的合并矩阵值。我做错了什么?
console.log(document.querySelector('#one')
.transform.baseVal.consolidate().matrix);
const svg = document.querySelector('svg');
const testElement = document.querySelector('#two');
const transformList = testElement.transform.baseVal;
let matrix = svg.createSVGMatrix();
matrix = matrix.translate(-247.890625, -60).scale(1, 0).translate(247.890625, 60);
const transform = svg.createSVGTransformFromMatrix(matrix);
transformList.appendItem(transform);
transformList.consolidate();
console.log(matrix);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Transformations</title>
<script type="text/javascript" src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720">
<rect class="vBoxRect" width="1280" height="720" fill="#EFEFEF"></rect>
<g class="test" transform="translate(400,300)">
<text id="one" x="10" y="60" stroke="red" fill="red" font-size="45px" text-anchor="start" transform="translate(-247.890625,-60)scale (1,0)translate(247.890625,60)" style="text-rendering: geometricprecision; font-size: xxx-large;">F</text>
<text id="two" x="10" y="60" stroke="green" fill="green" font-size="45px" text-anchor="start" style="text-rendering: geometricprecision; font-size: xxx-large;">X</text>
</g>
</svg>
<script type="text/javascript"></script>
</body>
</html>
SVGMatrix.scale(s)
不同,
DOMMatrix.scale(sx, sy)
仅需要一个参数。该因子统一应用于两个维度。您需要使用SVGMatrix.scaleNonUniform(sx, sy)
。
不幸的是,目前浏览器在执行
svg.createSVGMatrix()
并返回 SVGMatrix
时仅实现 SVG 1.1。使用 SVG 2,返回值将是 DOMMatrix
,并且您的代码将有效。