Zentrieren Sie (proportionale Schriftart) Text in einem HTML5-Canvas
Lesezeit: 4 Minuten
Christos Hayward
Ich möchte in der Lage sein, einzelne Textzeilen in rechteckigen Bereichen zu zentrieren, die ich berechnen kann. Das einzige, was ich in der 2D-Geometrie auf einer Leinwand erwartet habe, ist, etwas zu zentrieren, dessen Breite Ihnen unbekannt ist.
Ich habe als Problemumgehung gehört, dass Sie den Text in einem HTML-Container erstellen und dann jQuery aufrufen können width() funktionieren, aber ich ?habe die momentane Hinzufügung zum Hauptteil des Dokuments nicht korrekt gehandhabt? und hat eine Breite von 0.
Wenn ich eine einzelne Textzeile habe, die deutlich kürzer ist, als sie den größten Teil der Breite eines Bildschirms ausfüllen würde, wie kann ich dann feststellen, wie breit sie bei einer mir bekannten Schriftgröße auf einer Leinwand sein wird?
nicht eingestellt display: none für Element vor dem Lesen seiner Breite.
Dadurch sollte ein Text sowohl vertikal als auch horizontal zentriert werden.
developer.mozilla.org Staaten in der textAlign Beschreibung, die der Ausrichtung zugrunde liegt auf den x-Wert des Kontextes fillText() Methode. Das heißt, die Eigenschaft zentriert den Text im Zeichenbereich nicht horizontal; es zentriert den Text um die angegebene x-Koordinate. Ähnliches gilt für die textBaseLine.
Um also den Text in beide Richtungen zu zentrieren, müssen wir diese beiden Eigenschaften festlegen und den Text in der Mitte der Leinwand positionieren.
Guter Kommentar ! die API sagt nicht, dass ctx.textAlign = ‘center’ vom x-Wert von ctx.fillText(‘text’, x, y) zentriert ist … stundenlange Recherche …
– SNS – Web und Informatik
1. Mai 2020 um 2:20 Uhr
Sie können verwenden ctx.textAlign = “center”; Objekt mittig auszurichten
var canva = document.getElementById("canvas");
ctx.textAlign = "center"; // To Align Center
ctx.font = "40px Arial"; // To change font size and type
ctx.fillStyle="#313439"; // To give font
ctx.fillText("Text Center", 150 ,80);
Für die horizontale Zentrierung verwenden wir ctx.textBaseline="middle"; ctx.textAlign = 'center';. Aber um vertikal zu zentrieren, müssen wir verwenden ctx.measureText.
(actualBoundingBoxAscent - actualBoundingBoxDescent) / 2 ist wichtig, da Text für verschiedene Schriftarten unterschiedlich vertikal ausgerichtet werden kann.
Für diejenigen, die sich fragen, wie sie die Höhe auch richtig ausrichten können measureText() gibt die Höhe nicht zurück (!).
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
const centered = (text, size) => {
ctx.font = size + 'px monospace';
let s = ctx.measureText(text).width;
ctx.fillText(text, canvas.width / 2 - s / 2, canvas.height / 2 + size / 4);
}
/* Just for the demo, really!
* Please don't do this!
* Use proper animation frames requests
* and clear timeout(s)!!! */
[["is", 40], ["able",45], ["<-- to -->",50], ["FLEX", 55], [" SMOOTH!", 58], ["FLEX!!", 62], ["FLEX!!!", 63] ].forEach((e) => {
setTimeout(() => {
ctx.clearRect(0, 0, canvas.width, canvas.height)
centered(e[0], e[1])
}, e[1]*100)
})
// Intro test
centered("CANFLEX", 50)
canvas{
outline: 1px black solid
}
<canvas><canvas>
Gemeinschaft
Was Sie tun, ist, Ihren Text mit einem negativen Texteinzug außerhalb des Bildschirms zu rendern und dann die Größe zu erfassen.
text-indent: -9999px
Siehe: Text mit “text-indent” ausblenden
Ich verstehe nicht, was das mit der gestellten Frage zu tun hat. Er sucht nach der Größe, damit er sie auf der Leinwand zentrieren kann.
– Loktar
8. Dezember 2012 um 1:17 Uhr
Ich denke, seine Antwort bezieht sich auf die Problemumgehung JonathanHayward erwähnt, aber in diesem Fall ist es besser (und zuverlässiger), die Breite des Textes direkt auf die Leinwand zu stellen (wie in Ihrer Antwort).
– Römer
8. Dezember 2012 um 3:04 Uhr
Loktar, lesen Sie die Frage „Ich habe die momentane Hinzufügung zum Hauptteil des Dokuments nicht korrekt gehandhabt und eine Breite von 0 erhalten.“ — Das liegt daran, dass Sie versteckte Inhalte nicht messen können. Die Alternative besteht darin, es sichtbar, aber AUS DEM BILDSCHIRM zu machen, damit der Benutzer es nicht sieht, und es dann zu messen.
– Diodeus – James MacFarlane
11. Dezember 2012 um 17:13 Uhr
10178500cookie-checkZentrieren Sie (proportionale Schriftart) Text in einem HTML5-Canvasyes
nicht eingestellt
display: none
für Element vor dem Lesen seiner Breite.– nodisch
7. Dezember 2012 um 21:39 Uhr