测量 Angular 中 svg 元素的尺寸

2023-12-14

我正在尝试使用 SVG 在 Angular 中创建一个类似仪表的组件来绘制形状。我想将文本放在矩形内居中。文本将根据仪表的值而变化,因此,我想调整字体大小以使该值适合矩形。或者,我可以调整数字格式(例如,如果字符串太长,则使用科学记数法),使其适合矩形。

我遇到的问题是,当我尝试测量 svg 元素(矩形和文本)的尺寸时,getBoundingClientRect()对于本机元素返回零。我通过获取原生元素@ViewChild() : ElementRef。有一个更好的方法吗?

我整理了一个 stackblitz,在尝试获取文本尺寸时显示了问题。它与我的本地副本不同,因为矩形确实返回尺寸。我使用的是 Angular 5.2.11,也许差异是由于版本不同造成的? 编辑: 我已经更新了 stackblitz:https://stackblitz.com/edit/angular-oz72py

我在下面添加 app.component.ts 及其 html 模板

import { Component,OnInit, ViewChild,ElementRef } from '@angular/core';
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  @ViewChild('containerRect') containerRect : ElementRef;
  @ViewChild('valueText') valueText : ElementRef;
  valueStr="2512323.0";
  ngOnInit()
    {
    console.log('container bounds:',
                this.containerRect.nativeElement.getBoundingClientRect().width);
    console.log('text bounds:',
                this.valueText.nativeElement.getBoundingClientRect().width)
    }
}

app.component.html:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120">
  <svg:rect x="0" y="0" width="100%" height="100%" fill="00AA00"/>
  <svg:circle cx="60" cy="60" r="60" fill="#C3002F"/>
  <svg:path d="M 60 110
               A 50 50 0 1 1 110 60
               L 100 60
               A 40 40 1 1 0 60 100
               Z" 
               fill="#DDDDDD" fill-opacity="1"/>
  <svg:path d="M 60 110
               A 50 50 0 0 1 10 60
               L 20 60
               A 40 40 1 0 0 60 100 
               Z" 
               fill="#888888" fill-opacity="1"/>
  <svg:rect #containerRect x="29.090373558749814" 
                           y="51.717790556719336"
                           width="61.81925288250037"
                           height="16.564418886561327"
                           fill="#00AA00"/>
  <svg:text #valueText font-size="14px" 
                       x="50%" text-anchor="middle"  dy="0.95em"
                       y="51.717790556719336">{{valueStr}}</svg:text>
</svg>

当以下情况时,DOM 尚未准备好:ngOnInit() runs.

相反,请将您的代码放在ngAfterViewInit()

ngAfterViewInit()
{
  console.log('container boundsx:',
              this.containerRect.nativeElement.getBBox().width);
  console.log('text bounds:',
              this.valueText.nativeElement.getBBox().width)
}

我还建议您使用getBBox()代替getBoundingClientRect(). The getBBox()方法返回 SVG 单位的值。因此它应该更准确一些,不会受到任何缩放的影响,并且与 SVG 文件中的大小完全匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测量 Angular 中 svg 元素的尺寸 的相关文章

