<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
To jest mój kod i nie działa. Czy w HTML, JavaScript, PHP lub CSS jest inny sposób ustawienia minimalnej szerokości?
Chcę mieć pole wprowadzania tekstu z dynamicznie zmieniającą się szerokością, tak aby pole wejściowe było płynne wokół jego zawartości. Każde wejście ma wbudowane dopełnienie 2em
, to jest problem, a drugi problemmin-width
ogóle nie działa na wejściu.
Jeśli ustawię szerokość większą niż potrzeba, to cały program jest niechlujny, potrzebuję szerokości 1 piksela, więcej tylko wtedy, gdy jest to potrzebne.
javascript
html
css
Kerc
źródło
źródło
Odpowiedzi:
Wygląda na to, że spodziewasz się, że styl zostanie zastosowany dynamicznie do szerokości pola tekstowego na podstawie zawartości pola tekstowego. Jeśli więc trzeba będzie niektóre js do uruchomienia na zawartość pola tekstowego się zmienia, coś jak to :
Uwaga: to rozwiązanie działa tylko wtedy, gdy każdy znak jest dokładnie
8px
szeroki.źródło
onInput
W nowoczesnych wersjach przeglądarek
ch
dostępna jest również jednostka CSS . W moim rozumieniu jest to jednostka niezależna od czcionki, gdzie1ch
jest równa szerokości znaku0
(zero) w dowolnej czcionce.Tak więc coś tak prostego, jak poniższe, może być użyte jako funkcja zmiany rozmiaru:
Ten przykład zmieni rozmiar elementu „elem” na długość wartości + 2 dodatkowe znaki.
źródło
input
element, na przykładfont-style
,letter-spacing
i tak dalej. Poprawiłem odpowiedź za pomocą demonstracji na żywo..
zostanie napotkany.Aby obliczyć szerokość bieżącego wejścia, będziesz musiał osadzić go w tymczasowym
span
elemencie, dołączyć go do DOM, uzyskać obliczoną szerokość (w pikselach) za pomocąscrollWidth
właściwości ispan
ponownie usunąć . Oczywiście musisz upewnić się, że ta sama rodzina czcionek, rozmiar czcionki itp. Jest używanainput
zarówno wspan
elemencie, elemencie. Dlatego przypisałem im tę samą klasę.Dołączyłem funkcję do
keyup
zdarzenia, gdyż nakeypress
wejściu znak nie jest jeszcze dodawany do wejściavalue
, przez co będzie skutkował złą szerokością. Niestety nie wiem jak się pozbyć przewijania pola wejściowego (przy dodawaniu znaków na końcu pola); przewija się, ponieważ znak jest dodawany i wyświetlany przedadjustWidthOfInput()
wywołaniem. I, jak powiedziałem, nie mogę tego zrobić w drugą stronę, ponieważ wtedy będziesz mieć wartość pola wejściowego przed wstawieniem wciśniętego znaku. Spróbuję później rozwiązać ten problem.BTW, testowałem to tylko w Firefoksie (3.6.8), ale mam nadzieję, że zrozumiesz, o co chodzi.
źródło
white-space: pre;
do css ten sposób:.tmp-element{ visibility: hidden; white-space: pre;}
. W przeciwnym razie spacje są łączone, a obliczenie szerokości kończy się niepowodzeniem.<input>
i<span>
zachowuje się inaczej w odniesieniu do obsługi<input>
białych znaków , zachowuje odstępy i<span>
łączy kolejne odstępy w jeden, jeśliwhite-space: pre;
nie jest dodawany.tmp.getBoundingClientRect().width
jest lepsze niżtmp.scrollWidth
, ponieważ czasami zwraca 0.replace(/ /g, " ")
Oto modyfikacja odpowiedzi Lytha, która uwzględnia:
Pozwala również na dowolną liczbę pól wejściowych! Aby zobaczyć to w akcji: http://jsfiddle.net/4Qsa8/
Scenariusz:
Styl:
HTML:
Pokaż fragment kodu
źródło
change
lubinput
wydarzenia wystarczyłobyOto rozwiązanie bez potrzebnej czcionki o stałej szerokości , z bardzo małym kodem javascript , nie wymagające obliczania obliczonych stylów , a nawet obsługujące ime , obsługujące teksty rtl .
Użyj,
span.text
aby dopasować szerokość tekstu i pozwól, aby dane wejściowe miały ten sam rozmiarposition: absolute
do kontenera. Kopiuj wartość wejścia do the zaspan
każdym razem, gdy się zmieniła (możesz łatwo zmienić ten fragment kodu na vanilla js). Tak więc dane wejściowe po prostu „dopasują się” do rozmiaru zawartości.źródło
DLA NICERSKIEGO WYGLĄDU I POCZUCIA
Należy użyć zdarzenia keypress () jQuery w połączeniu z String.fromCharCode (e.which), aby uzyskać wciśnięty znak. W związku z tym możesz obliczyć, jaka będzie twoja szerokość . Czemu? Ponieważ będzie wyglądać o wiele bardziej seksownie :)Oto plik jsfiddle, który daje ładne zachowanie w porównaniu do rozwiązań wykorzystujących zdarzenie keyup: http://jsfiddle.net/G4FKW/3/
Poniżej znajduje się waniliowy JS, który nasłuchuje
input
zdarzenia<input>
elementu i ustawia elementspan
siostrzany tak, aby miał tę samą wartość tekstową, aby go zmierzyć.źródło
span
dla niego a i css.To jest odpowiedź specyficzna dla Angulara, ale zadziałało to dla mnie i było bardzo satysfakcjonujące pod względem prostoty i łatwości użycia:
Automatycznie aktualizuje się za pośrednictwem jednostek postaci w odpowiedzi Jani .
źródło
Oto alternatywny sposób rozwiązania tego problemu za pomocą funkcji DIV i właściwości „contenteditable”:
HTML:
CSS: (aby nadać DIV pewne wymiary i ułatwić jej zobaczenie)
Uwaga: jeśli planujesz użyć tego w elemencie FORM, który planujesz przesłać, musisz użyć Javascript / jQuery do przechwycenia zdarzenia przesyłania, aby można było przeanalizować „wartość” (
.innerHTML
lub.html()
odpowiednio) DIV.źródło
Możesz również ustawić szerokość wejścia za pomocą atrybutu rozmiaru . Rozmiar wejścia określa jego szerokość w znakach.
Wejście może dynamicznie dostosowywać swój rozmiar, nasłuchując kluczowych zdarzeń.
Na przykład
JsFiddle tutaj
źródło
Można zrobić coś jak to
Wcześniejsze
Wcześniejsze
źródło
Po prostu dodając inne odpowiedzi.
Zauważyłem, że obecnie w niektórych przeglądarkach pole wprowadzania ma scrollWidth. Co znaczy:
powinno ładnie działać. przetestowany w Chrome, Firefoxie i Safari.
Aby uzyskać obsługę usuwania, możesz najpierw dodać „= 0”, a następnie ponownie dostosować.
źródło
Oto prosty JS i wtyczka jQuery, którą napisałem, która poradzi sobie ze zmianą rozmiaru elementu wejściowego za pomocą płótna i rozmiaru / rodziny czcionki, aby określić rzeczywistą długość ciągu podczas renderowania. (działa tylko w> IE9, chrome, safari, firefox, opera i większości innych głównych przeglądarek, w których zaimplementowano element canvas).
PlainJS:
Wtyczka jQuery:
Uwaga: to nie będzie obsługiwać przekształceń tekstu, odstępów między wierszami i odstępów między literami oraz prawdopodobnie innych właściwości zmieniających rozmiar tekstu. Aby obsłużyć transformację tekstu, ustaw i dostosuj wartość tekstu, aby pasowała do tej właściwości. Pozostałe są prawdopodobnie dość proste. Wdrożę, jeśli to zacznie nabierać trakcji ...
źródło
Warto zaznaczyć, że ładnie wyglądającą zmianę rozmiaru można zrobić, gdy czcionka jest nieproporcjonalna, dzięki czemu możemy doskonale zmienić rozmiar
input
elementu za pomocąch
jednostki.Również w tym podejściu możemy zaktualizować szerokość pola, po prostu aktualizując zmienną CSS ( właściwość niestandardową ) na
input
zdarzeniu, a także powinniśmy zadbać o już wstępnie wypełnione dane wejściowe wDOMContentLoaded
zdarzeniuNarzut
CSS
Jako zmienną główną ustawiliśmy
--size: 0
: ta zmienna będzie zawierać długość wejścia i zostanie pomnożona przez1ch
wewnątrzcalc()
wyrażenia. Domyślnie możemy też ustawić minimalną szerokość, np10ch
Część Javascript odczytuje długość wstawionej wartości i aktualizuje zmienną
--size
:JS
oczywiście to nadal działa, nawet jeśli nie używasz czcionki o stałej szerokości, ale w takim przypadku będziesz musiał zmienić
calc()
formułę, mnożąc--size
zmienną przez inną wartość (która jest ściśle zależna odfont-family
ifont-size
) inną niż1ch
.źródło
Ta odpowiedź stanowi jedną z najdokładniejszych metod pobierania szerokości tekstu dostępnych w przeglądarce i jest dokładniejsza niż zaakceptowana odpowiedź. Używa elementu canvas html5 iw przeciwieństwie do innych odpowiedzi nie dodaje elementu do DOM, a tym samym unika problemów z ponownym przepływem spowodowanych nadmiernym dodawaniem elementów do DOM.
Czytaj więcej o elemencie Canvas tutaj w stosunku do szerokości tekstu.
źródło
Możesz to zrobić jeszcze prościej w angularjs, używając wbudowanej dyrektywy ng-style .
W Twoim html:
W kontrolerze:
W twoim css:
Dostosuj charWidth, aby dopasować szerokość czcionki. Wydaje się, że jest to 7 przy rozmiarze czcionki 12 pikseli;
źródło
Jeśli używasz Bootstrap, można to zrobić bardzo łatwo:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Wystarczy pobrać zawartość div i umieścić ją w ukrytym miejscu przed wysłaniem formularza.
źródło
Myślę, że błędnie interpretujesz właściwość CSS min-width . min-width jest zwykle używana do definiowania minimalnej szerokości DOM w układzie płynnym, na przykład:
To ustawiłoby element wejściowy na minimalną szerokość 200 pikseli. W tym kontekście „px” oznacza „piksele”.
Teraz, jeśli próbujesz sprawdzić, czy pole wejściowe zawiera co najmniej jeden znak, gdy użytkownik je przesyła, musisz przeprowadzić walidację formularza za pomocą JavaScript i PHP. Jeśli rzeczywiście próbujesz to zrobić, poprawię tę odpowiedź i dołożę wszelkich starań, aby Ci pomóc.
źródło
<input type="text" value="1" style="width:1px;" />
Bardzo podobała mi się odpowiedź Lytha , ale bardzo chciałem, żeby:
Dostosowałem jego JSFiddle i wymyśliłem to . Jednym z ulepszeń nieobecnych w tych skrzypcach byłoby użycie czegoś takiego jak parser jQuery CSS, aby faktycznie odczytać początkową szerokość z reguły input.textbox-autosize i użyć tego jako minWidth. Tak, po prostu używam atrybutu na stronie, co daje kompaktowe demo, ale nie jest idealne. ponieważ wymaga dodatkowego atrybutu na każdym wejściu. Możesz także po prostu umieścić minWidth jako 100 bezpośrednio w JavaScript.
HTML:
CSS:
JavaScript:
źródło
Lepiej jest
onvalue
:Obejmuje również wklejanie, przeciąganie i upuszczanie itp.
źródło
Oto moje 2 centy. Utwórz pusty, niewidoczny element DIV. Wypełnij go treścią wejściową i zwróć szerokość do pola wejściowego. Dopasuj style tekstu w każdym polu.
źródło
Całkiem proste:
Gdzie N jest liczbą (w tym przykładzie 2, 17 na czymś, co rozwijam), która jest określana eksperymentalnie.
Odejmowanie N zapobiega gromadzeniu się tej dziwnej, nadmiernej przestrzeni na długo przed końcem pola tekstowego.
Porównać. Zwróć szczególną uwagę, jak zmienia się rozmiar nawet po pierwszym znaku.
źródło
oninput='this.style.width = (this.scrollWidth-2) + "px";'
,oninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
aby pozbyć się gromadzącej się przestrzeniPo prostu spędzam trochę czasu zastanawiając się, jak to zrobić.
Właściwie najprostszym sposobem, jaki znalazłem, jest przesunięcie wartości wejściowej do zakresu tuż przed wejściem, zachowując szerokość symbolu wejścia 1. Chociaż nie jestem pewien, czy pasuje do twoich początkowych potrzeb.
Może to jakiś dodatkowy kod, ale w aplikacji opartej na reakcji + flux jest to całkiem naturalne rozwiązanie.
źródło
W oparciu o odpowiedź Michaela stworzyłem własną wersję tego przy użyciu jQuery. Myślę, że jest to czystsza / krótsza wersja większości odpowiedzi tutaj i wydaje się, że wykonuje swoje zadanie.
Robię to samo, co większość ludzi tutaj, używając rozpiętości, aby wpisać tekst wejściowy, a następnie uzyskać szerokość. Następnie ustawiam szerokość, gdy akcje
keyup
iblur
wywoływania .Oto działający kod . Ten kod pokazuje, jak można go używać z wieloma polami wejściowymi.
Struktura HTML:
jQuery:
Powyższa funkcja pobiera wartość wejściową, przycina dodatkowe spacje i ustawia tekst w zakresie, aby uzyskać szerokość. Jeśli nie ma tekstu, zamiast tego pobiera symbol zastępczy i zamiast tego wprowadza go do zakresu. Po wprowadzeniu tekstu do zakresu ustawia szerokość wejścia.
+ 5
Szerokości dlatego bez że wejście zostanie odcięty odrobinę w przeglądarce krawędzi.Jeśli można to poprawić, daj mi znać, ponieważ jest to najczystsze rozwiązanie, jakie mogłem wymyślić.
źródło
Dlaczego nie używać tylko CSS?
ten kod został wprowadzony przez @Iain Todd do i pomyślałem, że powinienem się nim podzielić
źródło
Kuloodporny, ogólny sposób musi:
input
elementuCodepen demo
źródło
Możesz po prostu ustawić
size
atrybut. Jeśli używasz jednego z reaktywnych frameworków, wystarczy:ale jeśli używasz czystego js, powinieneś ustawić programy obsługi zdarzeń, takie jak:
źródło