web-dev-qa-db-fra.com

Mesurer la longueur d'un chemin svg?

Je joue avec Scrollmagic et je veux utiliser l'effet ici: http://scrollmagic.io/examples/advanced/svg_drawing.html

J'ai créé un svg squiggle pour le tester et j'ai besoin d'insérer la longueur du chemin dans stroke-dasharray: 2000px; stroke-dashoffset: 2000px;

Comment puis-je trouver la longueur du chemin?

        
function pathPrepare ($el) {
                var lineLength = $el[0].getTotalLength();
                $el.css("stroke-dasharray", lineLength);
                $el.css("stroke-dashoffset", lineLength);
        }

        var $Word = $("path#Word");
        var $dot = $("path#dot");

        // prepare SVG
        pathPrepare($Word);

        // init controller
        var controller = new ScrollMagic.Controller();

        // build tween
        var tween = new TimelineMax()
                .add(TweenMax.to($Word, 0.9, {strokeDashoffset: 0, ease:Linear.easeNone})) // draw Word for 0.9
                .add(TweenMax.to("path", 1, {stroke: "#33629c", ease:Linear.easeNone}), 0);                     // change color during the whole thing

        // build scene
        var scene = new ScrollMagic.Scene({triggerElement: "#trigger1", duration: 200, tweenChanges: true})
                                        .setTween(tween)
                                        .addIndicators() // add indicators (requires plugin)
                                        .addTo(controller);

</script>
            <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
                <script src="http://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/ScrollMagic.js"></script>
                <script src="http://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/plugins/debug.addIndicators.min.js"></script>
                <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js"></script>
                <script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.2/plugins/animation.gsap.js"></script>

<div style="height: 400px;"></div>
<div class="spacer s2"></div>


<div id="trigger1" class="spacer s0"></div>

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         viewBox="0 0 841.9 595.3" xml:space="preserve" width="1000px">
<style type="text/css">
        .st0{fill:none;stroke:#000000;stroke-width:12;stroke-miterlimit:10;}
</style>
<path id="Word" style="stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 2000px; stroke-dashoffset: 2000px;" fill="none" class="st0" d="M29.7,6.4c-42,87.9,34.6,16.4,96.4,12.1s346,145.7,192.8,110.4S40.8,9.8,66.8,128s179.2,218.1,281.7,122.4
        s10.2-115.2,215-94c465.8,48.3,233.5,90.1,90.2,85.4c-247-8.1,299.2,110.9-259.5,138C46.5,396.6-33.3,439.2,145.8,491
        s171.8-83.6,431.3-18.1s96.4,107.8-79.1,122.4"/>
</svg>

<div style="height: 400px;"></div>
<div class="spacer s2"></div>
11
R Reveley

Vous pouvez utiliser getTotalLength () :

La méthode SVGGeometryElement.getTotalLength () renvoie la valeur calculée par l'agent utilisateur pour la longueur totale du chemin en unités utilisateur.

Voici une démo avec votre SVG:

var myPath = document.getElementById("Word");
var length = myPath.getTotalLength();
console.log(length);
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         viewBox="0 0 841.9 595.3" xml:space="preserve" width="1000px">
<style type="text/css">
        .st0{fill:none;stroke:#000000;stroke-width:12;stroke-miterlimit:10;}
</style>
<path id="Word" style="stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 2000px; stroke-dashoffset: 2000px;" fill="none" class="st0" d="M29.7,6.4c-42,87.9,34.6,16.4,96.4,12.1s346,145.7,192.8,110.4S40.8,9.8,66.8,128s179.2,218.1,281.7,122.4
        s10.2-115.2,215-94c465.8,48.3,233.5,90.1,90.2,85.4c-247-8.1,299.2,110.9-259.5,138C46.5,396.6-33.3,439.2,145.8,491
        s171.8-83.6,431.3-18.1s96.4,107.8-79.1,122.4"/>
</svg>
17
Gerardo Furtado