SVG манипулирует градиентной заливкой цвета

0

Я хочу программно манипулировать градиентным цветом заливки в простом прямоугольнике svg.

Есть 2 решения. Мне не нравится рисовать несколько прямоугольников и конкатрировать их вместе, чтобы получить большой. Поэтому я стараюсь использовать этот подход градиентного цвета.

Я попытался вставить теги "stop" в тег "linearGradiant", прежде чем SVG начнет рисовать прямоугольник. Но почему-то мой код не работает.

Я мог видеть, что прямоугольник был нарисован после запуска моего кода, но прямоугольник просто не был отображен. Если я изменил заливку с "url (# c1)" на "blue", я мог видеть, что rect будет отображаться синим цветом.

Код использует директиву 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
    На всякий случай, моим желаемым эффектом будет прямоугольник, заполненный двумя разными цветами. Верх до 33% будет синим, а от 33% до 100% - желтым
Теги:
d3.js
svg
angularjs-directive

1 ответ

1
Лучший ответ

Вы должны добавить ваши элементы <stop> с d3, а не угловыми. Я уверен, что Angular $compile() будет создавать элементы stop которые находятся в пространстве имен HTML/default. Однако они должны быть в пространстве имен SVG.

  • 0
    Оно работает. огромное спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню