Start · Sprachen · JavaScript · Referenz · TextMetrics.emHeightAscent

TextMetrics.emHeightAscent

Eigenschaft

Schreibgeschützter Abstand in CSS-Pixeln von der durch <code>textBaseline</code> festgelegten Grundlinie bis zur Oberkante des Em-Quadrats der Schrift.

seit JavaScript Baseline 2023: Chrome 99+, Edge 99+, Firefox 116+, Kategorie: webapi

Signatur

TextMetrics.emHeightAscent

Beschreibung

Die schreibgeschützte Eigenschaft emHeightAscent eines TextMetrics-Objekts gibt an, wie weit die Oberkante des Em-Quadrats (der Em-Box) über der aktuell gewählten Grundlinie liegt. Maßgeblich ist dabei CanvasRenderingContext2D.textBaseline. Den Wert liefert ctx.measureText(). Positive Werte bedeuten, dass die Oberkante oberhalb der Grundlinie liegt.

Anders als actualBoundingBoxAscent hängt der Wert nicht von den gemessenen Zeichen ab. Er wird allein aus der Schrift und ihrer Größe berechnet. Zusammen mit emHeightDescent ergibt sich die Em-Höhe, die bei den meisten Schriften der Schriftgröße entspricht, also emHeightAscent + emHeightDescent ≈ font-size. So eignet sich der Wert für ein gleichmäßiges Zeilenraster, für einheitlich hohe Hintergrundflächen hinter Text und für die typografisch genaue vertikale Ausrichtung, unabhängig davon, ob der Text Ober- oder Unterlängen hat.

Der Wert gilt für den Zustand des Kontexts zum Zeitpunkt des Aufrufs von measureText(). Ändert man danach font oder textBaseline, muss man neu messen.

Rückgabewert

Typ
number
Beschreibung
Abstand in CSS-Pixeln (double) von der textBaseline-Linie zur Oberkante der Em-Box. Bei textBaseline = "top" ist er typischerweise 0, bei "bottom" ungefähr gleich der Schriftgröße. Er kann auch negativ sein, wenn die Grundlinie über der Em-Oberkante liegt.

Beispiele

Em-Höhe einer Schrift ermitteln

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

const m = ctx.measureText('Hallo');
console.log('Ascent:', m.emHeightAscent.toFixed(1));
console.log('Descent:', m.emHeightDescent.toFixed(1));
console.log('Em-Höhe:', (m.emHeightAscent + m.emHeightDescent).toFixed(1));
Ascent: 35.2 Descent: 4.8 Em-Höhe: 40.0 (die genauen Werte hängen von der Schrift ab)

Wirkung verschiedener textBaseline-Werte

const ctx = document.createElement('canvas').getContext('2d');
ctx.font = '20px serif';

for (const baseline of ['top', 'hanging', 'middle', 'alphabetic', 'ideographic', 'bottom']) {
  ctx.textBaseline = baseline;
  const { emHeightAscent } = ctx.measureText('Äg');
  console.log(baseline.padEnd(12), emHeightAscent.toFixed(2));
}
top 0.00 hanging ... middle 10.00 alphabetic ... ideographic ... bottom 20.00

Einheitlich hohe Hintergrundfläche hinter Text

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

const drawLabel = (text, x, y) => {
  const m = ctx.measureText(text);
  const height = m.emHeightAscent + m.emHeightDescent;
  // Hintergrund bezogen auf die Em-Box: gleich hoch für "ace" und "Ägyptisch"
  ctx.fillStyle = '#ffe08a';
  ctx.fillRect(x - 4, y - m.emHeightAscent, m.width + 8, height);
  ctx.fillStyle = '#222';
  ctx.fillText(text, x, y);
};

drawLabel('ace', 10, 40);
drawLabel('Ägyptisch', 80, 40);

// Wichtig · Fallstricke

  • Nicht mit actualBoundingBoxAscent verwechseln: Dieser Wert beschreibt die tatsächlich gezeichneten Glyphen, emHeightAscent dagegen die Em-Box der Schrift. Akzente wie bei „Ä“ oder hohe Glyphen können über die Em-Box hinausragen.
  • Auch nicht mit fontBoundingBoxAscent verwechseln: Dieser Wert kommt aus den Ascender-Metriken der Schrift und ist meist größer als die Em-Oberkante.
  • Browser-Unterstützung: Safari unterstützt die Eigenschaft seit Längerem, Chrome und Edge erst seit Version 99, Firefox erst seit Version 116. Ältere Browser liefern undefined. Deshalb vorher prüfen, etwa mit 'emHeightAscent' in TextMetrics.prototype, und bei Bedarf auf fontBoundingBoxAscent oder eine Schätzung aus der Schriftgröße ausweichen.
  • Schriften laden: Wird gemessen, bevor eine Webschrift geladen ist, beziehen sich die Werte auf die Ersatzschrift. Vorher await document.fonts.load('24px MeineSchrift') aufrufen.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen TypeError aus.
  • Die Werte sind CSS-Pixel und unabhängig von devicePixelRatio. Transformationen des Kontexts wie scale() fließen nicht ein.