2012年8月21日火曜日

svgのfeature文字列について

svgでは機能毎にfeature文字列と呼ばれる識別子が定義されています.これを利用することでsvgを表示する環境(webブラウザなど)毎に表示する内容を切り替えることができます.


例)http://www.w3.org/TR/SVG11/feature#SVG-dynamic

この値の利用の仕方には主に2つあります.
  • switch要素と組み合わせる.
    requiredFeatures属性を図形要素に追加し,条件となるfeature文字列を指定すると,その機能をサポートしている時のみ,その図形がスクリーンに描画されます.スクリプトを使わずに処理の分岐を行えます.
    (正確には,switch要素直下の要素の中で,requiredFeatures属性のチェックがtrueとなった先頭の要素が描画される)
例)このブラウザはoperaですか?このブラウザはchromeですか?このブラウザはfirefoxですか?
<svg viewBox="0 0 400 20" width="400px" height="20px" style="display:inline;">
    <switch>
        <text y="20" requiredFeatures="http://www.w3.org/TR/SVG11/feature#SVG-dynamic">このブラウザはoperaですか?</text>
        <text y="20" requiredFeatures="http://www.w3.org/TR/SVG11/feature#SVG-static">このブラウザはchromeですか?</text>
        <text y="20">このブラウザはfirefoxですか?</text>
    </switch>
</svg>
  • document.implementation.hasFeatureメソッドを実行する.
    スクリプトからブラウザがサポートしている機能をチェックすることができます.
    例)document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG-dynamic", "1.1");
