【问题标题】:D3 svg css - rotate line around centre using cssD3 svg css - 使用 css 围绕中心旋转线
【发布时间】:2018-11-07 20:05:26
【问题描述】:

我这里有一个笨蛋 - https://plnkr.co/edit/E2SJlCo141NhYatVEFMU?p=preview

我有 3 个三个带有开始和结束位置的小节。

起始位置可以高于或低于终点。

我想在条上画箭头来说明开始是在结束之前还是结束之后。

我在条上绘制箭头并根据条是向上还是向下添加类。

然后我想使用 css 通过旋转它们来设置箭头的方向。

这一切正常,但箭头并未围绕其中心旋转,因此位于栏外。

是否可以围绕其中心旋转箭头和线

.arrow-up{
  transform: rotate(180deg);
  transform-origin: center center;  
}

【问题讨论】:

    标签: css d3.js svg


    【解决方案1】:

    这看起来像是 SVG 中的 transform-origin 支持的问题 - “关键字和百分比是指画布而不是对象本身”。见Browser compatibility section here。该评论是针对 Firefox 列出的,但我在 Chrome 上也遇到了同样的问题。

    为了演示,我强制所有 3 个箭头使用向上箭头类,您可以看到它们似乎围绕同一点旋转。

    https://plnkr.co/edit/yQ4X18eb7VCItxXswMww?p=preview

    因此,您可以直接在 SVG 行上使用旋转变换。以下 plunker 具有您需要的代码的开头,但您需要计算数据的中心 x 和 y 值。

    https://plnkr.co/edit/JyT9ORnnMCETgpMyCjm1?p=preview

    这是您需要的一些代码,但正如我所说,您需要将 100 100 替换为您的旋转中心 x 和 y 值。您也可以省去向上箭头和向下箭头的类。

    bar.enter()
        .append("line")
        .attr("x1", d => x(d.phase) + x.bandwidth()/2)  
        .attr("y1", (d, i) => {
          if(d.start < d.finish){
            return y(d.finish)+10;
          }else{
            return y(d.start)+10;
          }
        })  
        .attr("x2", d => x(d.phase) + x.bandwidth()/2)  
        .attr("y2", (d, i) => {
          if(d.finish < d.start){
            return y(d.finish)-15;
          }else{
            return y(d.start)-15;
          }
        })  
        .attr('class', (d, i) => {
          return d.start > d.finish ? 'arrow-up' : 'arrow-up'
        })
        .attr("stroke","red")  
        .attr("stroke-width",2)
        .attr("marker-end","url(#arrow)")
        .attr("transform", (d) => {
          console.log(d.start, d.finish)
          console.log(x(d.phase), x.bandwidth()/2)
          return `rotate(180 100 100)`
        })

    【讨论】:

    • 如果你想让transform-origin使用对象本身,设置transform-b​​ox: fill-box;
    • @RobertLongson 谢谢,很有趣。它适用于 SVG 矩形,但似乎不适用于线条,因为它围绕线条的末端旋转,而不是被认为是中心。这可能有充分的理由,但我现在不知道那是什么。在此文件中演示:jsfiddle.net/bryanwadd/rm32afoj/3
    猜你喜欢
    • 2014-01-24
    • 2017-09-21
    • 2020-08-09
    • 1970-01-01
    • 2020-05-19
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多