路線図

今、こんな感じのSVG鉄道路線図を作っています。

図の中で運休中の部分は色を変えたいなと思ったのですが、どうやらこの一本一本を構成する path 要素は一色だけで途中から色を変えるってのはどうも難しいようです。

対象の図形はこんな感じ。

コードを抜粋

<g>
  <path fill="none" stroke="#C30D23" stroke-width="15" stroke-linecap="round" stroke-miterlimit="10" d="M53.9,265.1v-71.7
    c0-5.5,3.2-13.2,7.1-17.1l45.4-45.4c3.9-3.9,10.3-3.9,14.1,0l45.6,45.6c3.9,3.9,10.3,3.9,14.1,0l82.7-82.7"/>
</g>

パスを分割するのが真っ当な感じはするんですが、illustrator経由でSVG出力している都合上、パス分割すると管理が面倒になるのでちょっと避けたいなと。

@hail2u_さんからコメントいただいたのでSVGグラデーションでなんとかできないか考えてみる。

試してみると、グラデーションがパスに沿ってかかっているわけではなく、パスを囲む矩形をグラデーション領域として掛かるようになっているようです。なので、こういう図形だとオッケーなのですが、

こういう複雑な図形だとダメっぽい(後付で条件出してすみません)

パターンを背景に使うのも、パターンをプログラマブルに出力するとしても結構大変そう。

と悩んでいたらナイスなアイデアをいただく。

SVG勉強不足で知らなかったんですけど、use要素という要素の複製をするものがあるんですね。これに任意の幅間隔の破線をつけられるstroke-dasharray属性を使って、1色ごとに線をつけるというアイデアのようです

ということで、やってみたらできました!

<defs>
  <path id="test" fill="none" stroke-width="15" stroke-linecap="round" stroke-miterlimit="10" d="M53.888,265.148V193.4
    c0-5.5,3.182-13.183,7.071-17.071l45.363-45.363c3.889-3.889,10.253-3.889,14.143,0l45.554,45.554
    c3.89,3.891,10.252,3.891,14.143,0l82.661-82.663l-43.34-43.34H53.888"/>
</defs>

<use xlink:href="#test" stroke="#C30D23" stroke-dasharray="0,150,500,0"/>
<use xlink:href="#test" stroke="#CCCCCC" stroke-dasharray="150,500"/>

上記はSVGファイル自体を編集してますが、実際はDOMで動的に運休区間を規定すると思うので、ちょっと方法を変更。

$(document).ready(function(){
  $("svg > g").wrap("<defs>");
  $("svg > defs").after(createPartialPathNode("#c30d23", "0,160,500,0", "test"));
  $("svg > defs").after(createPartialPathNode("#cccccc", "160,500", "test"));

  function createPartialPathNode(strokeColor, strokeDashArray, href){
    var svgns = "https://www.w3.org/2000/svg";
    var xlinkns = "https://www.w3.org/1999/xlink";
    var use_node = document.createElementNS(svgns, "use");
    use_node.setAttribute("stroke", strokeColor);
    use_node.setAttribute("stroke-dasharray", strokeDashArray);
    use_node.setAttributeNS(xlinkns, "href", "#"+href);
    return use_node;
  }
});

ありがとうございましたー!

smile書き手

このブログは、私(@hashcc)が日々考えていることをまとめて、つなげて、残しておくためのブログです。
関心領域は Webデザイン(特にUXデザインやUIデザイン関連)、食や観光に関する情報環境の整備、情報の可視化、アクセシビリティなどです。

書き手にご興味があれば自己紹介ページで詳細をご確認ください。

commentsコメント

しばらくお待ちください・・