Start · Sprachen · JavaScript · Referenz · TextMetrics.ideographicBaseline

TextMetrics.ideographicBaseline

Eigenschaft

Schreibgeschützter <code>double</code>: Abstand in CSS-Pixeln von der durch <code>textBaseline</code> festgelegten Linie zur ideografischen Grundlinie des gemessenen Textes.

seit JavaScript Baseline 2023: Chrome/Edge 87+, Safari 11.1+, Fire Kategorie: webapi

Signatur

TextMetrics.ideographicBaseline

Beschreibung

Die schreibgeschützte Eigenschaft ideographicBaseline eines TextMetrics-Objekts gibt den Abstand in CSS-Pixeln an: von der horizontalen Linie, die beim Messen durch CanvasRenderingContext2D.textBaseline festgelegt war, bis zur ideografischen Grundlinie der Zeile. Diese Grundlinie ist die Unterkante des Em-Quadrats. An ihr werden chinesische, japanische und koreanische Schriftzeichen (CJK) ausgerichtet.

Das TextMetrics-Objekt bekommst du über ctx.measureText(text). Der Wert hängt von der Schrift ab (ctx.font) und davon, welcher Wert beim Messen in ctx.textBaseline stand. In Chromium-Browsern zeigen positive Werte nach oben und negative nach unten. Beim Standardwert "alphabetic" ist ideographicBaseline deshalb meist negativ: Die ideografische Grundlinie liegt unter der alphabetischen. Misst du mit textBaseline = "ideographic", ist der Wert 0.

Du brauchst die Eigenschaft vor allem, wenn du lateinischen und CJK-Text auf einer Zeile mischst, eigene Textlayouts oder Beschriftungen in Diagrammen baust oder Linien und Hintergründe genau an der Grundlinie von Schriftzeichen ausrichten willst. Zusammen mit alphabeticBaseline und hangingBaseline kannst du damit zwischen Grundliniensystemen umrechnen, ohne textBaseline immer wieder neu zu setzen.

Rückgabewert

Typ
number
Beschreibung
Ein double in CSS-Pixeln: der Abstand von der textBaseline-Linie zur ideografischen Grundlinie. Der Wert ist 0, wenn beim Messen textBaseline = "ideographic" gesetzt war.

Beispiele

Wert auslesen und vergleichen

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

for (const baseline of ['alphabetic', 'ideographic', 'top', 'bottom']) {
  ctx.textBaseline = baseline;
  const m = ctx.measureText('漢字 Text');
  console.log(baseline.padEnd(12), m.ideographicBaseline.toFixed(2));
}
alphabetic -8.xx (hängt von der Schrift ab) ideographic 0.00 top -4x.xx bottom 0.xx

Ideografische Grundlinie als Hilfslinie zeichnen

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '48px "Noto Sans JP", sans-serif';
ctx.textBaseline = 'alphabetic';

const text = '日本語 Japan';
const x = 20;
const y = 100; // alphabetische Grundlinie
ctx.fillText(text, x, y);

const m = ctx.measureText(text);
// Positiv = nach oben, daher vom y-Wert abziehen
const ideoY = y - m.ideographicBaseline;

ctx.strokeStyle = 'crimson';
ctx.beginPath();
ctx.moveTo(x, ideoY);
ctx.lineTo(x + m.width, ideoY);
ctx.stroke();

Lateinischen und CJK-Text an der ideografischen Grundlinie ausrichten

const ctx = document.querySelector('canvas').getContext('2d');
ctx.textBaseline = 'alphabetic';
const lineY = 120; // gemeinsame ideografische Grundlinie

const drawOnIdeographic = (text, font, x) => {
  ctx.font = font;
  const m = ctx.measureText(text);
  // alphabetische y-Position so wählen, dass die ideografische Linie auf lineY liegt
  ctx.fillText(text, x, lineY + m.ideographicBaseline);
  return x + m.width;
};

let x = 10;
x = drawOnIdeographic('Preis:', '24px serif', x) + 8;
x = drawOnIdeographic('価格', '40px sans-serif', x);

// Wichtig · Fallstricke

  • Vorzeichen: Der Wert ist relativ zu textBaseline zum Zeitpunkt des Messens. Änderst du textBaseline danach, bleibt das alte TextMetrics-Objekt unverändert. Miss dann neu mit measureText(). Die Richtung der Werte (positiv nach oben) hat sich in Chromium herauskristallisiert. Prüfe sie im Zweifel in deinen Zielbrowsern.
  • Schriftabhängig: Viele Schriften enthalten keine eigene ideografische Grundlinie in ihren Metriken (OpenType-Tabelle BASE). Der Browser schätzt den Wert dann, meist aus der Unterlänge (descent). Die Werte können sich deshalb zwischen Browsern und Betriebssystemen um einige Pixel unterscheiden.
  • Webfonts: Miss erst, wenn die Schrift geladen ist, zum Beispiel nach await document.fonts.ready. Sonst bekommst du die Metriken der Ersatzschrift.
  • Kompatibilität: Firefox unterstützt die Eigenschaft erst seit Version 116. In älteren Browsern ist sie undefined, deshalb vorher prüfen, etwa mit 'ideographicBaseline' in TextMetrics.prototype. Die Eigenschaft funktioniert auch mit OffscreenCanvasRenderingContext2D.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird stillschweigend ignoriert.