2012年12月30日日曜日

svgよくやる間違い・まとめ

svgを手書きするからこそやってしまう間違い,そのパターンを憶えておけば問題発生時に原因の調査に役に立ちます.後半に行くほどマニアックになるので,ほぼ覚書状態ですが…

※思い出すたびに更新します.
ってなんか多すぎくね? (いやいや,よくやっちまうんだーこれが・・・)

  • とりあえず問題があるけれど,どこに問題があるのか判らない
    手書きsvg最大の敵にして,ハマるとずるずると時間ばかり過ぎていく危険な状態.しかも頻発する(経験上).
    ちょっと実装を急ぎすぎているので.一旦インラインsvgをスタンドアロンのsvgに書き換えてエラーチェックしてみよう.

  • インラインsvgに慣れて大文字小文字の区別をせずにコードを記述している.
    そしてスタンドアロンのsvgを記述する際にハマる.面倒でも,正しい要素名・属性名を記述する癖をつけよう.

  • スタンドアロンsvgでscript要素やstyle要素がエラーを吐く.
    <![CDATA[〜]]>で囲むのが作法.htmlに慣れているとよく忘れる.

  • defs要素をdef要素と書いてしまう
    一部のブラウザでのみ定義した要素を参照できないケースはこれを疑いたい.特にchromeのみ表示されない場合.

  • xlinkの名前空間を指定し忘れる.
    エラーが発生するケース.インラインsvgでは必要ないので,時たまスタンドアロンのsvgを作る際にハマる場合がある.

  • スクリプトでxlink:href属性に値を設定する際,setAttributeメソッドを使ってしまう
    デバッガ上でも問題を発見できず,かなり泣きたくなるパターン.setAttributeNSメソッドを使うのが正しい.もしくはhrefプロパティを直接操作するのがお勧め.

  • その際更にxlinkの名前空間を指定すべきところをsvgの名前空間を指定してしまう.
    setAttributeNSメソッドを使うことだけを憶えているとこっちの罠にはまる.

  • スクリプトで要素を追加する際,createElementメソッドを使ってしまう.
    同上,正しく実装できているように見えて動作しない.
    createElementNSメソッドを使おう.

  • clipPath要素,clip-path属性.
    時々混乱する.

  • xlink:href属性の「xlink:」を書き忘れる.
    正しくhref属性って書いてるのにー上手く動かないーって時はだいたいこれ.

  • image要素の画像参照先をsrc属性で指定する.
    htmlのimg要素だったらそれでいいんだけれど.

  • script要素の画像参照先をsrc属性で指定する.
    htmlのscript要素だったらそれでいいんだけれど.

  • スタンドアロンのsvgで外部スタイルシートを参照する際にlink要素が存在しないことに悩む
    xml-stylesheet処理命令を使って指定する.

  • スクリプトで全てを賄おうとしてコードがスパゲティ化する.
    canvas要素に慣れている人がいきなりsvgを触るとこのパターンに陥る.
    svgでは優秀なdom機構を備えているので,予め静的なテンプレートを定義しておくとか,cssによるスタイル指定を駆使することで,劇的にスクリプトコードの品質が改善する.
    d3.js等のライブラリを使う場合にも有効.

  • img要素では使える機能に制限がある.
    外部ファイルの参照とか,スクリプトとか.ダイナミックにsvgを構成したければobject要素一択.

  • animateTransform要素にmatrix関数を渡したが動作しない.
    残念ながら対象外.

  • clipPath要素をdefs要素で囲み忘れてsafariで不具合をだす
    むき出しのclipPath要素の場合,safariでのみdom展開に不具合があり正しい動作とならなくなる.
    clipPath要素は必ずdefs要素で囲むこと.

  • インラインsvgでタグ記述を間違える.
    複数のsvg要素を設定していた場合に表示がおかしくなるケースがある.「/>」を正しく記述する癖をつけよう.特にchromeで発生.

  • fill属性等からlinearGradient要素を参照する際にurl関数を付け忘れる
    正しく設定しているつもりなのに塗りが正しく行われない場合はurl関数を確認したい.

  • インラインsvg内部の要素にcssからtransformを指定した.
    この場合,svg要素にhtmlのcss transformを掛けていることとなり,動作するかどうかはブラウザの実装依存となる.css animationと組み合わせたくなるところだが,これは標準的な動作ではないため控えたほうが良い.
    →svg2ではcssからtransformを掛けられるようになります.ブラウザベンダによる先行実装なのでご利用は計画的に.

  • image要素からサイズ指定のないsvg画像を読み込んだ.
    この場合preserveAspectRatio属性の動作がまったく効かなくなる.

  • svgフォントや図形のテンプレートを定義したsvgファイルを削除された.
    少なくとも一つスクリーンに表示される要素を設定し,意味のあるsvgファイルであることを明示しよう.さもないと初心者が空のファイルと勘違いするケースがある.

  • ieはバージョン9以降でのみsvgを表示可能.android os標準ブラウザは3から.
    結構忘れがち.

  • インラインsvgの描画内容がie9/10で飛び出てしまう.なんで?
    overflow:hiddenを指定することで他のブラウザと同じ動作となる.
    実はこちらのほうがw3c仕様に即した動作だったりする.やるな!ms.

  • svgフォントはoperaとwebkit系でのみ動作する.
    ie,firefoxは未サポート.

  • smilアニメーションはieで動作しない.
    なので,クロスブラウザ環境では利用不可と考えて間違いない.

  • ieはuse要素による外部ファイルの参照が出来ない.
    かなり致命的なので,設計時によくよく注意しておく必要がある.

  • インラインsvgでhtmlのa要素とsvgのa要素とは@namespace規則で識別できる.
    同名の要素があるので,場合によりハマる可能性がある.

  • 外部javascriptファイルを参照する際,文字コードはutf-8とする.
    現状スタンドアロンのsvgにおいて文字コードを指定する術は見つかっていない.cssなら@charset規則を使えば良いはず.

  • display:noneにより機能が失われる要素(linearGradient,filter等)がある.
    ieでは正常に動作するので注意.

  • chromeではアニメーションイベントの実装が甘い.
    繰り返し処理にendイベントやbeginイベントを使った場合に正しく動作しない場合がある.

  • アニメーションをしている図形要素をuse要素でコピーする場合は必ずanimate要素を図形要素の子要素として記述する.
    xlink:href属性からアニメーション対象を指定するとfirefoxで動作しない.

  • style要素を含んだ外部svgファイルのsvg要素全体(もしくはg要素)をuse要素から参照してはならない.
    外部ファイルのstyle要素が親svgに悪影響を及ぼす場合がある.

  • 色:transparentはoperaで黒と判定される場合がある.
    rgba(0,0,0,0)を指定する.

  • fill="none"はマウスイベントの発生に影響を及ぼす
    色を塗らずにイベントのみを発生させるには,透明色で塗りつぶすかpointerEvents属性を使ってイベントの発生を制御する.

  • text要素の機能はブラウザ毎にバラバラ.
    従って確実に動作させるのであれば1文字毎に位置を指定するようにする.

  • text要素での自動改行は出来ない.
    出来ないったら出来ない.

  • feImage要素はfirefoxで文書内の要素を参照できない.
    外部参照とするのが最も手っ取り早いが…

  • mask,filter要素にx,y,width,height属性を指定し忘れる.
    面倒だが値を指定したほうが無難.複雑な記述をした際,処理の基準が狂う場合がある.

  • svg1.2 tinyはoperaでのみ動作.
    ネット上に転がっているサンプルはバージョンを確認(1.1seが良い)

  • svg2をサポートするブラウザなんて存在しない.
    仕様すら決まっていないのにグラデーションメッシュなんて使えるわけがない.

  • foreginObject要素は極力使わない.
    動作がブラウザ毎にバラバラ.制御できると考えるのは早計.

  • chromeでは長さ0の点線は存在しない事になっている.
    その為stroke-linecap属性を使う場合,丸い点線を引く際にちょっぴり長さを指定する必要がある.

  • パス文字列の先頭のmは絶対位置指定と同等の意味.
    スクリプトを記述する場合の注意点.

  • スクリプトで触らない方が良い要素がある.
    svgフォントとか.

  • svgはinkscape専用のファイル形式と思い込む.
    そんなことはなくて様々な用途に利用できる..

  • ieが互換モードになっていてsvgの表示が出来ない
    他のブラウザで表示できるのにieだけ〜の場合はこのケース.ついさっきはまったorz...

  • 上手く行ったと思ったのにchromeで動かない.safariで動かない.
    webkitはsvg的に地雷.動作確認を行うのであれば絶対に外してはならない.バージョン上がるたびに動かなくなるとか,どうやらwebglとか動作速度とかに目が行っていて,svgは眼中にないようだ.

0 件のコメント:

コメントを投稿