2016-09-28 5 views
0

私は現在、Googleゲージチャートの円錐形グラデーションのようなものを手に入れようとしています。 私はそのフィドルで私の試行を見ることができます:https://jsfiddle.net/fqt8pjuw/JavaScript経由でSVGクリップパス属性を追加する際の問題

私はゲージチャートと円錐形グラデーションをHTMLキャンバスに追加しています。 次に、SVG-clipPathにパス要素を追加します。

このパス要素は、ゲージチャートの赤いバーからパスを取得します。

最後に、image-Elementを作成し、すべての要素をsvgの特定の要素に追加します。

しかし、悲しいことに、クリップパスが適切に機能していないようです。私は期待通りの経路を得ていませんが、イメージ全体です。

特定の機能で正しい名前空間を使用することと競合することがあります。もし誰かがチェックできれば嬉しいです。

google.charts.load('current', {'packages':['gauge']}); 
 
     google.charts.setOnLoadCallback(drawChart); 
 
     function drawChart() { 
 

 
     var data = google.visualization.arrayToDataTable([ 
 
      ['Label', 'Value'], 
 
      ['Test1', 80], 
 
      ['Test2', 80], 
 
     ]); 
 

 
     var options = { 
 
      width: 400, height: 120, 
 
      redFrom: 0, redTo: 100, 
 
      minorTicks: 5 
 
     }; 
 

 
     chart = new google.visualization.Gauge(document.getElementById('chart_div')); 
 

 
     chart.draw(data, options); 
 

 

 
     canvas = document.createElement('canvas'), 
 
      d = canvas.width = canvas.height = 200, 
 
      ctx = canvas.getContext('2d'); 
 

 
     //document.body.appendChild(canvas); 
 

 
     ctx.translate(d/2, d/2); 
 
     ctx.rotate(-Math.PI/2-Math.PI/8-Math.PI/16); 
 
     ctx.scale(-1,1); 
 
     ctx.lineWidth = 2; 
 
     ctx.lineCap = 'round'; 
 

 
     for(var i=0; i<=360; i++) { 
 
      ctx.save(); 
 

 
      ctx.rotate(Math.PI * i/180); 
 
      ctx.translate(-ctx.lineWidth/2, ctx.lineWidth/2); 
 

 
      ctx.beginPath(); 
 
      ctx.moveTo(0, 0); 
 
      ctx.strokeStyle = 'hsl(' + i + ',100%,50%)'; 
 

 
      ctx.lineTo(0, d); 
 
      ctx.stroke(); 
 
      ctx.closePath(); 
 

 
      ctx.restore(); 
 
     } 
 

 
     svgEl=chart.ga.getElementsByTagName("svg"); 
 
     pathEl=svgEl[0].getElementsByTagName("path")[0]; 
 
     clipPath=pathEl.getAttribute("d"); 
 

 
     xmlns = "http://www.w3.org/2000/svg"; 
 

 
     cp=document.createElementNS(xmlns,"clipPath"); 
 
     cp.setAttribute("id", "cp1"); 
 
     cp.setAttributeNS(xmlns, "clipPathUnits","userSpaceOnUse"); 
 

 
     p=document.createElementNS(xmlns, "path"); 
 
     p.setAttributeNS(xmlns, "d", clipPath); 
 
     //p.setAttribute("transform","translate(40,40)"); 
 
     //p.setAttribute("style", "opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"); 
 

 
     cp.appendChild(p); 
 

 
     img=document.createElementNS(xmlns, "image"); 
 
     img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', canvas.toDataURL()+" "); 
 
     img.setAttributeNS(xmlns, "clip-path","url(#cp1)"); 
 
     img.setAttribute("width", 200); 
 
     img.setAttribute("height",200); 
 
     img.setAttribute("x", 0); 
 
     img.setAttribute("y",0); 
 
     img.setAttribute("transform","translate(-40,-40)"); 
 

 
     svgEl[0].getElementsByTagName("defs")[0].appendChild(cp); 
 

 

 
     svgEl[0].childNodes[1].insertBefore(img, svgEl[0].childNodes[1].childNodes[3]); 
 
     }
<script src="https://www.gstatic.com/charts/loader.js"></script> 
 
<div id="chart_div" style="width: 400px; height: 120px;"></div>

答えて

2

は、SVGでのSVGの名前空間(http://www.w3.org/2000/svg)には属性はありません。 SVG名前空間には要素だけがあります。

属性設定では、xlink:href(SVG 1.1)とほとんど使用されないxml:space属性(SVG 1.1)以外のsetAttributeが必要です。 SVG 2はこれらの例外の両方を取り除き、すべての属性をsetAttributeで設定できるようにします。

+0

ありがとうRobert!私が達成したかったものを見せてください:https://jsfiddle.net/fqt8pjuw/4/多分それは誰かを助けるでしょう。 – svennergr

関連する問題