Muszę wyświetlić wpisany przez użytkownika tekst w div o stałym rozmiarze. Chcę, aby rozmiar czcionki był automatycznie dostosowywany, aby tekst wypełniał pole tak bardzo, jak to możliwe.
Więc - jeśli div wynosi 400px x 300px. Jeśli ktoś wpisze ABC, to jest to naprawdę duża czcionka. Jeśli wprowadzą akapit, będzie to mała czcionka.
Prawdopodobnie chciałbym zacząć od maksymalnego rozmiaru czcionki - może 32px, i chociaż tekst jest zbyt duży, aby zmieścił się w pojemniku, zmniejsz rozmiar czcionki, aż do dopasowania.
Odpowiedzi:
Dzięki Attack . Chciałem użyć jQuery.
Wskazałeś mi właściwy kierunek, i tak oto skończyłem:
Oto link do wtyczki: https://plugins.jquery.com/textfill/
I link do źródła: http://jquery-textfill.github.io/
i mój HTML jest taki
To jest moja pierwsza wtyczka jquery, więc prawdopodobnie nie jest tak dobra, jak powinna. Wskaźniki są z pewnością mile widziane.
źródło
404
.Nie uważałem żadnego z poprzednich rozwiązań za wystarczające ze względu na słabą wydajność, więc stworzyłem własne, które używa prostej matematyki zamiast zapętlania. Powinien również działać dobrze we wszystkich przeglądarkach.
Zgodnie z tym przypadkiem testu wydajności jest on znacznie szybszy niż inne znalezione tutaj rozwiązania.
Jeśli chcesz przyczynić się, dodałem to do Gist .
źródło
.css("font-size")
pętli. Skąd to masz? Moje rozwiązanie jest prawdopodobnie szybsze, ponieważ nie zawiera żadnych fantazyjnych elementów dodanych do wtyczki. Jesteś mile widziany, aby dodać wtyczkę do jsperf i zobaczymy, który z nich jest najszybszy;)Chociaż bardzo podoba mi się okazjonalne poparcie dla tej odpowiedzi (dzięki!), To naprawdę nie jest najlepsze podejście do tego problemu. Sprawdź niektóre inne wspaniałe odpowiedzi tutaj, zwłaszcza te, które znalazły rozwiązania bez zapętlania.
Jednak dla odniesienia, oto moja pierwotna odpowiedź :
A oto wersja z klasami :
źródło
offsetWidth
, musiałem również utworzyć zmienną dla rozmiaru, a następnie dołączyć pxtextSpan.style.fontSize = size+"px";
Większość innych odpowiedzi używa pętli, aby zmniejszyć rozmiar czcionki, dopóki nie zmieści się na div, jest to BARDZO powolne, ponieważ strona musi ponownie renderować element za każdym razem, gdy czcionka zmienia rozmiar. W końcu musiałem napisać własny algorytm, aby działał w sposób, który pozwalał mi okresowo aktualizować jego zawartość bez zamrażania przeglądarki użytkownika. Dodałem kilka innych funkcji (obracanie tekstu, dodawanie dopełnienia) i spakowałem jako wtyczkę jQuery, którą możesz pobrać pod adresem:
https://github.com/DanielHoffmann/jquery-bigtext
po prostu zadzwoń
i będzie dobrze pasować do twojego pojemnika.
Zobacz to w akcji tutaj:
http://danielhoffmann.github.io/jquery-bigtext/
Na razie ma pewne ograniczenia, div musi mieć stałą wysokość i szerokość i nie obsługuje zawijania tekstu do wielu linii.
Będę pracował nad uzyskaniem opcji ustawienia maksymalnego rozmiaru czcionki.
Edycja: Znalazłem więcej problemów z wtyczką, nie obsługuje ona innych modeli pudełek poza standardowym i div nie może mieć marginesów ani ramek. Popracuję nad tym.
Edycja2: Naprawiłem te problemy i ograniczenia i dodałem więcej opcji. Możesz ustawić maksymalny rozmiar czcionki, a także możesz ograniczyć rozmiar czcionki, używając szerokości lub wysokości. Popracuję nad przyjęciem wartości maksymalnej szerokości i maksymalnej wysokości w elemencie zawijającym.
Edycja3: Zaktualizowałem wtyczkę do wersji 1.2.0. Główne czyszczenie kodu i nowe opcje (verticalAlign, horizontalAlign, textAlign) oraz obsługa wewnętrznych elementów wewnątrz znacznika rozpiętości (takich jak podział linii lub niesamowite ikony czcionek).
źródło
Jest to oparte na tym, co opublikował GeekyMonkey, z pewnymi modyfikacjami.
źródło
Oto ulepszona metoda zapętlania, która wykorzystuje wyszukiwanie binarne, aby znaleźć największy możliwy rozmiar, który pasuje do elementu nadrzędnego w jak najmniejszej liczbie kroków (jest to szybsze i dokładniejsze niż przeskakiwanie o ustalony rozmiar czcionki). Kod jest również zoptymalizowany na kilka sposobów pod kątem wydajności.
Domyślnie zostanie wykonanych 10 kroków wyszukiwania binarnego, które osiągną 0,1% optymalnego rozmiaru. Zamiast tego możesz ustawić numIter na pewną wartość N, aby uzyskać wartość w zakresie 1/2 ^ N optymalnego rozmiaru.
Zadzwoń za pomocą selektora CSS, np .:
fitToParent('.title-span');
źródło
vAlign
ipadding
.vAlign == true
ustawia wysokość linii wybranego elementu na wysokość rodziców. Wypełnienie zmniejsza końcowy rozmiar o przekazaną wartość. Domyślnie jest to 5. Myślę, że wygląda naprawdę ładnie.Stworzyłem dyrektywę dla AngularJS - mocno zainspirowaną odpowiedzią GeekyMonkey, ale bez zależności jQuery.
Demo: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Narzut
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Dyrektywa
źródło
resizeText
wydaje się , że jest wywoływana, zanimng-bind
faktycznie przypisze tekst do elementu, co powoduje zmianę rozmiaru na podstawie poprzedniego tekstu, a nie bieżącego. Nie jest to takie złe w powyższej wersji demonstracyjnej, w której jest wywoływana wielokrotnie w miarę pisania przez użytkownika, ale jeśli zostanie wywołana raz, przechodząc od wartości null do wartości rzeczywistej (jak w powiązaniu jednokierunkowym), pozostaje na maksymalnym rozmiarze.Rozwinąłem powyższy skrypt od Marcusa Ekwalla: https://gist.github.com/3945316 i poprawiłem go zgodnie z moimi preferencjami, teraz uruchamia się, gdy okno jest zmieniane, aby dziecko zawsze mieściło się w pojemniku. Wkleiłem poniższy skrypt w celach informacyjnych.
źródło
Oto moja modyfikacja odpowiedzi PO.
Krótko mówiąc, wiele osób, które próbowały zoptymalizować tę sytuację, narzekało, że używana jest pętla. Tak, podczas gdy pętle mogą być wolne, inne podejścia mogą być niedokładne.
Dlatego moje podejście wykorzystuje wyszukiwanie binarne, aby znaleźć najlepszy rozmiar czcionki:
Pozwala to również elementowi określić minimalną i maksymalną czcionkę:
Co więcej, ten algorytm jest bezjednostkowy. Można określić
em
,rem
,%
, itd. I będzie wykorzystywać że jego wynik końcowy.Oto skrzypce: https://jsfiddle.net/fkhqhnqe/1/
źródło
Miałem dokładnie ten sam problem z moją witryną. Mam stronę wyświetlaną na projektorze, na ścianach, na dużych ekranach ..
Ponieważ nie znam maksymalnego rozmiaru mojej czcionki, ponownie użyłem wtyczki powyżej @GeekMonkey, ale zwiększałem rozmiar czcionki:
źródło
Oto wersja zaakceptowanej odpowiedzi, która może również przyjmować parametr minFontSize.
źródło
Możesz użyć FitText.js ( strona github ), aby rozwiązać ten problem. Jest naprawdę mały i wydajny w porównaniu do TextFill. TextFill używa drogiej pętli while i FitText nie.
Również FitText jest bardziej elastyczny (używam go w proyect ze specjalnymi wymaganiami i działa jak mistrz!).
HTML:
Możesz także ustawić opcje:
CSS:
A jeśli potrzebujesz, FitText ma również wersję bez jQuery .
źródło
EDYCJA: Ten kod był używany do wyświetlania notatek na górze filmu HTML5. Zmienia rozmiar czcionki w locie, gdy rozmiar wideo jest zmieniany (podczas zmiany rozmiaru okna przeglądarki). Notatki zostały połączone z filmem (podobnie jak notatki na YouTube), dlatego kod używa instancji zamiast uchwytu DOM bezpośrednio.
Zgodnie z życzeniem wrzucę kod, którego użyłem, aby to osiągnąć. (Ramki tekstowe nad filmem HTML5). Kod został napisany dawno temu i szczerze mówiąc, myślę, że jest dość niechlujny. Ponieważ na pytanie już udzielono odpowiedzi, a odpowiedź już dawno została zaakceptowana, nie zawracam sobie głowy przepisywaniem tego. Ale jeśli ktoś chce to nieco uprościć, nie ma za co!
Prawdopodobnie będziesz musiał dostosować te liczby z rodziny czcionek do rodziny czcionek. Dobrym sposobem na to jest pobranie bezpłatnego wizualizatora grafów o nazwie GeoGebra. Zmień długość tekstu i rozmiar pudełka. Następnie ręcznie ustaw rozmiar. Wykreślić ręczne wyniki w układzie współrzędnych. Następnie wpisujesz dwa równania, które tu opublikowałem, i poprawiasz liczby, aż „mój” wykres pasuje do twoich ręcznie wykreślonych punktów.
źródło
Proponowane rozwiązania iteracyjne można znacznie przyspieszyć na dwóch frontach:
1) Pomnóż rozmiar czcionki przez pewną stałą, zamiast dodawać lub odejmować 1.
2) Po pierwsze, zero przy użyciu stałej kursu, powiedzmy, podwójnej wielkości każdej pętli. Następnie, mając przybliżony pomysł, od czego zacząć, zrób to samo, dokładniej dostosowując, powiedzmy, pomnóż przez 1,1. Podczas gdy perfekcjonista może chcieć dokładnego rozmiaru w pikselach idealnej czcionki, większość obserwatorów nie zauważa różnicy między 100 a 110 pikseli. Jeśli jesteś perfekcjonistą, powtórz po raz trzeci z jeszcze lepszą regulacją.
Zamiast pisać konkretną procedurę lub wtyczkę, która odpowiada na dokładne pytanie, polegam tylko na podstawowych pomysłach i piszę różne wersje kodu, aby poradzić sobie z wszelkimi problemami związanymi z układem, a nie tylko z tekstem, włączając dopasowanie div, zakresów, obrazów. .. według szerokości, wysokości, powierzchni, ... w kontenerze, pasując do innego elementu ....
Oto przykład:
źródło
To najbardziej eleganckie rozwiązanie, jakie stworzyłem. Korzysta z wyszukiwania binarnego, wykonując 10 iteracji. Naiwnym sposobem było wykonanie pętli while i zwiększenie rozmiaru czcionki o 1, aż element zacznie się przepełniać. Za pomocą można określić, kiedy element zaczyna się przepełniać element.offsetHeight i element.scrollHeight . Jeśli scrollHeight jest większy niż offsetHeight, masz za duży rozmiar czcionki.
Wyszukiwanie binarne jest do tego znacznie lepszym algorytmem. Jest również ograniczony liczbą iteracji, które chcesz wykonać. Wystarczy wywołać flexFont i wstawić identyfikator div, a dopasuje on rozmiar czcionki między 8px oraz x 96 pikseli .
Spędziłem trochę czasu badając ten temat i wypróbowując różne biblioteki, ale ostatecznie uważam, że jest to najłatwiejsze i najprostsze rozwiązanie, które faktycznie zadziała.
Uwaga: jeśli chcesz, możesz zmienić użycie
offsetWidth
iscrollWidth
/ lub dodać oba do tej funkcji.źródło
ReferenceError: lastSizeTooSmall is not defined
. Może to gdzieś trzeba zdefiniować?Mam ten sam problem, a rozwiązaniem jest użycie javascript do kontrolowania rozmiaru czcionki. Sprawdź ten przykład na codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Ten przykład dotyczy tylko wysokości, być może trzeba wstawić trochę, jeśli chodzi o szerokość.
źródło
Podobało mi się
źródło
Chciałem tylko dodać moją wersję dla contenteditables.
źródło
Znalazłem sposób, aby zapobiec użyciu pętli do zmniejszania tekstu. Dostosowuje rozmiar czcionki, mnożąc ją dla szybkości między szerokością pojemnika a szerokością zawartości. Jeśli więc szerokość kontenera wynosi 1/3 zawartości, rozmiar czcionki zostanie zmniejszony o 1/3 i będzie zawierał szerokość kontenera. Aby zwiększyć skalę, użyłem pętli while, dopóki zawartość nie będzie większa niż kontener.
Ten kod jest częścią testu, który przesłałem do Github https://github.com/ricardobrg/fitText/
źródło
Wybrałem rozwiązanie geekMonkey, ale jest zbyt wolne. Robi to, że dostosowuje rozmiar czcionki do maksimum (maxFontPixels), a następnie sprawdza, czy mieści się w pojemniku. w przeciwnym razie zmniejsza rozmiar czcionki o 1px i sprawdza ponownie. Może po prostu sprawdzisz poprzedni pojemnik pod kątem wysokości i podasz tę wartość? (tak, wiem dlaczego, ale teraz stworzyłem rozwiązanie, które działa tylko na wysokości i ma również opcję min / max)
Oto o wiele szybsze rozwiązanie:
i to byłby HTML:
Znowu: to rozwiązanie WYŁĄCZNIE sprawdza wysokość pojemnika. Dlatego ta funkcja nie musi sprawdzać, czy element pasuje do środka. Ale zaimplementowałem również wartość min / max (40min, 150max), więc dla mnie działa to doskonale dobrze (a także działa na zmianę rozmiaru okna).
źródło
Oto kolejna wersja tego rozwiązania:
źródło