Specyfikacja ma funkcję context.measureText (tekst), która powie Ci, jakiej szerokości wymagałoby wydrukowanie tego tekstu, ale nie mogę znaleźć sposobu, aby dowiedzieć się, jaka jest wysokość. Wiem, że jest oparty na czcionce, ale nie wiem, jak przekonwertować ciąg czcionki na wysokość tekstu.
javascript
text
canvas
swampsjohn
źródło
źródło
M̶̢̹̝͖̦̖̭͕̭̣͆̃̀̅̒̊͌̿ͅ
, więc jest to naprawdę trudny problem, więc rozwiąż go dla ogólnego przypadku.Odpowiedzi:
UPDATE - jako przykład tej pracy użyłem tej techniki w edytorze Carota .
Kontynuując odpowiedź ellisbben, oto ulepszona wersja, która pozwala uzyskać wznoszenie i opadanie z linii bazowej, tj . Takie same jak
tmAscent
itmDescent
zwracane przez GetTextMetric API Win32 . Jest to potrzebne, jeśli chcesz utworzyć tekst zawijany w słowo z rozpiętościami w różnych czcionkach / rozmiarach.Powyższy obraz został wygenerowany na płótnie w Safari, gdzie czerwony to górna linia, w której płótno ma narysować tekst, zielony to linia bazowa, a niebieski to dół (tak więc czerwony do niebieskiego to pełna wysokość).
Używanie jQuery do zwięzłości:
Oprócz elementu tekstowego dodaję element div z pomocą,
display: inline-block
aby ustawić jegovertical-align
styl, a następnie dowiedzieć się, gdzie umieściła go przeglądarka.Otrzymujesz więc obiekt za pomocą
ascent
,descent
iheight
(co jest tylkoascent
+descent
dla wygody). Aby to przetestować, warto mieć funkcję rysującą poziomą linię:Następnie możesz zobaczyć, jak tekst jest umieszczony na płótnie względem góry, linii bazowej i dołu:
źródło
getTextHeight()
navar text = $('<span>Hg</span>').css({ 'font-family': fontName, 'font-size' : fontSize });
, tj. Osobno dodając rozmiar.<div></div>
do<div style="white-space : nowrap;"></div>
obsługi bardzo długich strunMożesz uzyskać bardzo dokładne przybliżenie wysokości pionowej, sprawdzając długość dużej litery M.
źródło
Specyfikacja płótna nie daje nam metody pomiaru wysokości sznurka. Możesz jednak ustawić rozmiar tekstu w pikselach i zwykle możesz stosunkowo łatwo ustalić, jakie są pionowe granice.
Jeśli potrzebujesz czegoś bardziej precyzyjnego, możesz rzucić tekst na płótno, a następnie pobrać dane pikseli i dowiedzieć się, ile pikseli jest używanych w pionie. Byłoby to stosunkowo proste, ale niezbyt wydajne. Możesz zrobić coś takiego (to działa, ale rysuje na płótnie tekst, który chcesz usunąć):
W przypadku Bespin fałszują wysokość, mierząc szerokość małej litery „m” ... Nie wiem, jak to jest używane i nie polecałbym tej metody. Oto odpowiednia metoda Bespin:
źródło
em
jest względną miarą czcionki, w której jeden em jest równy wysokości literyM
w domyślnym rozmiarze czcionki.Przeglądarki zaczynają obsługiwać zaawansowane metryki tekstu , co sprawi, że to zadanie będzie trywialne, gdy będzie szeroko obsługiwane:
fontHeight
podaje wysokość obwiedni, która jest stała niezależnie od renderowanego ciągu.actualHeight
jest specyficzne dla renderowanego ciągu.Specyfikacja: https://www.w3.org/TR/2012/CR-2dcontext-20121217/#dom-textmetrics-fontboundingboxascent i sekcje tuż poniżej.
Stan wsparcia (20 sierpnia 2017 r.):
źródło
EDYCJA: Czy używasz przekształceń płótna? Jeśli tak, będziesz musiał śledzić macierz transformacji. Poniższa metoda powinna mierzyć wysokość tekstu przy początkowej transformacji.
EDYCJA # 2: Dziwne, poniższy kod nie daje poprawnych odpowiedzi, gdy uruchamiam go na tej stronie StackOverflow; jest całkowicie możliwe, że obecność pewnych reguł stylu może zakłócić tę funkcję.
Płótno używa czcionek zdefiniowanych przez CSS, więc teoretycznie możemy po prostu dodać odpowiednio stylizowany fragment tekstu do dokumentu i zmierzyć jego wysokość. Myślę, że jest to znacznie łatwiejsze niż renderowanie tekstu, a następnie sprawdzanie danych pikseli, a także powinno uwzględniać wznoszenia i opadanie. Sprawdź następujące:
Musisz upewnić się, że styl czcionki jest poprawny w elemencie DOM, którego wysokość mierzysz, ale to całkiem proste; naprawdę powinieneś użyć czegoś takiego jak
źródło
Czy wysokość tekstu w pikselach nie jest równa rozmiarowi czcionki (w punktach), jeśli zdefiniujesz czcionkę za pomocą context.font?
źródło
Jak sugeruje JJ Stiff, możesz dodać swój tekst do rozpiętości, a następnie zmierzyć przesunięcie Wysokość rozpiętości.
Jak pokazano na HTML5Rocks
źródło
Aby dodać do odpowiedzi Daniela (co jest świetne! I absolutnie słuszne!), Wersja bez JQuery:
Właśnie przetestowałem powyższy kod i działa świetnie w najnowszym Chrome, FF i Safari na Macu.
EDYCJA: Dodałem również rozmiar czcionki i przetestowałem z czcionką internetową zamiast czcionką systemową - działa świetnie.
źródło
Rozwiązałem ten problem w prosty sposób - używając manipulacji pikselami.
Oto graficzna odpowiedź:
Oto kod:
źródło
Piszę emulator terminala, więc musiałem rysować prostokąty wokół znaków.
Oczywiście, jeśli chcesz dokładnej ilości miejsca zajmowanego przez postać, to nie pomoże. Ale da ci to dobre przybliżenie dla pewnych zastosowań.
źródło
Zaimplementowałem ładną bibliotekę do pomiaru dokładnej wysokości i szerokości tekstu za pomocą płótna HTML. To powinno zrobić, co chcesz.
https://github.com/ChrisBellew/text-measurer.js
źródło
Oto prosta funkcja. Nie potrzeba żadnej biblioteki.
Napisałem tę funkcję, aby uzyskać górne i dolne granice względem linii bazowej. Jeśli
textBaseline
jest ustawiona naalphabetic
. Tworzy kolejne płótno, a następnie rysuje je, a następnie znajduje najwyższy i najniższy niepusty piksel. I to są górne i dolne granice. Zwraca ją jako względną, więc jeśli wysokość wynosi 20 pikseli i nie ma nic poniżej linii bazowej, to górna granica to-20
.Musisz dostarczyć do niego postacie. W przeciwnym razie da ci to oczywiście 0 wysokości i 0 szerokości.
Stosowanie:
Oto funkcja:
relativeBot
,relativeTop
iheight
są użytecznymi rzeczami w zwracanym obiekcie.Oto przykładowe użycie:
relativeBot
IrelativeTop
to, co widzisz w tym obrazie tutaj:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
źródło
odpowiedź w jednej linii
CSS „line-height: normal” mieści się w zakresie od 1 do 1,2
przeczytaj tutaj, aby uzyskać więcej informacji
źródło
Zabawne, że TextMetrics ma tylko szerokość i nie ma wysokości:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#textmetrics
Czy możesz użyć Span jak w tym przykładzie?
http://mudcu.be/journal/2011/01/html5-typographic-metrics/#alignFix
źródło
Oto, co zrobiłem na podstawie niektórych innych odpowiedzi tutaj:
źródło
Przede wszystkim należy ustawić wysokość rozmiaru czcionki, a następnie zgodnie z wartością wysokości czcionki, aby określić aktualną wysokość Twojego tekstu, to ile, przecinające się linie tekstu, oczywiście, taka sama wysokość czcionka musi się kumulować, jeśli tekst nie przekracza największej wysokości pola tekstowego, wszystkie pokazują, w przeciwnym razie pokazują tylko tekst w tekście ramki. Wysokie wartości wymagają własnej definicji. Im większa wstępnie ustawiona wysokość, tym większa wysokość tekstu, który należy wyświetlić i przechwycić.
Po przetworzeniu efektu (rozwiązaniu)
Zanim efekt zostanie przetworzony (nierozwiązany)
źródło
Odkryłem, że JUST FOR ARIAL najprostszym, najszybszym i najdokładniejszym sposobem na określenie wysokości ramki granicznej jest użycie szerokości określonych liter. Jeśli planujesz użyć określonej czcionki, nie pozwalając użytkownikowi na wybranie innej, możesz przeprowadzić trochę badań, aby znaleźć właściwą literę, która będzie działać dla tej czcionki.
źródło
ustawienie rozmiaru czcionki może jednak nie być praktyczne, ponieważ ustawienie
ctx.font = ''
użyje tego zdefiniowanego przez CSS, jak również wszelkich osadzonych tagów czcionek. Jeśli używasz czcionki CSS, nie masz pojęcia, jaka jest wysokość w sposób programistyczny, używając metody MeasureText, która jest bardzo krótkowzroczna. Z drugiej jednak strony IE8 zwraca szerokość i wysokość.
źródło
Działa to 1) również w przypadku tekstu wielowierszowego 2), a nawet w IE9!
źródło
Wiem, że jest to stare pytanie, na które udzielono odpowiedzi, ale na przyszłość chciałbym dodać krótkie, minimalne, tylko w JS (bez jquery) rozwiązanie. Wierzę, że ludzie mogą skorzystać z:
źródło
W normalnych sytuacjach powinny działać:
źródło
To szalone ... Wysokość tekstu to rozmiar czcionki .. Czy nikt z Was nie czytał dokumentacji?
spowoduje to ustawienie wysokości na 22 piksele.
jedynym powodem jest ...
wynika z tego, że szerokość łańcucha nie może zostać określona, chyba że zna łańcuch, którego szerokość chcesz, ale dla wszystkich ciągów narysowanych czcionką ... wysokość będzie wynosić 22 piksele.
jeśli użyjesz innego pomiaru niż px, wysokość nadal będzie taka sama, ale z tym pomiarem, więc co najwyżej wszystko, co musisz zrobić, to przekonwertować pomiar.
źródło
Przybliżone rozwiązanie:
Będzie to dokładny wynik w czcionce o stałej szerokości.
źródło