ラファエル要素のカスタム属性を定義することは可能ですか?
例えば.
r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f', 'my_custom_attribute':'a value'});
これが必要な理由は、要素のセット全体に対して非常に複雑なアニメーションを実行したいので、各要素の元のy座標をどこかに保存したいからです。
必要なカスタム属性は次のとおりです。
.attr()
および.animate()
)?Raphaelに任意のデータを格納するための公式の意図された方法は、.data()
関数を使用することであると99%確信しています。
var circle = r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f'});
// set it
circle.data('custom-attribute', 'value');
// get it
data = circle.data('custom-attribute');
alert(data);
Raphael 2.1以降、これは要素に対して機能することに注意してくださいsetsではありません。セットにデータを割り当てる必要がある場合、データをfor
ループで設定し、someSet[0].data()
で取得する傾向があります。これは少し手間がかかりますが、機能します。
迷惑なことに .data
のドキュメント は(執筆時点で)それが何のためにあるのかについては何も述べていません...しかし、jQueryの.data()
、HTML5のdata-*
などすべてがこの目的を持っており、このように使用します。 SO他の人はこのように使用することを意図していると話します なので、私はかなり自信があります。これは、Raphaelオブジェクトに任意のデータを添付するための意図された方法です。
attr()
またはanimate()
によってトリガーされるカスタム関数Raphael属性のように動作するカスタム属性が必要な場合-attr
またはanimate
(Raphaelフックのようなもの)を使用して変更されたときに関数または変換をトリガーします-それが 紙)です。 customAttributes はです。これは、そのpaper
オブジェクト内の任意の要素に名前付きカスタム属性が設定されるたびに実行される関数を定義します。戻りオブジェクトは、要素の標準属性に適用されます。
公式ドキュメントには、これに非常に役立つ例がいくつかあります。これを適合させたものを次に示します。
// A custom attribute with multiple parameters:
paper.customAttributes.hsb = function (h, s, b) {
return {fill: "hsb(" + [h, s, b].join(",") + ")"};
};
var c = paper.circle(10, 10, 10);
// If you want to animate a custom attribute, always set it first - null isNaN
c.attr({hsb: "0.5 .8 1"});
c.animate({hsb: [1, 0, 0.5]}, 1e3);
各customAttribute実行内のthis
は、attrが設定されているRaphaelオブジェクトであることに注意してください。これの意味は...
Raphaelはこれを実際にはサポートしていないため、本当に必要な場合にのみこれを実行してください。しかし、Raphaelがサポートしていないマークアップで本当にneedする場合は、attr
とanimate
paper.customAttributes
とelement.node
を使用する(element.node
のドキュメントはほとんど役に立たないことに注意してください " それを台無しにしないでください "-それを台無しにすべきではない理由は、それですSVGまたはVML要素を直接提供します。つまり、Raphaelはユーザーが行った変更を認識しないため、Raphaelオブジェクトが制御する要素と同期しなくなり、問題が発生する可能性があります。注意しない限り、 、およびこのような手法を使用します...)。
これは、SVGプロパティdy
を設定する例です(jQueryも使用されていると仮定すると、jQueryは必須ではありませんが、より便利です)。これにより、Raphaelテキストの行間隔を制御できます(注-サンプルコードはまだありません) VML/IEでテスト済み。VMLモードで機能しない場合は更新されます):
paper.customAttributes.lineHeight = function( value ) {
// Sets the SVG dy attribute, which Raphael doesn't control
var selector = Raphael.svg ? 'tspan' : 'v:textpath';
var $node = $(this.node);
var $tspans = $node.find(selector);
$tspans.each(function(){
// use $(this).attr in jquery v1.6+, fails for SVG in <= v1.5
// probably won't work in IE
this.setAttribute('dy', value );
});
// change no default Raphael attributes
return {};
}
// Then to use it...
var text = paper.text(50,50,"This is \n multi-line \n text");
// If you want to animate a custom attribute, always set it first - null isNaN
text.attr({lineHeight: 0});
text.animate({lineHeight: 100},500);
私はあなたができると思います:
var circle = r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f'});
その後
circle["custom-attribute"] = value;
お役に立てれば。
はい、次のことができるはずです。
.attr({title: value});
もちろん、titleは設定または作成する属性の名前であり、valueは値である必要があります。もちろん、問題のラファエル要素はattrの受信者になります。