随机推荐

  • 将静态网格线添加到 JFreeChart 时间序列图表

    我正在尝试实施时间序列图JFreeChart 中有一个特殊的要求 我可以绘制图表 但我不知道如何在图表中的最后一个值处实现垂直红线 它应该始终位于同一位置 并且始终与最后一个值相交 我完全不知道如何做到这一点 我想也许可以将其实现为静态网格
  • 使用 ScrollWindowEx 在 Cwnd 中滚动后控件消失

    我已经在 Cwnd 中实现了 CScrollBar 但是滚动后窗口上的控件消失了 我听说我可以以某种方式使用 DeferWindowPos 但我不知道该怎么做 有任何想法吗 CPanel CPanel CreateEx WS EX CONT
  • ng-model 和 ng-value 之间有什么区别/不兼容?

    据我了解 ng model 设置分配模型的特定元素的值 ng value 与 ng model 有何不同 它与 ng model 结合使用 对于单选和选择 它是选择该项目时设置到 ng model 的值 使用它作为元素的 value 属性的
  • Sed 追加行

    sed 是否有一个命令可以在匹配的行后面追加一行 我尝试四处搜索 但对结果有点困惑 基本上我希望它匹配 address doubleclick net 127 0 0 1 并在其下面添加一行 例如 address doubleclick n
  • 如何获取应用于文本视图的字体名称

    Textview label TextView findViewById R id item title label setText Solve My Issue Log d TAG Font Family String valueOf l
  • 跨多索引的二元运算广播

    谁能解释为什么跨多索引系列广播不起作用 这可能是 pandas 0 12 0 中的一个错误吗 x pd DataFrame year 1 1 1 1 2 2 2 2 country A A B B A A B B prod 1 2 1 2
  • 正则表达式 正则表达式中“字面”的含义

    有没有办法 按原样 处理正则表达式字符串的一部分 IE 我想匹配文字模式 w 在某些文本中 夸张的例子 但你明白我的意思 我可以将整个位包含在某些内容中吗 Use Regex Escape See http msdn microsoft c
  • Tensorflow 对象检测推理在 CPU 上速度缓慢

    系统信息 您正在使用的模型的顶级目录是什么 对象检测 ssd inception v2 我是否编写了自定义代码 而不是使用 TensorFlow 中提供的常用示例脚本 No 操作系统平台和发行版 例如Linux Ubuntu 16 04 乌
  • 如何将 COM 对象 Microsoft.Office.Interop 部署到 IIS,以便我的 C# WCF 服务引用能够工作?

    当我尝试在本地计算机上从 IIS 7 运行有关 Microsoft Office Interop Outlook 的 Web 应用程序时 出现如下错误 由于以下错误 检索 CLSID 为 0006F03A 0000 0000 C000 00
  • iPhone 应用程序的大小有什么限制?

    我有一个非常大的应用程序 它有大量的图像和声音 总共有 30 MB 大小 1 官方对应用程序大小有限制吗 2 我还应该考虑其他 实际 限制吗 四处阅读 有报道称应用程序的绝对最大大小为 2GB http discussions apple
  • TableVew - 抛出 KeyEvent 时编辑单元格

    我在 TableView 上有一个事件侦听器 用于侦听键盘事件 Add event listener to table table setOnKeyTyped event gt TablePosition
  • python 打印所有函数调用以了解脚本流程

    如何打印每个函数 方法调用 我尝试过使用 python m trace trace但它也打印函数内部代码 我只想要被调用的函数名称 在代码中使用回溯会打印调用命令本身之前调用的最后一个函数 并且代码包含许多类 你可能会发现 l useful
  • Ruby 中的 __FILE__ 是什么意思?

    我在 Ruby 中经常看到这样的情况 require File dirname FILE config environment 什么是 FILE mean 它是对当前文件名的引用 在文件中foo rb FILE 将被解释为 foo rb E
  • ASP.Net MVC ActionFilterAttributes 排序全局与本地

    我想知道 ActionFilterAttribute 属性的执行是否有顺序 我猜测本地的 在控制器的操作上定义的 ActionFilterAttribute 正在按照在操作上定义的顺序执行 然而 有人不知道全局过滤器是否先于本地过滤器应用
  • 仅在登录页面设置 SSL 页面

    我想仅为登录页面设置 SSL 页面 我该怎么做 我参考这篇文章 http weblogs asp net scottgu archive 2007 04 06 tip trick enabling ssl on iis7 using sel
  • python qt,在另一个小部件(声子)上方显示文本/标签

    我正在使用 PySide 制作一个视频播放器 它是与 Qt 框架的 python 绑定 我正在使用声子 一个模块 来显示视频 我想在视频上方显示文本作为字幕 如何在我的声子小部件上方放置另一个小部件 opengl 是一个选项吗 如果您只是创
  • 如何对 google LatLng 对象进行字符串化?

    我正在使用谷歌地图 API 并尝试对点数组进行字符串化 每个点都有纬度和经度 我想要做的是将数据字符串化并将其存储在数据库中 以便以后检索 问题是 由于谷歌地图存储和使用数据的方式 结果JSON stringify有时是奇怪的随机 例如 有
  • 使用分号和大括号的 C# 命名空间声明有什么区别?

    我注意到 C 中命名空间声明的两种不同方法 namespace FirstProgram and namespace FirstProgram 我正在寻找有关 C 中两种类型的命名空间声明的主要区别和用途的信息 示例 带有分号 namesp
  • Ajax 将文件从浏览器上传到 FTP 服务器

    是否可以使用ajax将文件从浏览器上传到FTP服务器 不可以 浏览器不提供允许从 JavaScript 写入 FTP 的 API 你可以将文件发布到 HTTP 端点然后使用服务器端代码将其推送到您的 FTP 服务器
  • 测量 Angular 中 svg 元素的尺寸

    我正在尝试使用 SVG 在 Angular 中创建一个类似仪表的组件来绘制形状 我想将文本放在矩形内居中 文本将根据仪表的值而变化 因此 我想调整字体大小以使该值适合矩形 或者 我可以调整数字格式 例如 如果字符串太长 则使用科学记数法 使