文字長度

textLength 屬性,適用於 SVG 的 <text><tspan> 元素,可讓您指定文字繪製所佔用的空間寬度。使用者代理將確保文字不會超出該距離,並使用 lengthAdjust 屬性指定的方法來執行此操作。預設情況下,僅調整字元之間的間距,但如果您更改 lengthAdjust,還可以調整字形大小。

透過使用 textLength,您可以確保您的 SVG 文字以相同的寬度顯示,無論網路字型載入失敗(或尚未載入)等情況如何。

你可以將此屬性與以下 SVG 元素一起使用

示例

html
<svg viewBox="0 0 200 60" xmlns="http://www.w3.org/2000/svg">
  <text y="20" textLength="6em">Small text length</text>
  <text y="40" textLength="120%">Big text length</text>
</svg>

用法說明

<length-percentage> | <number>
預設值 None
可動畫的
<length-percentage>

此值指定文字將調整為佔據的空間寬度,可以是絕對長度或百分比。

<number>

數值指定了相對於當前座標系單位的長度。

互動式示例

本示例展示了可以透過一個型別為 "range"<input> 元素來調整大小的文字。

CSS

css
.controls {
  font:
    16px "Open Sans",
    "Arial",
    sans-serif;
}

SVG

讓我們從 SVG 開始。它非常基礎,在一個 1000x300 畫素的空間中對映到一個 10 釐米 x 3 釐米的框。

html
<svg
  width="10cm"
  height="3cm"
  viewBox="0 0 1000 300"
  xmlns="http://www.w3.org/2000/svg">
  <rect
    x="1"
    y="1"
    width="998"
    height="298"
    fill="none"
    stroke="green"
    stroke-width="2" />

  <text
    id="hello"
    x="10"
    y="150"
    font-family="sans-serif"
    font-size="60"
    fill="green">
    Hello world!
  </text>
</svg>

首先,使用 <rect> 元素建立並描邊一個矩形來容納文字。然後使用 <text> 建立文字元素本身,其 id"hello"

HTML

HTML 包含兩個顯示元素,它們都包含在一個分組的 <div> 中。

html
<div class="controls">
  <input type="range" id="widthSlider" min="80" max="978" />
  <span id="widthDisplay"></span>
</div>

型別為 "range"<input> 元素用於建立使用者將用來改變文字寬度的滑塊控制元件。提供了一個 ID 為 "widthDisplay"<span> 元素來顯示當前的寬度值。

JavaScript

最後,讓我們看看 JavaScript 程式碼。它首先使用 Document.getElementById() 來儲存它需要訪問的元素的引用。

js
const widthSlider = document.getElementById("widthSlider");
const widthDisplay = document.getElementById("widthDisplay");
const textElement = document.getElementById("hello");
const baseLength = Math.floor(textElement.textLength.baseVal.value);

widthSlider.value = baseLength;

widthSlider.addEventListener("input", (event) => {
  textElement.textLength.baseVal.newValueSpecifiedUnits(
    SVGLength.SVG_LENGTHTYPE_PX,
    widthSlider.valueAsNumber,
  );
  widthDisplay.innerText = widthSlider.value;
});

widthSlider.dispatchEvent(new Event("input"));

獲取元素引用後,透過在滑塊控制元件上呼叫 addEventListener() 來建立一個事件監聽器,以接收發生的任何 input 事件。每當滑塊的值發生變化時,這些事件都會被髮送,即使使用者還沒有停止移動它,這樣我們就可以響應式地調整文字寬度。

當發生 "input" 事件時,我們呼叫 newValueSpecifiedUnits(),使用 SVGLength 介面的 SVG_LENGTHTYPE_PX 單位型別來指示該值代表畫素,將 textLength 的值設定為滑塊的新值。請注意,我們必須深入到 textLength 來獲取其 baseVal 屬性;textLength 儲存為一個 SVGLength 物件,所以我們不能將其視為普通數字。

更新文字寬度後,widthDisplay 框的內容也會用新值進行更新,我們就完成了。

結果

這是示例的樣子。嘗試拖動滑塊來感受它的作用。

規範

規範
Scalable Vector Graphics (SVG) 2
# TextElementTextLengthAttribute

瀏覽器相容性

svg.elements.text.textLength

svg.elements.textPath.textLength

svg.elements.tspan.textLength

另見

  • SVG 教程:文字
  • SVGAnimatedLengthSVGLength
  • <text>