2016-04-07 9 views
2

私はD3.jsでグラフを描画していますが、私は実際のチャート領域(線、プロットなど)として<rect>を使用しています。ユーザーがドラッグしたときにグラフゾーンがオーバーフローしないように、パスは<rect>にのみ追加されます。今のところ、それは次のようになります。D3.js:矩形へのパスを追加します

Path overflow when user drags around

しかし、私が何をしようとしたとき:

var path = rect.append('path').attr(...) 

をパス自体にも表示されません。オリジナルバージョンは、ちょうどSVGへのパスを追加することであるwhicは動作します:

var path = svg.append('path').attr(...) 

pathrect内部に含有されていないので、私はまた、通常のHTML要素のようなoverflow:hiddenを行うことはできません。

pathrectを追加できない場合は、オーバーフローが発生しないように、パスの「アクティビティ領域」を制限する最善の方法は何ですか?

+1

どのようにして 'rect'を定義していますか?また、 'rect'要素が意味的に' path'要素を持つことになっているかどうかはわかりません。 'rect'を使う必要がある特定の理由はありますか?スタイリングのためのものであれば、おそらくCSSを使って何かをスタイルする方が理にかなっています。 – aug

+3

私が知る限り、 'rect'に' path'要素を追加することはできません。要素をまとめてグループ化する場合は、 'g'(グループ化)要素を使用する必要があります。これは、同じ 'transform'属性などを持つ複数の要素を持つ場合に便利です。 – JSBob

+0

@JSBobとにかく 'g'要素を修正しましたか?そのため、グラフ上をドラッグすると、 'path'だけが移動します。私はcss 'position:absolute'を使ってみましたが、動作していないようです。 – benjaminz

答えて

1

rectの中にpathが表示されないのは、SVG rect要素が子要素をサポートしていないためです。これらはコンテナではありません。

あなたがする必要があるのは、コンテナであるg(グループ)要素を含める代わりに、rectpathの両方をその内部に配置することです。これは、多数の個々のサブ要素の代わりにグループとやりとりすることができるという意味で、多数のD3の例がどのように機能するかを示しています。

rectの外に線が表示されないようにするには、最初にそれらの点の描画を省略するか、クリップパスを使用して描画した後にクリップするだけです。

私は、あなたのユースケースに一致する四角形のクリップパスを使って説明するための小さな例をまとめました。青い線は、クリップパスなしで塗りつぶされる領域を示しています。ただし、クリップパスが適用されると、実際の塗りつぶし領域が矩形の完全な定義よりはるかに小さいことがわかります。

.fill { 
 
    fill: steelblue; 
 
} 
 

 
.outline { 
 
    stroke: steelblue; 
 
    fill: none; 
 
}
<svg width="300" height="300"> 
 
    <defs> 
 
    <clipPath id="demoClip"> 
 
     <rect x="30" y="0" height="100" width="100"/> 
 
    </clipPath> 
 
    </defs> 
 
    
 
    <rect class="fill" x="0" y="0" width="200" height="200" clip-path="url(#demoClip)"/> 
 
    <rect class="outline" x="0" y="0" width="200" height="200"/> 
 
</svg>

関連する問題