lib3d で述べたように、Setを使用する必要があります。ただし、セットの内容をループして属性/機能を適用するために使用するのではなくforEach
、共有の属性/機能をセット自体に追加して、セットの内容に適用することができます。詳細は後述しますが、まずセットを作成する方法を見てください。
セットの取り扱い
セットを作成して要素を追加するには、明示的方法と暗黙的方法の 2 つがあります。
明示的
これは、自分でセットを管理し、自分でセットに要素を追加することを意味します`
var paper, shapeA, shapeB, shapeC, elementSet;
paper = Raphael(10, 50, 960, 560);
elementSet = paper.set();
shapeA = paper.path("M339.098,175.503c0,0-55.555,58.823-16.34,75.163s227.451,49.02,227.451,49.02s67.321-25.49,47.713-50.98s-71.896-78.432-71.896-78.432L339.098,175.503z");
shapeB = paper.path("M548.902,306.876c0,0-209.15-32.026-228.758-46.405s-27.451-27.451-20.262-42.484s26.797-44.444,26.797-44.444l-41.83-86.928l-76.471,77.125c0,0-25.49,169.935,48.366,171.242s292.157-4.575,292.157-4.575V306.876z");
shapeC = paper.path("M296.614,86.614l38.562,83.66l194.771-7.843l75.817,81.7c0,0,130.066-84.967,73.203-118.301S503.15,48.706,463.935,51.974S296.614,86.614,296.614,86.614z");
// now add A and C to the set, as well as a rectangle
elementSet.push(
shapeA,
shapeC,
paper.rect(10, 10, 10, 10, 2)
);
このようにして、セットに入るものと入らないものを完全に制御できます。
暗黙
また、要素を描画するときに始点と終点をマークする機能もあります。始点と終点の間に描画されるすべての要素がセットに追加されます。
var paper, shapA, shapeB, shapeC, elementSet;
paper = Raphael(10, 50, 960, 560);
paper.setStart();
shapeA = paper.path("M339.098,175.503c0,0-55.555,58.823-16.34,75.163s227.451,49.02,227.451,49.02s67.321-25.49,47.713-50.98s-71.896-78.432-71.896-78.432L339.098,175.503z");
shapeB = paper.path("M548.902,306.876c0,0-209.15-32.026-228.758-46.405s-27.451-27.451-20.262-42.484s26.797-44.444,26.797-44.444l-41.83-86.928l-76.471,77.125c0,0-25.49,169.935,48.366,171.242s292.157-4.575,292.157-4.575V306.876z");
shapeC = paper.path("M296.614,86.614l38.562,83.66l194.771-7.843l75.817,81.7c0,0,130.066-84.967,73.203-118.301S503.15,48.706,463.935,51.974S296.614,86.614,296.614,86.614z");
paper.rect(10, 10, 10, 10, 2);
elementSet = paper.setFinish();
変数 elementSet には、形状 A、B、および C と長方形が含まれています。
明示的または暗黙的?
個人的には、常に明示的な方法を使用することをお勧めします。そうすれば、セットに入るものと入れないものを 100% コントロールできます。また、setStart() と setFinish() の名前が逆になっていることがわかりました。「set」で「開始」していて、「開始」を「設定」していません。これは意図を理解すれば明らかかもしれませんが、それはまさにあいまいな命名の危険性です。
より多くの使用法
私たちが作成したアプリケーションでは、要素の複雑なグループを描画、削除、更新、および再配置する必要がありました。これを実現するために、セットを多用しました。セットを使用すると、セット内のすべての要素に属性を適用できますが、セットを使用すると、それを DTO として使用することもできます。
たとえば、次のように動作します。
var elementSet = paper.set();
elementSet.push(elemA, elemB, elemC);
elementSet.myApp.someDTO = {
property: value,
something: else
};
myApp
一貫性と明確さのために、名前空間としてを使用する傾向があります。その優れた点は、someDTO に Raphael 要素が含まれていても、セットに適用したものはすべて DTO の要素には適用されないことです。これにより、必要に応じてコンテキスト、座標などを渡すのに非常に便利になります。
セットの使用
ここで、セットを使用する利点に戻ります。ここでユースケースを確認しましょう。属性を適用し、任意の量のパスにカーソルを合わせたいとします。
上記の明示的な例のようにセットを作成すると、次のようになります。
var paper, elementSet;
paper = Raphael(10, 50, 960, 560);
elementSet = paper.set();
elementSet.push(
paper.path("M339.098,175.503c0,0-55.555,58.823-16.34,75.163s227.451,49.02,227.451,49.02s67.321-25.49,47.713-50.98s-71.896-78.432-71.896-78.432L339.098,175.503z"),
paper.path("M548.902,306.876c0,0-209.15-32.026-228.758-46.405s-27.451-27.451-20.262-42.484s26.797-44.444,26.797-44.444l-41.83-86.928l-76.471,77.125c0,0-25.49,169.935,48.366,171.242s292.157-4.575,292.157-4.575V306.876z"),
paper.path("M296.614,86.614l38.562,83.66l194.771-7.843l75.817,81.7c0,0,130.066-84.967,73.203-118.301S503.15,48.706,463.935,51.974S296.614,86.614,296.614,86.614z"),
);
セットにスタイリングを適用します。
elementSet.attr({
fill: '#33CCFF',
stroke: '#000000',
'stroke-width': 5
});
次に、ホバーを追加します。
elementSet.hover(
function(){
this.animate({
"fill": "#FF3300"
}, 500);
},
function(){
this.animate({
"fill": "#33CCFF"
}, 500)
}
);
要素と同様に、セットも連鎖をサポートします。
elementSet.push(
/* elements */
).attr({
/* attributes */
}).hover(
/* hover fn's
);
最終結果を表示するには、ここにフィドルがあります
ホバー機能の拡張
オンホバー ハイライトをすべての要素に適用する必要がある場合は、セットに属性を再度適用するだけです。
onMouseOver: function () {
elementSet.animate({
fill: '#FF3300'
}, 500);
};
onMouseOut: function () {
elementSet.animate({
fill: '#33CCFF'
}, 500);
};
elementSet.hover(onMouseOver, onMouseOut);
これを表示するフィドルはここにあります
jQuery の使用
jQuery を介してホバー機能をバインドできるようにするには、要素のノードにアクセスする必要があります。要素自体は DOM ノードではなく、Raphael オブジェクトです。を使用するelement.node
ことで、そのノードで jquery を使用して動作を追加できます。私の個人的な経験では、これはうまく機能しますが、本当に予期しない動作につながる可能性があるため、jquery を使用してノードを変更することは決してありません。Raphael は、必要なすべての機能を提供します。jquery を使用する必要はありません。