SVG:反转父变换上的子对象旋转
SVG: reverse children rotation on parent transform
我在这个plunker中摆弄D3.js。它主要做我想做的事,但我注意到有一点不一致。
其思想是第二个滑块旋转容器中的SVG元素。由于其中的元素实际上是text
元素,我希望将它们显示为未旋转,因此,我使用滑块中的对称值将transform: rotate
应用于它们。
尽管如此,我注意到通过这样做,text
元素不会围绕它们的中心旋转,而是围绕它们的左上角旋转(我认为)。当观察边附近的点并查看in如何在旋转时转置边时,这一点最为明显。
我已经尝试在这些元素上将text-anchor
和alignment-baseline
都设置为middle
,希望它能偏移text
路径,但显然它不会改变它们旋转时的枢轴点。
此外,如果我尝试用轴心点坐标设置rotate
,它会将一些translate
应用到元素上,从而完全混淆效果,我无法理解。
不确定getBBox()
是否能在这方面对我有所帮助,但我已经考虑过可能将这些点的宽度/高度偏移一半。不过,这似乎有点复杂,我希望能有一个更简单/更优雅/更干净的解决方案。
有什么想法吗?
好吧,这很尴尬。在我发布了这个问题之后,我在D3.js文档中找到了答案:polygon.centroid().
基本上,我使用该函数的返回值作为transform: rotate
轴点坐标,并处理偏移。示例(上面plunker的第99行,rotate()函数):
(...)
var textElement = d3.select(this);
return justTranslate+"rotate("+ -value+ textElement.centroid() +")";
(...)
希望这能帮助到任何有同样问题的人。
编辑:由于某种原因,Chrome的控制台显示:
未捕获的类型错误:textElement.centroid不是函数
但这种行为正是我想要的。不知道为什么。
EDIT2:最终将上述答案更改为getBBox()
方法,因为之前的编辑错误导致滑块移动中断。
更改为:
text.attr("transform", function(d){
var textElement = d3.select(this);
var current = textElement.attr("transform");
var alreadyRotated = current.indexOf('rotate');
var justTranslate = current.substring(0, alreadyRotated != -1 ? alreadyRotated : current.length);
var bbox = textElement.node().getBBox();
var point = [bbox.x + 0.5*bbox.width, bbox.y + 0.5*bbox.height];
return justTranslate+"rotate("+ -value +" "+ point +")";
});
- 旋转后拖动对象
- 在JS中围绕旋转对象旋转对象
- Threejs-围绕中心旋转对象
- 如何在使用Kinetic拖动同一对象后,在旋转动画中保持先前的偏移
- 根据摄影机视图更改计算对象旋转
- 使用tween.js围绕世界轴旋转对象
- 在HTML5画布中,是否可以围绕旋转对象旋转对象
- 在拉斐尔中将对象作为一个组旋转
- 从对象旋转对象.带有自定义动画功能的trix.setrotationfromleuler
- 将一个对象自身旋转并围绕另一个中心对象旋转三.js
- 根据键盘 threejs 更改对象旋转动画方向
- WebGL在一个轴上围绕另一个对象旋转一个对象
- 使用Three.js围绕对象旋转相机
- SVG:反转父变换上的子对象旋转
- Three.js赢得't在对象旋转时渲染
- three.js面向对象旋转
- 如何在每次点击时用CSS转换/转换JS将对象旋转120度
- 对象旋转中的对象
- 获取对象旋转后的实际绑定区域
- HTML5 JavaScript-将对象旋转到目标