Obecnie pracuję nad wewnętrzną aplikacją sprzedażową dla firmy, dla której pracuję, i mam formularz, który umożliwia użytkownikowi zmianę adresu dostawy.
Teraz myślę, że wyglądałoby to o wiele ładniej, gdyby obszar tekstu, którego używam do głównych szczegółów adresu, po prostu zajmowałby obszar tekstu w nim i automatycznie zmieniał rozmiar, jeśli tekst został zmieniony.
Oto jego zrzut ekranu.
Jakieś pomysły?
@Chris
Dobra uwaga, ale są powody, dla których chcę zmienić rozmiar. Chcę, aby obszar, jaki zajmuje, był obszarem informacji w nim zawartych. Jak widać na zrzucie ekranu, jeśli mam stały obszar tekstu, zajmuje to sporo miejsca w pionie.
Mogę zmniejszyć czcionkę, ale adres powinien być duży i czytelny. Teraz mogę zmniejszyć rozmiar pola tekstowego, ale wtedy mam problemy z ludźmi, którzy mają wiersz adresu, który zajmuje 3 lub 4 (jeden zajmuje 5) wierszy. Konieczność, aby użytkownik korzystał z paska przewijania, jest głównym nie do przyjęcia.
Myślę, że powinienem być bardziej szczegółowy. Jestem po zmianie rozmiaru w pionie, a szerokość nie ma większego znaczenia. Jedynym problemem, który się z tym wiąże, jest to, że numer ISO (duża „1”) jest wypychany pod adres, gdy szerokość okna jest zbyt mała (jak widać na zrzucie ekranu).
Nie chodzi o to, żeby ćwiczyć; chodzi o posiadanie pola tekstowego, które użytkownik może edytować, które nie będzie zajmować niepotrzebnego miejsca, ale pokaże cały tekst w nim.
Chociaż jeśli ktoś znajdzie inny sposób podejścia do problemu, ja też jestem na to otwarty.
Zmodyfikowałem trochę kod, ponieważ działał trochę dziwnie. Zmieniłem to tak, aby aktywował się przy keyup, ponieważ nie uwzględniałby znaku, który został właśnie wpisany.
resizeIt = function() {
var str = $('iso_address').value;
var cols = $('iso_address').cols;
var linecount = 0;
$A(str.split("\n")).each(function(l) {
linecount += 1 + Math.floor(l.length / cols); // Take into account long lines
})
$('iso_address').rows = linecount;
};
źródło
Odpowiedzi:
Facebook robi to, kiedy piszesz na ścianach ludzi, ale zmienia rozmiar tylko w pionie.
Pozioma zmiana rozmiaru wydaje mi się bałaganem z powodu zawijania słów, długich linii itd., Ale pionowa zmiana rozmiaru wydaje się być całkiem bezpieczna i przyjemna.
Żaden ze znanych mi początkujących użytkowników Facebooka nie wspomniał o tym ani nie był zdezorientowany. Użyłbym tego jako anegdotycznego dowodu, aby powiedzieć „śmiało, wdrażaj to”.
Trochę kodu JavaScript, aby to zrobić, używając Prototype (bo to jest to, co znam):
PS: Oczywiście ten kod JavaScript jest bardzo naiwny i niezbyt dobrze przetestowany, i prawdopodobnie nie chcesz go używać na polach tekstowych zawierających powieści, ale masz ogólny pomysł.
źródło
<textarea cols='5'>0 12345 12345 0</textarea>
. (Napisałem prawie identyczną implementację i złapałem ją dopiero po miesiącu używania.) Nie udaje się również dla pustych wierszy.Udoskonaleniem niektórych z tych odpowiedzi jest umożliwienie CSS wykonania większej ilości pracy.
Wydaje się, że podstawowa trasa to:
textarea
i ukrytydiv
textarea
„s zawartość zsynchronizowane zdiv
” sdiv
, unikamy jawnego ustawianiatextarea
wysokości.źródło
var text = $("#textArea").val().replace(/\n/g, '<br/>') + ' ';
zapewnia, że nie pojawi się szarpane zachowanie podczas przechodzenia z pustej nowej linii na końcu obszaru tekstowego do niepustej, ponieważ ukryty element div zapewnia zawijanie do nbsp.Oto inna technika automatycznego określania rozmiaru obszaru tekstu.
Kod: (zwykły waniliowy JavaScript)
Demo: (używa jQuery, cele w obszarze tekstowym, w którym teraz piszę - jeśli masz zainstalowany Firebug , wklej oba przykłady do konsoli i przetestuj na tej stronie)
źródło
clientHeight
iscrollHeight
jest równy, więc nie możesz użyć tej metody, jeśli chcesz, aby obszar tekstowy zarówno się kurczył, jak i powiększał.if (text.clientHeight == text.scrollHeight) text.style.height = "20px";
Prawdopodobnie najkrótsze rozwiązanie:
W ten sposób nie potrzebujesz żadnych ukrytych elementów div ani niczego podobnego.
Uwaga: może być konieczne granie w
this.style.height = (this.scrollHeight) + "px";
zależności od tego, jak stylizujesz obszar tekstu (wysokość linii, dopełnienie i tego typu rzeczy).źródło
keyup
może wystarczyć, ale nie jestem pewien. Byłem tak szczęśliwy, że to rozgryzłem, że przestałem próbować czegokolwiek innego.Oto prototypowa wersja zmiany rozmiaru obszaru tekstowego, która nie jest zależna od liczby kolumn w tym obszarze. Jest to doskonała technika, ponieważ pozwala kontrolować obszar tekstowy za pomocą CSS, a także mieć zmienną szerokość obszaru tekstowego. Ponadto ta wersja wyświetla liczbę pozostałych znaków. Chociaż nie jest to wymagane, jest to całkiem przydatna funkcja i można ją łatwo usunąć, jeśli jest niechciana.
Utwórz widżet, dzwoniąc
new Widget.Textarea('element_id')
. Domyślne opcje można nadpisać przekazując je jako obiekt, npnew Widget.Textarea('element_id', { max_length: 600, min_height: 50})
. Jeśli chcesz go utworzyć dla wszystkich obszarów tekstowych na stronie, zrób coś takiego:źródło
Oto rozwiązanie z
JQuery
:abc
jestteaxtarea
.źródło
Sprawdź poniższy link: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
źródło
Wracając do tego, uczyniłem to trochę bardziej uporządkowanym (chociaż ktoś, kto ma pełną butelkę na Prototype / JavaScript, mógłby zasugerować ulepszenia?).
Wystarczy zadzwonić z:
źródło
Zrobiłem coś całkiem łatwego. Najpierw umieściłem TextArea w DIV. Po drugie, wywołałem
ready
funkcję tego skryptu.Prosty. Jest to maksymalna wysokość renderowanego elementu div podzielona przez wysokość jednego obiektu TextArea w jednym wierszu.
źródło
Potrzebowałem tej funkcji dla siebie, ale żadna z tych tutaj nie działała tak, jak ich potrzebowałem.
Więc użyłem kodu Oriona i zmieniłem go.
Dodałem na minimalnej wysokości, aby na zniszczeniu nie zrobiło się za małe.
źródło
Podobnie jak odpowiedź @memical.
Jednak znalazłem pewne ulepszenia. Możesz użyć
height()
funkcji jQuery . Pamiętaj jednak o pikselach dopełniających górnych i dolnych. W przeciwnym razie obszar tekstowy będzie się rozwijał zbyt szybko.źródło
Moje rozwiązanie nie używające jQuery (ponieważ czasami nie muszą być tym samym) jest poniżej. Chociaż został przetestowany tylko w przeglądarce Internet Explorer 7 , społeczność może wskazać wszystkie przyczyny tego błędu:
Jak dotąd bardzo podoba mi się to, jak to działa i nie obchodzą mnie inne przeglądarki, więc prawdopodobnie zastosuję to do wszystkich moich obszarów tekstowych:
źródło
Oto rozszerzenie widżetu Prototyp, które Jeremy opublikował 4 czerwca:
Uniemożliwia użytkownikowi wprowadzanie większej liczby znaków, jeśli używasz ograniczeń w obszarach tekstu. Sprawdza, czy zostały jeszcze znaki. Jeśli użytkownik skopiuje tekst do obszaru tekstowego, tekst zostanie odcięty przy max. długość:
źródło
@memical miał świetne rozwiązanie do ustawiania wysokości textarea na pageload z jQuery, ale w mojej aplikacji chciałem mieć możliwość zwiększania wysokości textarea, gdy użytkownik dodawał więcej treści. Zbudowałem rozwiązanie Memical z następującymi elementami:
Nie jest zbyt płynna, ale nie jest też aplikacją skierowaną do klienta, więc płynność tak naprawdę nie ma znaczenia. (Gdyby to było skierowane do klienta, prawdopodobnie użyłbym po prostu wtyczki jQuery z automatyczną zmianą rozmiaru).
źródło
Dla tych, którzy kodują dla IE i napotykają ten problem. IE ma małą sztuczkę, dzięki której jest w 100% CSS.
Możesz nawet podać wartość dla wierszy = "n", którą IE będzie ignorować, ale inne przeglądarki będą używać. Naprawdę nienawidzę kodowania, które implementuje hacki IE, ale ten jest bardzo pomocny. Możliwe, że działa tylko w trybie Quirks.
źródło
Użytkownicy przeglądarek Internet Explorer, Safari, Chrome i Opera muszą pamiętać o jawnym ustawieniu wartości wysokości linii w CSS. Tworzę arkusz stylów, który ustawia początkowe właściwości dla wszystkich pól tekstowych w następujący sposób.
źródło
Oto funkcja, którą właśnie napisałem w jQuery, aby to zrobić - możesz przenieść ją do Prototype , ale nie obsługują one "żywotności" jQuery, więc elementy dodane przez żądania Ajax nie będą odpowiadać.
Ta wersja nie tylko rozszerza się, ale także kurczy się po naciśnięciu klawisza Delete lub Backspace.
Ta wersja opiera się na jQuery 1.4.2.
Cieszyć się ;)
http://pastebin.com/SUKeBtnx
Stosowanie:
lub (na przykład dowolny selektor jQuery)
Został przetestowany w przeglądarce Internet Explorer 7 / Internet Explorer 8 , Firefox 3.5 i Chrome. Wszystko działa dobrze.
źródło
Używając ASP.NET, po prostu zrób to:
źródło