Chciałbym użyć JavaScript do obliczenia szerokości łańcucha. Czy jest to możliwe bez konieczności używania kroju pisma monospace?
Jeśli nie jest wbudowany, moim jedynym pomysłem jest utworzenie tabeli szerokości dla każdego znaku, ale jest to dość nierozsądne, szczególnie obsługując Unicode i różne rozmiary typów (i wszystkie przeglądarki w tym zakresie).
javascript
textbox
Jakub
źródło
źródło
Odpowiedzi:
Utwórz DIV w stylu z następującymi stylami. W swoim JavaScript ustaw rozmiar czcionki i atrybuty, które próbujesz zmierzyć, umieść swój ciąg w DIV, a następnie przeczytaj aktualną szerokość i wysokość DIV. Rozciągnie się, aby dopasować do zawartości, a rozmiar będzie mieścić się w odległości kilku pikseli od renderowanego rozmiaru ciągu.
źródło
+1
jest ten wymiar?W HTML 5 możesz po prostu użyć metody Canvas.measureText (dalsze wyjaśnienie tutaj ).
Wypróbuj to skrzypce :
To skrzypce porównuje tę metodę Canvas z odmianą metody opartej na modelu DOM Boba Monteverde'a , dzięki czemu można analizować i porównywać dokładność wyników.
Podejście to ma kilka zalet, w tym:
textAlign
itextBaseline
.UWAGA: Kiedy dodajesz tekst do DOM, pamiętaj, aby wziąć również pod uwagę wypełnienie, margines i ramkę .
UWAGA 2: W niektórych przeglądarkach ta metoda zapewnia dokładność subpikseli (wynik jest liczbą zmiennoprzecinkową), w innych nie (wynik jest tylko liczbą całkowitą). Możesz uruchomić
Math.floor
(lubMath.ceil
) wynik, aby uniknąć niespójności. Ponieważ metoda oparta na DOM nigdy nie jest dokładna w subpikselach, ta metoda ma jeszcze wyższą precyzję niż inne metody tutaj.Zgodnie z tym jsperf (dzięki autorom komentarzy) metoda Canvas i metoda DOM są równie szybkie, jeśli buforowanie jest dodawane do metody DOM i nie używasz przeglądarki Firefox. W Firefoksie z jakiegoś powodu ta metoda Canvas jest znacznie szybsza niż metoda oparta na DOM (stan na wrzesień 2014 r.).
źródło
strokeText()
lub tyfillText()
. Może chciałeś skomentować inną odpowiedź?Oto jeden, który wymieszałem bez przykładu. Wygląda na to, że wszyscy jesteśmy na tej samej stronie.
Korzystanie z niego jest proste:
"a string".width()
** Dodano,
white-space: nowrap
aby można było obliczyć ciągi o szerokości większej niż szerokość okna.źródło
String
ponieważ zmniejsza to rozdzielenie obaw twojego programu (oddzielny kod podstawowy vs. kod interfejsu użytkownika). Wyobraź sobie, że chcesz przenieść swój kod główny na platformę z zupełnie innym frameworkiem interfejsu użytkownika ...o[0].getBoundingClientRect().width
zgodnie z sugestią tutaj: stackoverflow.com/a/16072668/936397jQuery:
źródło
To działa dla mnie ...
źródło
Przez biblioteki ExtJS obsługa JavaScript ma wielką klasę o nazwie Ext.util.TextMetrics że „zapewnia precyzyjne pomiary pikseli dla bloków tekstu, dzięki czemu można dokładnie określić, jak wysokie i szerokie, w pikselach, dany blok tekstu będzie”. Możesz użyć go bezpośrednio lub wyświetlić jego kod źródłowy, aby zobaczyć, jak to się robi.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
źródło
Podoba mi się twój „jedyny pomysł” zrobienia statycznej mapy szerokości postaci! W rzeczywistości działa dobrze dla moich celów. Czasami, ze względu na wydajność lub ponieważ nie masz łatwego dostępu do DOM, możesz po prostu chcieć szybkiego, samodzielnego kalkulatora skalibrowanego do pojedynczej czcionki. Oto jeden skalibrowany do Helvetica; przekazać ciąg i (opcjonalnie) rozmiar czcionki:
Ta olbrzymia brzydka tablica ma szerokość znaków ASCII indeksowaną kodem znaków. To obsługuje tylko ASCII (w przeciwnym razie zakłada średnią szerokość znaków). Na szczęście szerokość zasadniczo skaluje się liniowo z rozmiarem czcionki, więc działa całkiem dobrze przy każdym rozmiarze czcionki. Zauważalnie brakuje mu świadomości kerningu, ligatur czy czegokolwiek innego.
Aby „skalibrować” po prostu renderowałem każdą postać do charCode 126 (potężna tylda) na pliku svg, dostałem obwiednię i zapisałem ją w tej tablicy; więcej kodu, wyjaśnienia i demo tutaj .
źródło
* fontSize
i po prostu ich użyćNapisałem do tego małe narzędzie. Być może jest to przydatne dla kogoś. Działa bez jQuery .
https://github.com/schickling/calculate-size
Stosowanie:
Fiddle: http://jsfiddle.net/PEvL8/
źródło
Możesz użyć płótna, abyś nie musiał tak bardzo zajmować się właściwościami css:
źródło
Powinno to działać tak długo, jak długo znacznik <span> nie ma do niego zastosowania żadne inne style. offsetWidth obejmie szerokość dowolnych granic, dopełnienie w poziomie, szerokość pionowego paska przewijania itp.
źródło
Poniższe fragmenty kodu „obliczają” szerokość znacznika span, dodają do niego „...”, jeśli jest za długi i zmniejsza długość tekstu, dopóki nie dopasuje się do elementu nadrzędnego (lub dopóki nie spróbuje więcej niż tysiąc razy)
CSS
HTML
JavaScript (z jQuery)
źródło
Lepiej jest wykryć, czy tekst będzie pasował tuż przed wyświetleniem elementu. Możesz więc użyć tej funkcji, która nie wymaga wyświetlania elementu na ekranie.
Stosowanie:
źródło
Na wypadek, gdyby ktoś tu przybył i szukał zarówno sposobu pomiaru szerokości łańcucha, jak i sposobu określenia, jaki jest największy rozmiar czcionki pasujący do określonej szerokości, oto funkcja oparta na rozwiązaniu @ Domi z wyszukiwaniem binarnym :
źródło
Wypróbuj ten kod:
źródło
Szerokość i wysokość tekstu można uzyskać za pomocą
clientWidth
iclientHeight
upewnij się, że właściwość position stylu jest ustawiona na wartość bezwzględną
nie musi znajdować się w a
div
, może znajdować się w ap
lub aspan
źródło
Opierając się na odpowiedzi Deepaka Nadara , zmieniłem parametr funkcji, aby akceptować style tekstu i czcionek. Nie musisz odwoływać się do elementu. Ponadto
fontOptions
mają wartości domyślne, więc nie trzeba podawać ich wszystkich.źródło
Wydaje mi się, że jest to podobne do wpisu Depaka, ale oparte jest na pracy Louisa Lazarisa opublikowanej w artykule na imponującej stronie internetowej
Zdarzenie dopasowania służy do natychmiastowego wykonania wywołania funkcji po przypisaniu funkcji do sterowania.
np .: $ („input”). autofit (). trigger („fit”);
źródło
Bez jQuery:
źródło
Skrzypek przykładowego działania: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Kod JavaScript:
źródło
Zsumowanie wszystkich zwróconych szerokości prostokąta daje całkowitą szerokość tekstu w pikselach.
źródło
Zrobiłem mały moduł ES6 (używa jQuery):
Łatwy w użyciu:
Fajna rzecz, którą możesz zauważyć - pozwala uwzględnić wszelkie atrybuty CSS, nawet wypełnienia!
źródło
Możesz to również zrobić za pomocą createRange, który jest dokładniejszy niż technika klonowania tekstu:
źródło
źródło