我想在一个简单的svg矩形中以编程方式操作渐变填充颜色。
有两种解决方案。我不喜欢绘制多个rects并将它们连接在一起以获得一个大的。所以我正在尝试这种渐变色方法。
我所做的是尝试插入"停止" " linearGradiant"中的标签标签,在SVG开始之前 绘制矩形。但不知何故,我的代码无效。
我可以看到在运行我的代码之后绘制了矩形但是 矩形刚刚没有渲染。如果我从" url(#c1)"更改填充到"蓝色",我可以看到矩形将呈现为蓝色。
代码正在使用AngularJS指令。
'use strict'
angular.module('StanfordClinicalGenomics').directive('chromosomeFillChart', ['$compile', '$location',function($compile,$location) {
return {
restrict: 'E',
templateUrl: "app/directives/chromosome_fill/chromosome_fill.html",
scope: {
data: "=data",
cid: "=cid",
vid: "=vid",
},
controller: function($scope, $element, $attrs, $compile, $http, $route, $rootScope, $timeout) {
var data = $scope.data;
if ($scope.cid){
var chart = d3.select('chromosome-fill-chart[cid='+"'"+$scope.cid+"'"+'] svg.withFill') //this is just a selector
.attr("width", 30)
.attr("height", 100);
$timeout(function(){
angular.element("#c"+$scope.cid).append($compile('<stop offset="33%" stop-color="skyblue" />')($scope));
angular.element("#c"+$scope.cid).append($compile('<stop offset="33%" stop-color="#FF6" />')($scope));
$scope.$apply();
var bar = chart.append("g")
.append("rect")
.attr("width", 30)
.attr("fill", "url(#c"+$scope.cid+")")
.attr("height",data[0]);
});
}
}
}
}]);
下面是html:
<svg class="withFill">
<defs>
<linearGradient id="c{{cid}}" x1="0%" y1="0%" x2="0%" y2="100%"></linearGradient>
</defs>
</svg>
以下是我的Chrome浏览器中的代码:
<chromosome-fill-chart data="[100,20,76]" cid="1" class="ng-isolate-scope">
<svg class="withFill" width="30" height="100">
<defs>
<linearGradient id="c1" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="33%" stop-color="skyblue" class="ng-scope"></stop>
<stop offset="33%" stop-color="#FF6" class="ng-scope"></stop>
</linearGradient>
</defs>
<g><rect width="30" fill="url(#c1)" height="100"></rect></g>
</svg>
</chromosome-fill-chart>
答案 0 :(得分:1)
你应该用d3追加你的WITH CustomerCTE (
SELECT t1.*,ROW_NUMBER() OVER (PARTITION BY ingredient_id ORDER BY id DESC) AS RN
FROM ingredient_translations t1
INNER JOIN ingredient_translations t2 ON t1.ingredient_id = t2.ingredient_id
)
SELECT * FROM CustomerCTE WHERE RN = 1
ORDER BY id;
元素,而不是角度。我很确定Angular的<stop>
将创建HTML /默认命名空间中的$compile()
个元素。但是,它们需要位于SVG名称空间中。