ホームページ >ウェブフロントエンド >jsチュートリアル >高度なsnap.svg
以前の投稿では、snap.svgを始める方法を見てきました。この投稿では、最初の記事に記載されている新しい機能を詳しく見ていきます。
キーテイクアウト基本的に、マスクプロパティを要素に割り当てるだけです。実際のマスクとして使用する要素に注意する必要があります。最終要素の不透明度はマスク要素の白のレベルに比例するため、画像に完全な不透明度が必要な場合は、白の円を埋める必要があります。最初は迷惑に思えるかもしれませんが、次のセクションで見られるように、驚くべき効果の可能性が多くなります。
<span>var paper = <span>Snap</span>(800, 600), </span> img <span>= paper.image('bigImage.jpg', 10, 10, 300, 300), </span> bigCircle <span>= s.circle(150, 150, 100);</span>複雑なマスクを作成するために、明らかに異なる形状を組み合わせて構成できます。 SNAPは、あなたを助けるためにいくつかの構文砂糖を提供します:
<span>var paper = <span>Snap</span>(800, 600), </span> img <span>= paper.image('bigImage.jpg', 10, 10, 300, 300), </span> bigCircle <span>= s.circle(150, 150, 100);</span>
Paper.Mask()メソッドはPaper.g()に相当し、実際にはシームレスに置き換えることができます。
クリッピングスナップにはクリッピング用のショートカットがありませんが、attr()メソッドを使用して、任意の要素のクリップ、クリップパス、クリップルートプロパティを設定できます。
勾配
このコードをテストする場合、最終的な効果は正確に期待したものではありません。これは、上記の小文字の「R」で表される相対的な放射勾配タイプを使用したからです。相対勾配は、グループの各要素に対して個別に作成されます(複合マスクとして)。グループ全体に単一の勾配を持つことを好む場合は、コマンドの絶対バージョンを使用できます。 'r()#fff-#000'は、中心で白い塗りつぶしから始まり、境界で黒に分解される絶対的な放射勾配です。
bigCircle<span>.attr('fill', '#fff'); //This is IMPORTANT </span> img<span>.attr({ </span> <span>mask: bigCircle </span><span>});</span>要素の充填プロパティのSVG勾配を指定することで同じ結果を得ることができます。
この最後の例では、より複雑な勾配を示しました。異なるタイプ(絶対線形)に加えて、この勾配は(0、0)から(300、300)、黒から赤から25%になります。
gradient()メソッドは文字列を受け入れます。詳細については、SNAPのドキュメントで説明していますページ内の任意のSVG要素から既存の勾配を使用することもできます。
<span>var smallRect = paper.rect(180, 30, 50, 40), </span> bigCircle <span>= paper.circle(150, 150, 100), </span> mask <span>= paper.mask(bigCircle, smallRect); </span> mask<span>.attr('fill', 'white'); </span> img<span>.attr({ </span> <span>mask: mask </span><span>});</span>
パターン
パターンにより、別のSVG形状、勾配、または画像の発生を繰り返すことで形状を埋めることができます。 SNAPは、任意のスナップ要素からパターンを作成するelement.topattern()メソッド(formely、pattern()、debrecated)を提供します。
パターンを作成して要素を埋めることは非常に簡単です:
<span>var gradient = paper.gradient('r()#fff-#000'); </span>mask<span>.attr('fill', gradient);</span>代わりに、グラデーションとパターンを組み合わせたい場合、それは別のストーリーであり、少し複雑なストーリーです! 例として、上記の勾配とパターンを組み合わせたマスクを作成する方法を見てみましょう。
<span>var paper = <span>Snap</span>(800, 600), </span> img <span>= paper.image('bigImage.jpg', 10, 10, 300, 300), </span> bigCircle <span>= s.circle(150, 150, 100);</span>
基本的に2レベルのマップを作成する必要があります。勾配で埋める画像で使用される最終マップには、勾配で満たされたマップ自体があります。結果は非常に印象的です!これはまた、あなたが想像するものを行うclone()メソッドを紹介する良い機会でもありました。それが呼ばれる要素の深いコピーを作成します。
アニメーションelement.animate()
これは、マスク内の大きな円を2秒間にわたってより小さな半径に縮小するだけです。
set.animate()bigCircle<span>.attr('fill', '#fff'); //This is IMPORTANT </span> img<span>.attr({ </span> <span>mask: bigCircle </span><span>});</span>
グループ内(セット)の要素を個別にアニメーション化できます。しかし、セット全体を同期してアニメーション化したい場合はどうでしょうか?簡単! set.anime()を使用できます。これにより、セット内のすべての要素に同じ変換が適用され、さまざまなアニメーション間の同期性が確保され、すべての変更を一緒に収集することでパフォーマンスを向上させます。
これまでのサンプルコード(CodePenで試してみてください)を正しくフォローしていると仮定すると、ブラウザのコンソールで上記のコードを実行すると、3つの要素が同期してアニメーション化される方法がわかります。上記のコードは、セット(Select()およびSelectAll()メソッドの結果として)を導入するチャンスであり、それらに定義されたいくつかの有用なメソッドとして。
セットを作成する別の方法は、要素の配列をスナップコンストラクターメソッドに渡すことです。<span>var smallRect = paper.rect(180, 30, 50, 40), </span> bigCircle <span>= paper.circle(150, 150, 100), </span> mask <span>= paper.mask(bigCircle, smallRect); </span> mask<span>.attr('fill', 'white'); </span> img<span>.attr({ </span> <span>mask: mask </span><span>});</span>
snap.animate()
<span>var gradient = paper.gradient('r()#fff-#000'); </span>mask<span>.attr('fill', gradient);</span>任意の数値プロパティをアニメーション化できますが、Animate()は他のタイプでは機能しません。たとえば、テキスト属性をアニメーション化しようとすると、テキスト要素が台無しになります。しかし、そのような効果を得る別の方法、つまり、snap。
スナップオブジェクトのアニメートメソッドを呼び出すことにより、アニメーションの各ステップで実行されるアクションを詳細に指定することができます。これにより、複雑なアニメーションをグループ化して同期して実行するのに役立ちます(ただし、set.animate()メソッドはこの問題に対処する正しい方法です)。 たとえば、
テキスト要素を作成してアニメーション化しましょうイベント処理
<span>var paper = <span>Snap</span>(800, 600), </span> img <span>= paper.image('bigImage.jpg', 10, 10, 300, 300), </span> bigCircle <span>= s.circle(150, 150, 100);</span>マスクと画像の最初の比較に戻ると、前のセクションでアニメーションGIF(一種)で示したのと同じ効果を得ることができます。ただし、ユーザーの相互作用に応じてこの動作を再現したい場合、SVGを使用した改善はさらに関連しています。複数のGIFを使用して機能させる方法を見つけることができますが、柔軟性を失うことに加えて、同じ品質を少しも努力しても、
jqueryまたはd3インターフェイスに使用されていた読者の場合、他のイベントを手動で処理するためにon()メソッドがありません。 SNAPで提供されるハンドラーを超えたカスタム動作が必要な場合は、関連するDOM要素への参照を含む要素のノードプロパティを取得できます。そしてそれへのプロパティは直接:
bigCircle<span>.attr('fill', '#fff'); //This is IMPORTANT </span> img<span>.attr({ </span> <span>mask: bigCircle </span><span>});</span>
ドラッグアンドドロップ
SNAPは、要素、drag()メソッドを使用して、任意の要素、グループ、またはセットのドラッグアンドドロップを特に簡単にアクティブにします。カスタム動作が必要ない場合は、議論なしでそれを呼び出すことができます:
ただし、特別な動作が必要な場合は、OnMove、Ondragstart、Ondragendイベントにカスタムコールバックとコンテキストを渡すことができます。次のコールバックを渡す場合は、オンモーブコールバックを省略できないことに注意してください。
ドラッグハンドラーを追加しても、クリックイベントは非表示になりません。これは、オンドラゲンドのイベントの後に発射されます。<span>var smallRect = paper.rect(180, 30, 50, 40), </span> bigCircle <span>= paper.circle(150, 150, 100), </span> mask <span>= paper.mask(bigCircle, smallRect); </span> mask<span>.attr('fill', 'white'); </span> img<span>.attr({ </span> <span>mask: mask </span><span>});</span>既存のsvg
<span>var gradient = paper.gradient('r()#fff-#000'); </span>mask<span>.attr('fill', gradient);</span>注
:ブラウザの同性ポリシーのため、ロードメソッドをテストするには、ローカルサーバーで例を実行する必要があります。
DOMを操作するときにパフォーマンスを改善する1つの方法は、ドキュメントフレーズを使用しています。フラグメントは、DOMノード用の最小限のコンテナです。数年前に導入されたこのサブツリー全体を安価に操作してから、nの代わりに2つのメソッド呼び出しでnノードを含むサブツリー全体をページにクローンして追加することができます。実際の違いは、John Resigのブログで詳細に説明されています。
SNAPでは、2つの方法を使用して、フラグメントをネイティブに使用できます。
snap.fragment(varargs)は、さまざまな数の要素または文字列を取得し、提供されたすべての要素を含む単一のフラグメントを作成します。
特に大きなSVG図面の場合、フラグメントは、適切に使用すると、パフォーマンスを大幅に節約することができます。
結論いくつかの便利なリンク:
snap.svgドキュメント。
以上が高度なsnap.svgの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。