【发布时间】:2017-12-18 11:46:06
【问题描述】:
是否可以使用 d3.js 将另一个 svg 附加到预先存在的 svg 父级?
我知道这可以通过使用“svg:image”属性来实现。 但不幸的是,我失去了对内在 svg-child 的完全控制。
相关的 dom 节点由 d3 创建但未渲染,因此页面保持空白。
希望有人可以提供帮助,谢谢 :)
这是我得到的:
HTML CSS
#svg-main-wrapper {
position: absolute;
min-width: 100%;
min-height: 100%;
bottom: 0;
padding: 0;
margin: 0;
}
<div id="svg-main-wrapper">
<div svg-container svg-src="svgContainer[0].url" position="svgContainer[0].position">
</div>
</div>
Javascript
angular.module('app', ['ui.bootstrap'])
.directive('svgContainer', function() {
return {
restrict: 'A',
template: function() {
var parent = angular.element('body');
return '<svg class="svg-container" width="' + parent.width() + '" height="' + parent.height() + '" viewBox=" 0 0 ' + parent.width() + ' ' + parent.height() + '"preserveAspectRatio ="xMinYMax meet"></svg>';
},
scope: {
svgSrc: '=',
position: '='
},
link: function(scope, element, attrs) {
var parent = angular.element('#svg-main-wrapper');
var x = 0;
var y = parent.height() - 400;
var svg = d3.select(element[0]);
var g = svg.append('g');
var innersvg = g.append('svg')
.attr('xlink:href', scope.svgSrc)
.attr('preserveAspectRatio', scope.position)
.attr('width', parent.width())
.attr('height', 400)
.attr('transform', 'translate(' + x + ',' + y + ')');
},
replace: true
};
})
.controller('ctrl', ['$scope', '$window', function($scope, $window) {
$scope.svgContainer = [
{
id: 0,
short_name: 'left',
url: './images/complete.svg',
position: 'none'
}
];
}]);
【问题讨论】:
-
当您提到“svg:image”属性时,您是否尝试过使用
image元素——g.append('image')?这种方法有什么问题? -
内部 SVG 元素将是另一个复杂的 SVG 图形。如果它只是一个图像标签,我无法进一步操作它的子节点
标签: javascript html angularjs d3.js svg