何かと使い途が有りそうな機能なのですが,一つ困ったことがあります.それはブラウザが返す値がかなりバラバラなのです.あくまで自己申告値であったり,「サポートしている」と判定する基準が曖昧なのでこれは仕方のない事です.下に実際にfeature文字列毎の判定値をまとめました.
    http://www.w3.org/TR/SVG11/featureを先頭に追加して下さい.

    個別機能対応する要素, 属性staticanimationdynamicfirefoxchromeopera
    #SVG #SVG-static, #SVG-animation, #SVGDOM-dynamicの何れかをサポートする.falsetruetrue
    #SVGDOM 上記に関わるdomオブジェクトをサポートする.falsetruetrue
    #SVG-static static列の機能をサポートする.  falsetruetrue
    #SVGDOM-static 上記に関わるdomオブジェクトをサポートする.  falsetruetrue
    #SVG-animation animationの機能をサポートする. falsetruetrue
    #SVGDOM-animation 上記に関わるdomオブジェクトをサポートする. truetruetrue
    #SVG-dynamic dynamic列の機能をサポートする.falsefalsetrue
    #SVGDOM-dynamic 上記に関わるdomオブジェクトをサポートする.falsefalsetrue
    #CoreAttribute id, xml:base, xml:lang, xml:space属性truetruetrue
    #Structure svg, g, defs, desc, title, metadata, symbol, use要素truetruetrue
    #ContainerAttribute enable-background属性falsetruetrue
    #ConditionalProcessing switch要素, requiredFeatures, requiredExtensions, systemLanguage属性truetruetrue
    #Image image要素truetruetrue
    #Style style要素truetruetrue
    #ViewportAttribute clip, overflow属性truetruetrue
    #Shape rect, circle, line, polyline, polygon, ellipse, path要素truetruetrue
    #Text text, tspan, tref, textPath, altGlyph, altGlyphDef, altGlyphItem, glyphRef要素falsetruetrue
    #BasicText text要素truetruetrue
    #PaintAttribute color, fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color-imterpolation, color-rendering属性falsetruefalse
    #BasicPaintAttribute color, fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color-rendering属性truetruetrue
    #OpacityAttribute opacity, stroke-opacity, fill-opacity属性truetruetrue
    #GraphicsAttribute display, image-rendering, pointer-events, shape-rendering, text-rendering, visibility属性truetruetrue
    #BasicGraphicsAttribute display, visibility属性truefalsetrue
    #Marker marker要素truetruetrue
    #ColorProfile color-profile要素falsefalsefalse
    #Gradient linearGradient, radialGradient, stop要素truetruetrue
    #Pattern pattern要素truetruetrue
    #Clip clipPath要素, clip-path, clip-rule属性truetruetrue
    #BasicClip clipPath要素, clip-path属性truetruetrue
    #Mask mask要素truetruetrue
    #Filter filter要素, 原始フィルター要素全てfalsetruetrue
    #BasicFilter filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, feFlood, feGaussianBlur, feImage, feMerge, feMergeNode, feOffset, feTile, feFuncR, feFuncG, feFuncB, feFuncA要素falsetruetrue
    #XlinkAttribute xlinkに関わる属性群truetruetrue
    #Font フォント定義に関わる全ての要素falsetruetrue
    #BasicFont font, font-face, glyph, missing-glyph, hkern, font-face-src, font-face-name要素falsetruetrue
    #ExternalResourcesRequired externalResourcesRequired属性falsetruetrue
    #Extensibility foreignObject要素truetruetrue
    #Animation animate, set, animateMotion, animateTransform, animateColor, mpath要素 truetruetrue
    #Hyperlinking a要素  truetruetrue
    #Script script要素  truetruetrue
    #View view要素  falsetruetrue
    #Cursor cursor要素  falsetruefalse
    #GraphicalEventsAttribute onfocusin, onfocusout, onactivate, onclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout, onload属性  truetruetrue
    #DocumentEventsAttribute onunload, onabort, onerror, onresize, onscroll, onzoom属性  truetruetrue
    #AnimationEventsAttribute onbegin, onend, onrepeat, onload属性  truefalsetrue

    このようにブラウザによって相当の違いがあることが判ります.

    それではこの機能はどのように利用すべきなのでしょうか?
    結論から言うと,現時点ではあまり使わないほうが良いと思います.なんだか身も蓋も無い結論ですが,積極的に使うには不確定要素が多すぎて手に負えません.唯一利用価値が有りそうな使い方としてはブラウザの判定です.スクリプトを介さずにブラウザを判定することができるというのは魅力的です.しかしこれもブラウザの実装が進めば内容が変化するのは目に見えているのでこれもあまり良い使い方ではありません.


    svgのfeature文字列チェッカ
    実際にdocument.implementation.hasFeatureメソッドを実行し,お使いのブラウザでの判定結果を表示します.

    個別機能対応する要素, 属性staticanimationdynamicresult
    #SVG #SVG-static, #SVG-animation, #SVGDOM-dynamicの何れかをサポートする.
    #SVGDOM 上記に関わるdomオブジェクトをサポートする.
    #SVG-static static列の機能をサポートする.   
    #SVGDOM-static 上記に関わるdomオブジェクトをサポートする.   
    #SVG-animation animationの機能をサポートする.  
    #SVGDOM-animation 上記に関わるdomオブジェクトをサポートする.  
    #SVG-dynamic dynamic列の機能をサポートする.
    #SVGDOM-dynamic 上記に関わるdomオブジェクトをサポートする.
    #CoreAttribute id, xml:base, xml:lang, xml:space属性
    #Structure svg, g, defs, desc, title, metadata, symbol, use要素
    #ContainerAttribute enable-background属性
    #ConditionalProcessing switch要素, requiredFeatures, requiredExtensions, systemLanguage属性
    #Image image要素
    #Style style要素
    #ViewportAttribute clip, overflow属性
    #Shape rect, circle, line, polyline, polygon, ellipse, path要素
    #Text text, tspan, tref, textPath, altGlyph, altGlyphDef, altGlyphItem, glyphRef要素
    #BasicText text要素
    #PaintAttribute color, fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color-imterpolation, color-rendering属性
    #BasicPaintAttribute color, fill, fill-rule, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-width, color-rendering属性
    #OpacityAttribute opacity, stroke-opacity, fill-opacity属性
    #GraphicsAttribute display, image-rendering, pointer-events, shape-rendering, text-rendering, visibility属性
    #BasicGraphicsAttribute display, visibility属性
    #Marker marker要素
    #ColorProfile color-profile要素
    #Gradient linearGradient, radialGradient, stop要素
    #Pattern pattern要素
    #Clip clipPath要素, clip-path, clip-rule属性
    #BasicClip clipPath要素, clip-path属性
    #Mask mask要素
    #Filter filter要素, 原始フィルター要素全て
    #BasicFilter filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, feFlood, feGaussianBlur, feImage, feMerge, feMergeNode, feOffset, feTile, feFuncR, feFuncG, feFuncB, feFuncA要素
    #XlinkAttribute xlinkに関わる属性群
    #Font フォント定義に関わる全ての要素
    #BasicFont font, font-face, glyph, missing-glyph, hkern, font-face-src, font-face-name要素
    #ExternalResourcesRequired externalResourcesRequired属性
    #Extensibility foreignObject要素
    #Animation animate, set, animateMotion, animateTransform, animateColor, mpath要素  
    #Hyperlinking a要素   
    #Script script要素   
    #View view要素   
    #Cursor cursor要素   
    #GraphicalEventsAttribute onfocusin, onfocusout, onactivate, onclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout, onload属性   
    #DocumentEventsAttribute onunload, onabort, onerror, onresize, onscroll, onzoom属性   
    #AnimationEventsAttribute onbegin, onend, onrepeat, onload属性   

    0 件のコメント:

    コメントを投稿