Ich muss vom Benutzer eingegebenen Text in einem Div mit fester Größe anzeigen. Ich möchte, dass die Schriftgröße automatisch angepasst wird, damit der Text das Feld so weit wie möglich ausfüllt.
Also - Wenn das div 400px x 300px ist. Wenn jemand ABC betritt, ist es eine wirklich große Schrift. Wenn sie einen Absatz eingeben, ist dies eine winzige Schriftart.
Ich möchte wahrscheinlich mit einer maximalen Schriftgröße beginnen - vielleicht 32 Pixel - und während der Text zu groß ist, um in den Container zu passen, verkleinern Sie die Schriftgröße, bis sie passt.
Antworten:
Danke Attack . Ich wollte jQuery verwenden.
Sie haben mich in die richtige Richtung gelenkt, und am Ende habe ich Folgendes erreicht:
Hier ist ein Link zum Plugin: https://plugins.jquery.com/textfill/
Und ein Link zur Quelle: http://jquery-textfill.github.io/
und mein HTML ist so
Dies ist mein erstes jquery-Plugin, daher ist es wahrscheinlich nicht so gut, wie es sein sollte. Zeiger sind auf jeden Fall willkommen.
quelle
404
.Ich fand keine der vorherigen Lösungen aufgrund der schlechten Leistung ausreichend, also habe ich meine eigene erstellt, die einfache Mathematik anstelle von Schleifen verwendet. Sollte auch in allen Browsern funktionieren.
Nach diesem Leistungstestfall ist es viel schneller als die anderen hier gefundenen Lösungen.
Wenn Sie dazu beitragen möchten, habe ich dies zu Gist hinzugefügt .
quelle
.css("font-size")
Schleife auf. Woher hast du das? Meine Lösung ist wahrscheinlich schneller, da sie nichts Besonderes enthält, das Sie Ihrem Plugin hinzugefügt haben. Du kannst gerne dein Plugin zum jsperf hinzufügen und wir werden sehen, welches das schnellste ist;)So sehr ich die gelegentlichen Upvotes liebe, die ich für diese Antwort bekomme (danke!), Dies ist wirklich nicht der beste Ansatz für dieses Problem. Schauen Sie sich hier einige der anderen wunderbaren Antworten an, insbesondere diejenigen, die Lösungen ohne Schleifen gefunden haben.
Als Referenz hier noch meine ursprüngliche Antwort :
Und hier ist eine Version mit Klassen :
quelle
offsetWidth
, ich musste auch eine Variable für die Größe erstellen und dann den px anhängentextSpan.style.fontSize = size+"px";
Die meisten anderen Antworten verwenden eine Schleife, um die Schriftgröße zu verringern, bis sie auf das div passt. Dies ist SEHR langsam, da die Seite das Element jedes Mal neu rendern muss, wenn sich die Schriftgröße ändert. Ich musste schließlich meinen eigenen Algorithmus schreiben, damit er so funktioniert, dass ich seinen Inhalt regelmäßig aktualisieren konnte, ohne den Benutzerbrowser einzufrieren. Ich habe einige andere Funktionen hinzugefügt (Text drehen, Auffüllen hinzufügen) und es als jQuery-Plugin verpackt. Sie erhalten es unter:
https://github.com/DanielHoffmann/jquery-bigtext
einfach anrufen
und es passt gut auf Ihren Behälter.
Sehen Sie es hier in Aktion:
http://danielhoffmann.github.io/jquery-bigtext/
Im Moment gibt es einige Einschränkungen, das div muss eine feste Höhe und Breite haben und es wird nicht unterstützt, Text in mehrere Zeilen zu umbrechen.
Ich werde daran arbeiten, eine Option zum Festlegen der maximalen Schriftgröße zu erhalten.
Bearbeiten: Ich habe einige weitere Probleme mit dem Plugin gefunden, es behandelt kein anderes Box-Modell als das Standard-Modell und das Div kann keine Ränder oder Ränder haben. Ich werde daran arbeiten.
Edit2: Ich habe diese Probleme und Einschränkungen jetzt behoben und weitere Optionen hinzugefügt. Sie können die maximale Schriftgröße festlegen und die Schriftgröße entweder mit Breite, Höhe oder beidem begrenzen. Ich werde daran arbeiten, Werte für die maximale Breite und die maximale Höhe im Wrapper-Element zu akzeptieren.
Edit3: Ich habe das Plugin auf Version 1.2.0 aktualisiert. Umfassende Bereinigung des Codes und neuer Optionen (vertikalAlign, horizontalAlign, textAlign) und Unterstützung für innere Elemente innerhalb des Span-Tags (wie Zeilenumbrüche oder Symbole für großartige Schriftarten).
quelle
Dies basiert auf dem, was GeekyMonkey oben veröffentlicht hat, mit einigen Änderungen.
quelle
Hier ist eine verbesserte Schleifenmethode, bei der mithilfe der binären Suche in möglichst wenigen Schritten die größtmögliche Größe gefunden wird, die in das übergeordnete Element passt (dies ist schneller und genauer als das Schrittmachen einer festen Schriftgröße). Der Code ist auch auf verschiedene Arten für die Leistung optimiert.
Standardmäßig werden 10 binäre Suchschritte ausgeführt, die innerhalb von 0,1% der optimalen Größe liegen. Sie können stattdessen numIter auf einen Wert N setzen, um innerhalb von 1/2 ^ N der optimalen Größe zu sein.
Rufen Sie es mit einem CSS-Selektor auf, z.
fitToParent('.title-span');
quelle
vAlign
und hinzuzufügenpadding
.vAlign == true
Legt die Zeilenhöhe des ausgewählten Elements auf die Höhe der übergeordneten Elemente fest. Durch Auffüllen wird die endgültige Größe um den übergebenen Wert verringert. Der Standardwert ist 5. Ich denke, es sieht wirklich gut aus.Ich habe eine Direktive für AngularJS erstellt - stark inspiriert von GeekyMonkeys Antwort, aber ohne die jQuery-Abhängigkeit.
Demo: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Markup
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Richtlinie
quelle
resizeText
es aufgerufen zu werden scheint, bevor derng-bind
Text dem Element tatsächlich zugewiesen wird, was dazu führt, dass die Größe auf dem vorherigen Text und nicht auf dem aktuellen Text basiert. Dies ist in der obigen Demo nicht schlecht, in der es wiederholt aufgerufen wird, während der Benutzer eingibt. Wenn es jedoch einmal aufgerufen wird und von null auf den tatsächlichen Wert übergeht (wie bei einer Einwegbindung), bleibt es bei der maximalen Größe.Ich habe das obige Skript von Marcus Ekwall gegabelt: https://gist.github.com/3945316 und es an meine Einstellungen angepasst. Es wird jetzt ausgelöst, wenn die Fenstergröße geändert wird, sodass das Kind immer in seinen Container passt. Ich habe das folgende Skript als Referenz eingefügt.
quelle
Hier ist meine Änderung der Antwort des OP.
Kurz gesagt, viele Leute, die versuchten, dies zu optimieren, beklagten sich darüber, dass eine Schleife verwendet wurde. Ja, während Schleifen langsam sein können, können andere Ansätze ungenau sein.
Daher verwendet mein Ansatz die binäre Suche , um die beste Schriftgröße zu finden:
Dadurch kann das Element auch die minimale und maximale Schriftart angeben:
Darüber hinaus ist dieser Algorithmus einheitlos. Sie angeben
em
,rem
,%
usw. , und es wird , dass für sein endgültiges Ergebnis verwenden.Hier ist die Geige: https://jsfiddle.net/fkhqhnqe/1/
quelle
Ich hatte genau das gleiche Problem mit meiner Website. Ich habe eine Seite, die auf einem Projektor, an Wänden, auf großen Bildschirmen angezeigt wird.
Da ich die maximale Schriftgröße nicht kenne, habe ich das obige Plugin von @GeekMonkey erneut verwendet, aber die Schriftgröße erhöht:
quelle
Hier ist eine Version der akzeptierten Antwort, die auch einen minFontSize-Parameter annehmen kann.
quelle
Sie können FitText.js ( Github-Seite) verwenden ) verwenden, um dieses Problem zu lösen. Ist im Vergleich zu TextFill sehr klein und effizient. TextFill verwendet eine teure while-Schleife und FitText nicht.
Auch FitText ist flexibler (ich benutze es in einem Projekt mit ganz besonderen Anforderungen und funktioniert wie ein Champion!).
HTML:
Sie können auch Optionen festlegen:
CSS:
Und wenn Sie es brauchen, hat FitText auch eine No-jQuery-Version .
quelle
BEARBEITEN: Dieser Code wurde verwendet, um Notizen über einem HTML5-Video anzuzeigen. Es ändert die Schriftgröße im laufenden Betrieb, wenn die Größe des Videos geändert wird (wenn die Größe des Browserfensters geändert wird). Die Notizen wurden mit dem Video verbunden (genau wie Notizen auf YouTube), weshalb der Code Instanzen anstelle eines DOM-Handles verwendet direkt.
Auf Anfrage werde ich einen Code eingeben, mit dem ich dies erreicht habe. (Textfelder über einem HTML5-Video.) Der Code wurde vor langer Zeit geschrieben, und ich denke ehrlich gesagt, dass er ziemlich chaotisch ist. Da die Frage bereits beantwortet wurde und eine Antwort bereits vor langer Zeit akzeptiert wurde, mache ich mir nicht die Mühe, dies neu zu schreiben. Aber wenn jemand dies ein wenig vereinfachen möchte, sind Sie herzlich willkommen!
Sie müssen diese Zahlen wahrscheinlich von Schriftfamilie zu Schriftfamilie anpassen. Ein guter Weg, dies zu tun, ist das Herunterladen eines kostenlosen Grafik-Visualisierers namens GeoGebra. Ändern Sie die Länge des Textes und die Größe des Feldes. Dann stellen Sie die Größe manuell ein. Zeichnen Sie die manuellen Ergebnisse in das Koordinatensystem. Dann geben Sie die beiden Gleichungen ein, die ich hier gepostet habe, und passen die Zahlen an, bis "mein" Diagramm zu Ihren eigenen manuell gezeichneten Punkten passt.
quelle
Die vorgeschlagenen iterativen Lösungen können an zwei Fronten dramatisch beschleunigt werden:
1) Multiplizieren Sie die Schriftgröße mit einer Konstanten, anstatt 1 zu addieren oder zu subtrahieren.
2) Zuerst Null, wenn Sie eine Kurskonstante verwenden, z. B. die doppelte Größe jeder Schleife. Machen Sie dann mit einer groben Vorstellung davon, wo Sie anfangen sollen, dasselbe mit einer feineren Einstellung, multiplizieren Sie beispielsweise mit 1,1. Während der Perfektionist möglicherweise die exakte ganzzahlige Pixelgröße der idealen Schriftart wünscht, bemerken die meisten Beobachter den Unterschied zwischen 100 und 110 Pixel nicht. Wenn Sie ein Perfektionist sind, wiederholen Sie ein drittes Mal mit einer noch feineren Einstellung.
Anstatt eine bestimmte Routine oder ein Plug-In zu schreiben, das die genaue Frage beantwortet, verlasse ich mich nur auf die Grundideen und schreibe Variationen des Codes, um alle Arten von Layoutproblemen zu behandeln, nicht nur Text, einschließlich passender Divs, Spans, Bilder. .. nach Breite, Höhe, Fläche, ... innerhalb eines Containers, passend zu einem anderen Element ....
Hier ist ein Beispiel:
quelle
Dies ist die eleganteste Lösung, die ich erstellt habe. Es verwendet die binäre Suche und führt 10 Iterationen durch. Der naive Weg bestand darin, eine while-Schleife durchzuführen und die Schriftgröße um 1 zu erhöhen, bis das Element überzulaufen begann. Mit element.offsetHeight und element.scrollHeight können Sie bestimmen, wann ein Element zu überlaufen beginnt . Wenn scrollHeight größer als offsetHeight ist, haben Sie eine zu große Schriftgröße.
Die binäre Suche ist hierfür ein viel besserer Algorithmus. Es ist auch durch die Anzahl der Iterationen begrenzt, die Sie ausführen möchten. Rufen Sie einfach flexFont auf und geben Sie die div-ID ein. Dadurch wird die Schriftgröße zwischen 8 und 96 Pixel angepasst .
Ich habe einige Zeit damit verbracht, dieses Thema zu erforschen und verschiedene Bibliotheken auszuprobieren, aber letztendlich denke ich, dass dies die einfachste und einfachste Lösung ist, die tatsächlich funktionieren wird.
Beachten Sie, wenn Sie möchten, können Sie die Verwendung von
offsetWidth
und ändernscrollWidth
oder beide zu dieser Funktion hinzufügen.quelle
ReferenceError: lastSizeTooSmall is not defined
. Vielleicht muss das irgendwo definiert werden?Ich habe das gleiche Problem und die Lösung besteht darin, Javascript zu verwenden, um die Schriftgröße zu steuern. Überprüfen Sie dieses Beispiel auf Codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Dies ist ein Beispiel, das nur für die Höhe gilt. Möglicherweise müssen Sie einige Angaben zur Breite machen.
quelle
ich habe gemocht
quelle
Ich wollte nur meine Version für contenteditables hinzufügen.
quelle
Ich habe einen Weg gefunden, die Verwendung von Schleifen zum Verkleinern des Textes zu verhindern. Die Schriftgröße wird angepasst, indem die Rate zwischen Containerbreite und Inhaltsbreite multipliziert wird. Wenn die Breite des Containers 1/3 des Inhalts beträgt, wird die Schriftgröße um 1/3 reduziert und die Breite des Containers. Zum Skalieren habe ich eine while-Schleife verwendet, bis der Inhalt größer als der Container ist.
Dieser Code ist Teil eines Tests, den ich auf Github hochgeladen habe. Https://github.com/ricardobrg/fitText/
quelle
Ich habe mich für die geekMonkey-Lösung entschieden, aber sie ist zu langsam. Er passt die Schriftgröße auf Maximum (maxFontPixels) an und prüft dann, ob sie in den Container passt. Andernfalls wird die Schriftgröße um 1 Pixel reduziert und erneut überprüft. Warum nicht einfach den vorherigen Container auf die Höhe überprüfen und diesen Wert senden? (Ja, ich weiß warum, aber ich habe jetzt eine Lösung gefunden, die nur auf der Höhe funktioniert und auch eine Min / Max-Option hat)
Hier ist eine viel schnellere Lösung:
und das wäre der HTML:
Nochmals: Diese Lösung prüft NUR die Höhe des Behälters. Deshalb muss diese Funktion nicht prüfen, ob das Element hineinpasst. Ich habe aber auch einen Min / Max-Wert (40 Min., 150 Max.) Implementiert, sodass dies für mich einwandfrei funktioniert (und auch für die Fenstergröße).
quelle
Hier ist eine andere Version dieser Lösung:
quelle