Start · Sprachen · JavaScript · Referenz · TextMetrics.actualBoundingBoxAscent

TextMetrics.actualBoundingBoxAscent

Eigenschaft

Schreibgeschützter <code>double</code>: Abstand von der durch <code>textBaseline</code> festgelegten Grundlinie bis zur Oberkante des tatsächlich gerenderten Textes in CSS-Pixeln.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

TextMetrics.actualBoundingBoxAscent

Beschreibung

Die Eigenschaft actualBoundingBoxAscent eines TextMetrics-Objekts gibt an, wie weit der tatsächlich gezeichnete Text über die Bezugslinie hinausragt. Welche Linie das ist, legt CanvasRenderingContext2D.textBaseline fest. Du bekommst das Objekt über ctx.measureText(text). Positive Werte bedeuten, dass der Text über die Bezugslinie hinausragt.

Anders als fontBoundingBoxAscent hängt der Wert von den konkreten Glyphen ab: Bei "ace" fällt er kleiner aus als bei "ÄBd", weil Kleinbuchstaben ohne Oberlänge weniger hoch sind. So kannst du die Höhe einer Textzeile pixelgenau berechnen, Text exakt vertikal zentrieren oder eine passende Hintergrundbox um beschrifteten Text zeichnen.

Zusammen mit actualBoundingBoxDescent ergibt sich die tatsächliche Höhe: ascent + descent. Die Breite der Box erhältst du über actualBoundingBoxLeft + actualBoundingBoxRight.

Rückgabewert

Typ
number
Beschreibung
Ein double in CSS-Pixeln: der Abstand von der Bezugslinie (textBaseline) bis zur Oberkante des Begrenzungsrahmens der gerenderten Glyphen. Ist nur lesbar.

Beispiele

Ascent verschiedener Texte vergleichen

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '48px sans-serif';
ctx.textBaseline = 'alphabetic';

for (const text of ['ace', 'Hallo', 'ÄÖÜ']) {
  const m = ctx.measureText(text);
  console.log(text, m.actualBoundingBoxAscent.toFixed(1));
}
ace 25.0 Hallo 35.0 ÄÖÜ 44.0 (Werte hängen von Schriftart und Browser ab)

Text pixelgenau vertikal zentrieren

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
ctx.font = 'bold 40px system-ui';
ctx.textBaseline = 'alphabetic';

const text = 'Zentriert';
const m = ctx.measureText(text);
const height = m.actualBoundingBoxAscent + m.actualBoundingBoxDescent;

// Grundlinie so setzen, dass die sichtbare Box mittig liegt
const x = (canvas.width - m.width) / 2;
const y = (canvas.height - height) / 2 + m.actualBoundingBoxAscent;
ctx.fillText(text, x, y);

Hintergrundbox exakt um ein Label zeichnen

const ctx = document.querySelector('canvas').getContext('2d');
ctx.font = '24px sans-serif';

const drawLabel = (text, x, y, padding = 6) => {
  const m = ctx.measureText(text);
  const top = y - m.actualBoundingBoxAscent - padding;
  const left = x - m.actualBoundingBoxLeft - padding;
  const w = m.actualBoundingBoxLeft + m.actualBoundingBoxRight + padding * 2;
  const h = m.actualBoundingBoxAscent + m.actualBoundingBoxDescent + padding * 2;

  ctx.fillStyle = '#ffe08a';
  ctx.fillRect(left, top, w, h);
  ctx.fillStyle = '#222';
  ctx.fillText(text, x, y);
};

drawLabel('Messwert: 42 °C', 20, 50);

// Wichtig · Fallstricke

  • Reihenfolge beachten: font und textBaseline musst du vor measureText() setzen. Spätere Änderungen wirken sich nicht auf ein bereits erzeugtes TextMetrics-Objekt aus.
  • Abhängig von der Bezugslinie: Bei textBaseline = 'top' kann der Wert nahe 0 oder sogar negativ sein, weil die Bezugslinie dann schon am oberen Rand liegt.
  • Web-Fonts: Misst du, bevor die Schrift geladen ist, beziehen sich die Werte auf die Ersatzschrift. Warte deshalb vorher auf document.fonts.ready oder document.fonts.load().
  • Nicht für einheitliche Zeilenhöhen: Der Wert ändert sich je nach Text. Für gleichmäßige Zeilenabstände ist fontBoundingBoxAscent besser geeignet.
  • Leichte Unterschiede: Die Werte können je nach Browser, Betriebssystem und Kantenglättung etwas abweichen. Unterstützt wird die Eigenschaft in allen aktuellen Browsern, auch in OffscreenCanvas. Sehr alte Versionen (Firefox vor 74, Safari vor 11.1) kennen sie nicht.