【问题标题】:How to apply d3.js svg clipping after zooming缩放后如何应用 d3.js svg 剪辑
【发布时间】:2014-09-28 07:37:12
【问题描述】:

我正在尝试将 svg-clippath 与 d3.js 和缩放行为一起使用。 下面的代码创建一个矩形,然后将被矩形剪切区域剪切。

<svg class="chart"></svg>
<script>

var width = 800;
var height = 600;

var svg = d3.select(".chart")
        .attr("width", width)
        .attr("height", height)
        .append("g");

var clip = svg.append("defs")
    .append("clipPath")
    .attr("id","clip")
    .append("rect")
    .attr("width",200)
    .attr("height",200)
    .attr("x",100)
    .attr("y",100);


var zoom = d3.behavior.zoom().
    on("zoom",zoomed);

function zoomed(){
    container.attr("transform", "translate(" + d3.event.translate
    +")scale(" + d3.event.scale + ")");
    container.attr("clip-path","url(#clip)");
}

    svg.call(zoom);

var container = svg.append("g")
    .attr("clip-path","url(#clip)");

var rect = container.append("rect")
    //.attr("clip-path","url(#clip)")
    .attr("class","bar")
    .attr("x",150)
    .attr("y",150)
    .attr("width",350)
    .attr("height",350);

</script>

我想要的是在缩放/移动后再次应用剪辑(这样我就不能 将矩形移出剪切区域,现在我可以毫无问题地做到这一点。)我该怎么做?

我假设当前行为是由于在转换之前应用了剪辑这一事实引起的。

【问题讨论】:

    标签: javascript css svg d3.js


    【解决方案1】:

    我遇到了同样的问题,并花了最后几个小时试图找出解决方案。显然,剪辑路径在转换之前对对象进行操作。所以我在执行缩放转换时尝试对剪辑对象进行反向转换,这很有效!

    它的精神是:

    var clip_orig_x = 100, clip_orig_y = 100;
    function zoomed() {
        var t = d3.event.translate;
        var s = d3.event.scale;
    
        // standard zoom transformation:
        container.attr("transform", "translate(" + t +")scale(" + s + ")"); 
    
        // the trick: reverse transform the clip object!
        clip.attr("transform", "scale(" + 1/s + ")")
            .attr("x", clip_orig_x - t[0]) 
            .attr("y", clip_orig_y - t[1]);
    }
    

    其中clip 是clipPath 中的矩形。由于缩放和平移之间的交互作用,您需要显式设置“x”和“y”,而不是使用变换。

    我相信经验丰富的 d3 程序员会想出更好的解决方案,但这可行!

    【讨论】:

    • 在我之前的回答中,我忘记指出剪辑矩形的原点(假设为 0、0),所以它会偏离 100、100。
    • 是的,这就是我所怀疑的。感谢您的确认。反向转换解决了这个问题。
    猜你喜欢
    • 2014-11-12
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多