在AngularJS指令中根据容器元素自动调整SVG的大小
Auto-resize SVG inside AngularJS directive based on container element
我在一个动态大小的元素中放置了一个angular指令。该指令本身由一个基于元素大小计算的SVG组成。我正在尝试使SVG自动调整大小并根据容器的大小重新绘制。
我最初尝试这样做:
my-directive.js
angular
.module('myModule')
.directive('myDirective', function () {
return {
templateUri: 'path/to/my-directive-template.html',
...
};
});
my-directive-template.html
<svg style="width: 100%; height: 100%; max-width: 100%; max-height: 100%">
...
</svg>
注意该SVG元素上的style
属性。这在Chrome中可以正确调整大小,但在Firefox中不起作用。而且,我仍然没有一个钩子来重新计算SVG内容。
我还尝试在link
函数中添加onresize
处理程序到element
,但是,JQLite仅在主窗口上支持onresize
。我不能使用window.onresize
,因为我的窗口大小不改变。
我试着用这里的答案:AngularJS - bind到指令调整大小,但他们也没有给出所需的结果。
简而言之,这就是我要做的:
- 当父元素调整大小时,在指令内调整SVG元素的大小。
- 当发生这种情况时,通过调用一些处理程序函数重新计算SVG内容。
我更倾向于而不是在这个项目中添加JQuery依赖项
此行为可以使用<svg>
标签的viewBox
和preserveAspectRatio
属性来实现。
首先,将viewBox
属性设置为SVG图像的规范化边界框。您的整个绘图应该缩放以适合此视图框。例如,
viewBox="0 0 100 100"
将建立一个坐标系统,原点为(0,0),尺寸为100单位x 100单位。
接下来,使用preserveAspectRatio
属性设置大小调整行为。
该值的第一部分确定SVG相对于父元素的对齐方式。这包括左/右/中心水平对齐和上/下/中间垂直对齐。例如,
preserveAspectRatio="xMidYMid ..."
将使SVG在其容器中集中对齐。
值的第二部分决定SVG如何填充容器。例如,
preserveAspectRatio="... meet"
将缩放SVG,使其刚好适合容器而不裁剪。
所以完整的例子变成:
<svg viewBox="0 0 64 64" preserveAspectRatio="xMidYMid meet">
...
</svg>
因为图像会随着容器自动缩放,所以不需要重新计算内容元素的位置。它由SVG标记自动处理。
- 根据窗口大小调整 HTML 中 SVG 图像的大小
- 在同一网页上调整多个svg图的大小
- 如何调整 SVG 动画的大小
- 在 svg (Raphael.js) 上调整大小和旋转会产生跳跃
- 使用 Raphaël JS 和 SVG 调整扇区路径大小的更优雅方法
- 在调整窗口大小时刷新 svg 坐标
- 如何调整SVG文本
- 使用css和javascript调整svg动画时出错
- 调整多边形点路径(svg)内的图像大小并使其不被剪裁
- 多个 SVG 分层在画布上,让 SVG 可移动和调整大小
- SVG调整窗口大小时的高度,也以父对象为中心
- d3.js svg未调整大小
- D3/SVG:如何通过修改范围来调整带有时间刻度的D3.SVG.axis的大小
- Svg旋转和调整大小问题
- 在AngularJS指令中根据容器元素自动调整SVG的大小
- 根据svg元素的内容调整svg元素的大小
- 动态调整svg文件大小的最佳方法是什么?
- 在d3.js中调整窗口大小时调整svg大小
- 如何使用 raphael 1.5.2 调整 SVG 的大小
- 用JavaScript和D3重新调整SVG元素的大小