我参加聚会有点晚了,但我有一些对我有益的代码,我希望它也能帮助你。
@altocumulus 上面的代码非常详尽,而且效果很好。然而,它并不能完全满足我的需求,因为我是手动进行计算并且需要尽可能轻松地更改一些变换属性。
这可能不是适合所有人的解决方案,但对我来说是完美的。
function _getTokenizedTransformAttributeValue(transformStr) {
var cleanedUpTransformAttrArr = transformStr.split(')', ).slice(0,-1);
return cleanedUpTransformAttrArr.reduce(function(retObj, item) {
var transformPair = item.split('(');
retObj[transformPair[0]] = transformPair[1].split(',');
return retObj;
}, {});
}
function _getStringFromTokenizedTransformAttributeObj(transformAttributeObj) {
return Object.keys(transformAttributeObj).reduce(function(finalStr, key) {
// wrap the transformAttributeObj[key] in array brackets to ensure we have an array
// join will flatten the array first and then do the join so [[x,y]].join(',') -> "x,y"
return finalStr += key + "(" + [transformAttributeObj[key]].join(',') + ")";
}, '');
}
第一个功能的真正好处是我可以手动更改特定属性(例如旋转),而不必担心它如何影响平移或其他任何事情(当围绕一个点旋转时),而当我依赖在内置甚至d3.transform 方法上,它们将所有属性合并为一个值。
为什么这么酷?
想象一个 HTML
<g class="tick-label tick-label--is-rotated" transform="translate(542.8228777985075,0) rotate(60, 50.324859619140625, 011.402383210764288)" style="visibility: inherit;"></g>
使用 d3.transfrom 我得到:
对象形式
jr {rotate: 59.99999999999999, translate: [577.8600589984691, -37.88141544673796], scale: [1, 1], skew: 0, toString: function}
字符串形式
"translate(577.8600589984691,-37.88141544673796)rotate(59.99999999999999)skewX(0)scale(1,1)"
这在数学上是正确的,但让我很难简单地删除旋转角度和必须引入以围绕给定点旋转该元素的平移。
使用我的_getTokenizedTransformAttributeValue 函数
对象形式
{translate: ["542.8228777985075", "0"], rotate: ["60", " 50.324859619140625", " 011.402383210764288"]}
以字符串形式使用函数_getStringFromTokenizedTransformAttributeObj
"translate(542.8228777985075,0)rotate(60, 50.324859619140625, 011.402383210764288)"
这是完美的,因为现在当您移除旋转时,您的元素可以回到原来的位置
当然,代码可以更简洁,函数名称也可以更简洁,但我真的很想把它拿出来,这样其他人就可以从中受益。