<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
Dies ist mein Code und es funktioniert nicht. Gibt es eine andere Möglichkeit in HTML, JavaScript, PHP oder CSS, die Mindestbreite festzulegen?
Ich möchte ein Texteingabefeld mit einer sich dynamisch ändernden Breite, damit das Eingabefeld um seinen Inhalt herum fließt. Jeder Eingang hat eine eingebaute Auffüllung von 2em
, das ist das Problem und das zweite Problem ist, dass überhaupt min-width
nicht an Eingaben gearbeitet wird.
Wenn ich die Breite mehr einstelle, als benötigt wird, als das gesamte Programm unordentlich ist, brauche ich die Breite von 1 Pixel, mehr nur, wenn es benötigt wird.
javascript
html
css
Kerc
quelle
quelle
Antworten:
Es hört sich so an, als ob Sie erwarten, dass der Stil basierend auf dem Inhalt des Textfelds dynamisch auf die Breite des Textfelds angewendet wird. Wenn ja einige js benötigen auf Textbox Inhalt zu verändern, so etwas wie laufen diese :
Hinweis: Diese Lösung funktioniert nur, wenn jedes Zeichen genau
8px
breit ist.quelle
onInput
In modernen Browserversionen
ch
ist auch die CSS-Einheit verfügbar. Nach meinem Verständnis handelt es sich um eine schriftunabhängige Einheit, bei1ch
der die Zeichenbreite entspricht0
(Null) in einer bestimmten Schriftart entspricht.So könnte etwas so Einfaches wie das Folgende als Größenänderungsfunktion verwendet werden:
In diesem Beispiel würde die Größe von "elem" auf die Länge des Werts + 2 zusätzliche Zeichen geändert.
quelle
input
, Element, wiefont-style
,letter-spacing
und so weiter. Ich habe die Antwort mit einer Live-Demo bearbeitet..
auftritt.Um die Breite der aktuellen Eingabe zu berechnen, müssen Sie sie in ein temporäres
span
Element einbetten , dasscrollWidth
Objekt an das DOM anhängen, die berechnete Breite (in Pixel) mithilfe der Eigenschaft abrufen und erneut entfernenspan
. Natürlich müssen Sie sicherstellen, dass sowohl ininput
als auch in der Schrift die gleiche Schriftfamilie, Schriftgröße usw. verwendet wirdspan
Element Element . Deshalb habe ich ihnen die gleiche Klasse zugewiesen.Ich habe die Funktion an das
keyup
Ereignis angehängt , dakeypress
das Eingabezeichen noch nicht zur Eingabe hinzugefügt wurdevalue
, so dass sich die falsche Breite ergibt. Leider weiß ich nicht, wie ich das Scrollen des Eingabefelds loswerden soll (wenn ich Zeichen am Ende des Feldes hinzufüge). es wird gescrollt, weil das Zeichen hinzugefügt und angezeigt wird, bevoradjustWidthOfInput()
es aufgerufen wird. Und wie gesagt, ich kann das nicht umgekehrt machen, weil Sie dann den Wert des Eingabefelds haben, bevor das gedrückte Zeichen eingefügt wird. Ich werde später versuchen, dieses Problem zu lösen.Übrigens habe ich dies nur in Firefox (3.6.8) getestet, aber Sie werden es verstehen, hoffe ich.
quelle
white-space: pre;
CSS folgendermaßen hinzufügen :.tmp-element{ visibility: hidden; white-space: pre;}
. Andernfalls werden Leerzeichen kombiniert und die Breitenberechnung schlägt fehl.<input>
und<span>
verhält sich in Bezug auf die Behandlung von<input>
Leerzeichen anders, behält Leerzeichen bei und<span>
kombiniert aufeinanderfolgende Leerzeichen zu einem, wennwhite-space: pre;
es nicht hinzugefügt wird.tmp.getBoundingClientRect().width
ist besser alstmp.scrollWidth
, weil das manchmal 0 zurückgibt.replace(/ /g, " ")
Hier ist eine Modifikation von Lyths Antwort, die Folgendes berücksichtigt:
Es erlaubt auch eine beliebige Anzahl von Eingabefeldern! Um es in Aktion zu sehen: http://jsfiddle.net/4Qsa8/
Skript:
Stil:
HTML:
Code-Snippet anzeigen
quelle
change
oderinput
Ereignis zu hören würde ausreichenHier ist eine Lösung ohne proportionale Schrift benötigt, mit nur sehr kleinen Stück Code von Javascript , braucht nicht berechnet Arten zu berechnen und sogar unterstützen ime , Unterstützung rtl Texte .
Verwenden Sie die
span.text
, um die Textbreite anzupassen, und lassen Sie die Eingabeposition: absolute
für den Container dieselbe Größe haben . Kopieren Sie den Wert der Eingabe beispan
jeder Änderung in den Wert (Sie können diesen Code leicht in vanilla js ändern). Die Eingabe "passt" also einfach zur Größe ihres Inhalts.quelle
FÜR EIN NICER LOOK & FEEL
Sie sollten das Ereignis jQuery keypress () in Kombination mit String.fromCharCode (e.which) verwenden, um das gedrückte Zeichen abzurufen. Daher können Sie berechnen, wie breit Sie sein werden . Warum? Weil es viel sexy aussehen wird :)Hier ist eine jsfiddle, die im Vergleich zu Lösungen mit dem keyup-Ereignis zu einem netten Verhalten führt: http://jsfiddle.net/G4FKW/3/
Unten sehen Sie eine Vanille-JS, die das
input
Ereignis eines<input>
Elements abhört und einspan
Geschwister so einstellt , dass es denselben Textwert hat, um es zu messen.quelle
span
und css nicht manuell codiert werden müssen .Dies ist eine winkelspezifische Antwort, die jedoch für mich funktioniert hat und hinsichtlich ihrer Einfachheit und Benutzerfreundlichkeit sehr zufriedenstellend war:
Es wird automatisch über die Zeicheneinheiten in Janis Antwort aktualisiert .
quelle
Hier ist eine alternative Möglichkeit, dies mithilfe eines DIV und der Eigenschaft 'contenteditable' zu lösen:
HTML:
CSS: (um dem DIV einige Dimensionen zu geben und das Sehen zu erleichtern)
Hinweis: Wenn Sie dies in einem FORM-Element verwenden möchten, das Sie senden möchten, müssen Sie Javascript / jQuery verwenden, um das Übermittlungsereignis abzufangen, damit Sie den 'Wert' (
.innerHTML
bzw..html()
) des DIV analysieren können .quelle
Sie können die Breite einer Eingabe anhand der Größe festlegen und Attribute. Die Größe einer Eingabe bestimmt die Breite in Zeichen.
Ein Eingang kann seine Größe dynamisch anpassen, indem er auf wichtige Ereignisse wartet.
Beispielsweise
JsFiddle hier
quelle
Man könnte so etwas wie tun dies
.
.
quelle
Fügen Sie einfach zusätzlich zu anderen Antworten hinzu.
Mir ist aufgefallen, dass heutzutage in einigen Browsern das Eingabefeld eine scrollWidth hat. Was bedeutet:
sollte gut funktionieren. getestet in Chrom, Firefox und Safari.
Zur Unterstützung des Löschens können Sie zuerst '= 0' hinzufügen und dann neu einstellen.
quelle
Hier ist ein einfaches JS- und ein jQuery-Plugin, das ich geschrieben habe und das die Größe eines Eingabeelements mithilfe einer Zeichenfläche und der Schriftgröße / -familie ändert, um die tatsächliche Zeichenfolgenlänge beim Rendern zu bestimmen. (funktioniert nur in> IE9, Chrome, Safari, Firefox, Opera und den meisten anderen großen Browsern, die das Canvas-Element implementiert haben).
PlainJS:
jQuery Plugin:
Hinweis: Dies behandelt keine Texttransformationen, Zeilenabstände und Buchstabenabstände sowie wahrscheinlich einige andere Eigenschaften zur Änderung der Textgröße. Um die Eigenschaft der Texttransformation zu verarbeiten, passen Sie den Textwert an diese Eigenschaft an. Die anderen sind wahrscheinlich ziemlich einfach. Ich werde implementieren, wenn dies etwas an Zugkraft gewinnt ...
quelle
Es ist erwähnenswert, dass eine gut aussehende Größenänderung durchgeführt werden kann, wenn die Schrift monospaced ist, so dass wir die Größe des
input
Elements mithilfe desch
Geräts perfekt ändern können .Auch bei diesem Ansatz können wir die Breite des Feldes aktualisieren, indem wir nur eine CSS-Variable ( benutzerdefinierte Eigenschaft ) für ein
input
Ereignis aktualisieren. Außerdem sollten wir uns um bereits vorab ausgefüllte Eingaben für einDOMContentLoaded
Ereignis kümmernMarkup
CSS
Als Root-Variable setzen wir
--size: 0
: Diese Variable enthält die Länge der Eingabe und wird1ch
innerhalb descalc()
Ausdrucks mit multipliziert . Standardmäßig können wir auch eine Mindestbreite festlegen, z10ch
Der Javascript-Teil liest die Länge des eingefügten Werts und aktualisiert die Variable
--size
:JS
Dies funktioniert natürlich auch dann, wenn Sie keine monospaced Schriftart verwenden. In diesem Fall müssen Sie jedoch die
calc()
Formel ändern, indem Sie die--size
Variable mit einem anderen Wert multiplizieren (der streng vomfont-family
und abhängtfont-size
)1ch
.quelle
Diese Antwort bietet eine der genauesten Methoden zum Abrufen der im Browser verfügbaren Textbreite und ist genauer als die akzeptierte Antwort. Es verwendet das Canvas-Element html5 und fügt das Element im Gegensatz zu anderen Antworten nicht zum DOM hinzu. Dadurch werden Reflow-Probleme vermieden, die durch übermäßiges Hinzufügen von Elementen zum DOM verursacht werden.
Lesen Sie mehr über das Canvas - Element hier in Bezug auf Textbreite.
quelle
Mit der integrierten ng- Direktive können Sie dies in Angularjs noch einfacher tun .
In Ihrem HTML:
In Ihrem Controller:
In Ihrem CSS:
Passen Sie die Zeichenbreite an die Breite Ihrer Schrift an. Es scheint 7 bei einer Schriftgröße von 12px zu sein;
quelle
Wenn Sie Bootstrap verwenden, ist dies sehr einfach möglich:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Sie müssen nur den Inhalt von div abrufen und in eine versteckte Eingabe einfügen, bevor Sie das Formular senden.
quelle
Ich denke, Sie interpretieren die CSS-Eigenschaft mit minimaler Breite falsch . Die Mindestbreite wird im Allgemeinen verwendet, um eine Mindest-DOM-Breite in einem Fluid-Layout zu definieren, z.
Dies würde das Eingabeelement auf eine Mindestbreite von 200 Pixel einstellen. In diesem Zusammenhang steht "px" für "Pixel".
Wenn Sie nun überprüfen möchten, ob das Eingabefeld mindestens ein Zeichen enthält, wenn ein Benutzer es einreicht, müssen Sie eine Formularüberprüfung mit JavaScript und PHP durchführen. Wenn Sie dies tatsächlich versuchen, werde ich diese Antwort bearbeiten und mein Bestes geben, um Ihnen zu helfen.
quelle
<input type="text" value="1" style="width:1px;" />
Ich mochte Lyths Antwort sehr , wollte es aber auch:
Ich passte seine JSFiddle und kam mit bis diese . Eine Verbesserung, die in dieser Geige nicht vorhanden ist, wäre die Verwendung von jQuery CSS Parser zu verwenden, um die anfängliche Breite aus der Regel input.textbox-autosize tatsächlich zu lesen und diese als minWidth zu verwenden. Richtig, ich verwende einfach ein Attribut auf dem, was für eine kompakte Demo sorgt, aber nicht ideal ist. da für jede Eingabe ein zusätzliches Attribut erforderlich ist. Möglicherweise möchten Sie auch nur die minWidth als 100 direkt in das JavaScript einfügen.
HTML:
CSS:
JavaScript:
quelle
Besser ist
onvalue
:Dazu gehört auch das Einfügen, Ziehen und Ablegen usw.
quelle
Hier sind meine 2 Cent. Erstellen Sie ein leeres unsichtbares Div. Füllen Sie es mit dem Eingabeinhalt und geben Sie die Breite in das Eingabefeld zurück. Ordnen Sie die Textstile den einzelnen Feldern zu.
quelle
Ziemlich einfach:
Wobei N eine Zahl ist (2 im Beispiel, 17 für etwas, das ich entwickle), die experimentell bestimmt wird.
Das Subtrahieren von N verhindert, dass sich dieser seltsame, überflüssige Raum ansammelt, lange bevor der Text das Ende des Textfelds erreicht.
Vergleichen Sie. Achten Sie genau darauf, wie sich die Größe bereits nach dem ersten Zeichen ändert .
quelle
oninput='this.style.width = (this.scrollWidth-2) + "px";'
indemoninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
der Raum , um loszuwerden AkkumulierenIch verbringe nur einige Zeit damit, herauszufinden, wie es geht.
Der einfachste Weg, den ich gefunden habe, besteht darin, den Eingabewert so zu verschieben, dass er kurz vor der Eingabe liegt, wobei die Symbolbreite von Eingabe 1 beibehalten wird. Obwohl ich nicht sicher sein kann, ob es für Ihren anfänglichen Bedarf geeignet ist.
Vielleicht ist es ein zusätzlicher Code, aber in einer auf React + Flux basierenden Anwendung ist es eine ganz natürliche Lösung.
quelle
Basierend auf Michaels Antwort habe ich mit jQuery eine eigene Version davon erstellt. Ich denke, es ist eine sauberere / kürzere Version der meisten Antworten hier und es scheint die Arbeit zu erledigen.
Ich mache das Gleiche wie die meisten Leute hier, indem ich eine Spanne benutze, um den Eingabetext zu schreiben und dann die Breite zu erhalten. Dann stelle ich die Breite ein, wenn die Aktionen
keyup
undblur
aufgerufen werden.Hier ist ein funktionierender Codepen . Dieser Codepen zeigt, wie dies mit mehreren Eingabefeldern verwendet werden kann.
HTML-Struktur:
jQuery:
Die obige Funktion ruft den Eingabewert ab, schneidet die zusätzlichen Leerzeichen ab und setzt den Text in den Bereich, um die Breite zu erhalten. Wenn kein Text vorhanden ist, wird stattdessen der Platzhalter abgerufen und in den Bereich eingegeben. Sobald der Text in den Bereich eingegeben wurde, wird die Breite der Eingabe festgelegt. Die
+ 5
auf die Breite ist, weil ohne das die Eingabe im Edge-Browser ein kleines Stück abgeschnitten wird.Wenn dies verbessert werden könnte, lassen Sie es mich bitte wissen, da dies die sauberste Lösung ist, die ich finden könnte.
quelle
Warum nicht einfach CSS verwenden?
Dieser Code wurde von @Iain Todd eingeführt und ich dachte, ich sollte ihn teilen
quelle
Ein kugelsicherer, generischer Weg muss:
input
ElementsCodepen-Demo
quelle
Sie können einfach ein
size
Attribut festlegen . Wenn Sie eines der reaktiven Frameworks verwenden, reicht Folgendes aus:Wenn Sie jedoch reines js verwenden, sollten Sie Ereignishandler festlegen, wie z.
quelle