Ändern Sie dynamisch die Größe der Schriftgröße basierend auf der Textlänge
Lesezeit: 6 Minuten
Benutzer2613399
Ich muss vom Benutzer eingegebenen Text in einem Div mit fester Größe anzeigen. Ich möchte, dass die Schriftgröße automatisch so angepasst wird, dass der Text das Feld so weit wie möglich ausfüllt.
Ich möchte wahrscheinlich mit einer maximalen Schriftgröße beginnen, und während der Text zu groß ist, um in den Container zu passen, verkleinern Sie die Schriftgröße, bis er passt und die Schriftart als einzelne Zeile angezeigt werden muss.
Nein, es ist nicht möglich, dies nur mit CSS zu tun.
– robertp
14. August 2013 um 10:28 Uhr
Kann mir jemand eine Lösung mit js geben
– Benutzer2613399
14. August 2013 um 11:18 Uhr
putvande
Angenommen, Sie haben Folgendes:
<div id="outer" style="width:200px; height:20px; border:1px solid red;">
<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mollis dui felis, vel vehicula tortor cursus nec</div>
</div>
Wenn Sie mit Textlänge die Anzahl der Zeichen meinen, gibt es diesen Artikel, der auf ein kurzes Jquery-Snippet verweist. Ändern Sie die Schriftgröße dynamisch basierend auf der Anzahl der Zeichen
$('.text').each(function(){
var el= $(this);
var textLength = el.html().length;
if (textLength > 20) {
el.css('font-size', '0.8em');
}
});
vgl
Die Größe einer Textzeichenfolge in Pixel zu ermitteln, ist schwierig und hängt stark vom Browser und den Einstellungen des Benutzers ab, sodass es wahrscheinlich schwierig sein wird, eine Lösung zu finden, die in allen Fällen funktioniert.
Meinen Sie mit “vom Benutzer eingegebenen Text anzeigen”, dass der Benutzer in ein Textfeld tippt? Wenn dies der Fall ist, können Sie einen Tastendruck-Listener anhängen, der die Länge des Textwerts überprüft und dann anpasst font-size entsprechend. Hier ist ein Beispiel, obwohl Sie wahrscheinlich die Längen und Schriftgrößen ändern müssen, um Ihren Anforderungen gerecht zu werden:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#div1{
width: 200px;
height: 200px;
font-size: 32px;
line-height: 1.2em;
}
</style>
<script type="text/javascript" src="https://stackoverflow.com/questions/18229230/js/jquery-1.9.1.min.js"></script>
<script>
$(function(){
n = 1;
while(n==1){
n = 0
if ($('#div1 .holder').outerHeight()>$('#div1').outerHeight()){
var fz = parseInt($('#div1').css('font-size'));
$('#div1').css({'font-size' : fz-1});
n = 1
} else {n = 0}
}
});
</script>
</head>
<body>
<div id="div1">
<div class="holder">I need to display user entered text into a fixed size div. What i want is for the font size to be automatically adjusted so that the text fills the box as much as possible.
I'd probably want to start with a maximum font size and while the text is too big to fit the container, shrink the font size until it fits and the font must be displayed as a single line. Is it possible to do this using only css and html.</div>
</div>
</body>
</html>
Warum nicht einen booleschen Wert anstelle von n = 1 verwenden?
– vgl
14. August 2013 um 12:57 Uhr
Was ist der Unterschied? Es ist nur eine Flagge. Schrieb das erste, was mir in den Sinn kam
– Anonym
14. August 2013 um 13:05 Uhr
Typischerweise sind Flags boolesche Werte, andernfalls kann es für jemanden, der Ihren Code liest, verwirrend sein, da eine Ganzzahl anzeigen kann, dass es mehr als zwei Zustände gibt.
– vgl
14. August 2013 um 13:49 Uhr
Oder tun while(true) und break
– reformiert
8. August 2019 um 17:06 Uhr
Jo
Danke putvande, dass du mir die allgemeine Methode mitgeteilt hast. Hier ist eine verbesserte Version.
Befreien Sie sich von der Callback-Hölle.
Es wurden einige Fehler behoben, die zum Aufhängen der Seite führen können.
Gleiches HTML:
<div id="outer" style="width:200px; height:20px; border:1px solid red;">
<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mollis dui felis, vel vehicula tortor cursus nec</div>
</div>
Hier ist die Funktion:
resize_to_fit($('#outer'), $('#outer div'));
function resize_to_fit(outer, inner) {
while(inner.height() > outer.height()) {
var fontsize = parseInt(inner.css('font-size')) - 1;
inner.css('font-size', fontsize);
// some browsers(chrome) the min font return value is 12px
if(fontsize <= 1 || parseInt(inner.css('font-size')) >= fontsize+1)
break;
}
}
Warum nicht einen booleschen Wert anstelle von n = 1 verwenden?
– vgl
14. August 2013 um 12:57 Uhr
Was ist der Unterschied? Es ist nur eine Flagge. Schrieb das erste, was mir in den Sinn kam
– Anonym
14. August 2013 um 13:05 Uhr
Typischerweise sind Flags boolesche Werte, andernfalls kann es für jemanden, der Ihren Code liest, verwirrend sein, da eine Ganzzahl anzeigen kann, dass es mehr als zwei Zustände gibt.
– vgl
14. August 2013 um 13:49 Uhr
Oder tun while(true) und break
– reformiert
8. August 2019 um 17:06 Uhr
Ecarol
Mit sehr wenig Javascript ist das möglich Weisen Sie eine CSS-Klasse mit der Länge zu der Zeichenfolge, zB: text-length-5 oder text-length-20
Verwenden Sie dann ausschließlich CSS, um unterschiedliche Ziele zu erreichen font-size nach diesen Klassennamen.
Es wird wahrscheinlich nicht für jeden Fall funktionieren, aber für meinen war es sehr gut, wo die maximale Länge etwa 10-12 Zeichen betrug.
Wenn Sie mehr als 100 oder 1000 Zeichen haben, können Sie auch eine Funktion erstellen, die die Länge empfängt und eine CSS-Klasse zurückgibt, und dann auf diesen Bereichen basieren.
Nein, es ist nicht möglich, dies nur mit CSS zu tun.
– robertp
14. August 2013 um 10:28 Uhr
Kann mir jemand eine Lösung mit js geben
– Benutzer2613399
14. August 2013 um 11:18 Uhr