Actualmente estoy trabajando en una aplicación de ventas internas para la empresa para la que trabajo y tengo un formulario que permite al usuario cambiar la dirección de entrega.
Ahora creo que se vería mucho mejor, si el área de texto que estoy usando para los detalles de la dirección principal solo ocupara el área del texto y automáticamente cambiara de tamaño si se cambiara el texto.
Aquí hay una captura de pantalla actualmente.
¿Algunas ideas?
@Chris
Un buen punto, pero hay razones por las que quiero que cambie de tamaño. Quiero que el área que ocupa sea el área de la información que contiene. Como puede ver en la captura de pantalla, si tengo un área de texto fija, ocupa bastante espacio vertical.
Puedo reducir la fuente, pero necesito que la dirección sea grande y legible. Ahora puedo reducir el tamaño del área de texto, pero luego tengo problemas con las personas que tienen una línea de dirección que toma 3 o 4 (una toma 5) líneas. Necesitar que el usuario use una barra de desplazamiento es un gran no-no.
Supongo que debería ser un poco más específico. Estoy tras el cambio de tamaño vertical, y el ancho no importa tanto. El único problema que ocurre con eso es que el número ISO (el "1" grande) se coloca debajo de la dirección cuando el ancho de la ventana es demasiado pequeño (como puede ver en la captura de pantalla).
No se trata de tener un truco; se trata de tener un campo de texto que el usuario pueda editar y que no ocupe espacio innecesario, pero que muestre todo el texto que contiene.
Aunque si a alguien se le ocurre otra forma de abordar el problema, yo también estoy abierto a eso.
Modifiqué un poco el código porque estaba actuando un poco extraño. Lo cambié para que se active al presionar la tecla, porque no tomaría en consideración el carácter que se acaba de escribir.
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;
};
fuente
Respuestas:
Facebook lo hace cuando escribes en las paredes de las personas, pero solo cambia de tamaño verticalmente.
El cambio de tamaño horizontal me parece un desastre, debido al ajuste de palabras, las líneas largas, etc., pero el cambio de tamaño vertical parece ser bastante seguro y agradable.
Ninguno de los novatos que usan Facebook que conozco ha mencionado algo al respecto o se ha sentido confundido. Usaría esto como evidencia anecdótica para decir 'adelante, impleméntalo'.
Algún código JavaScript para hacerlo, usando Prototype (porque eso es con lo que estoy familiarizado):
PD: Obviamente, este código JavaScript es muy ingenuo y no está bien probado, y probablemente no quieras usarlo en cuadros de texto con novelas, pero entiendes la idea general.
fuente
<textarea cols='5'>0 12345 12345 0</textarea>
. (Escribí una implementación casi idéntica y no capté esto hasta después de un mes de usarla). También falla para las líneas en blanco.Un refinamiento de algunas de estas respuestas es dejar que CSS haga más trabajo.
La ruta básica parece ser:
textarea
y un ocultodiv
textarea
contenido de 'sincronizado con eldiv
' sdiv
, evitamos establecer explícitamente latextarea
altura de la.fuente
var text = $("#textArea").val().replace(/\n/g, '<br/>') + ' ';
se asegura de que no tenga un comportamiento desigual al pasar de una nueva línea vacía al final del área de texto a una no vacía, ya que el div oculto se asegura de ajustarse al nbsp.Aquí hay otra técnica para ajustar automáticamente el tamaño de un área de texto.
Código: (JavaScript simple de vainilla)
Demostración: (usa jQuery, se dirige al área de texto en la que estoy escribiendo en este momento; si tiene Firebug instalado, pegue ambas muestras en la consola y pruebe en esta página)
fuente
clientHeight
yscrollHeight
es igual, no puede usar este método si desea que su área de texto se reduzca y crezca.if (text.clientHeight == text.scrollHeight) text.style.height = "20px";
Probablemente la solución más corta:
De esta manera, no necesitas divs ocultos ni nada de eso.
Nota: es posible que tenga que jugar
this.style.height = (this.scrollHeight) + "px";
dependiendo de cómo diseñe el área de texto (altura de línea, relleno y ese tipo de cosas).fuente
keyup
podría ser suficiente, pero no estoy seguro. Estaba tan feliz de haberlo descubierto, que dejé de intentar cualquier otra cosa.Aquí hay una versión de prototipo de cambiar el tamaño de un área de texto que no depende del número de columnas en el área de texto. Esta es una técnica superior porque le permite controlar el área de texto a través de CSS, así como tener un área de texto de ancho variable. Además, esta versión muestra el número de caracteres restantes. Si bien no se solicita, es una característica bastante útil y se elimina fácilmente si no se desea.
Crea el widget llamando
new Widget.Textarea('element_id')
. Las opciones predeterminadas se pueden anular pasándolas como un objeto, por ejemplonew Widget.Textarea('element_id', { max_length: 600, min_height: 50})
. Si desea crearlo para todas las áreas de texto de la página, haga algo como:fuente
Aquí hay una solución con
JQuery
:abc
es unteaxtarea
.fuente
Consulte el siguiente enlace: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
fuente
Solo revisando esto, lo he hecho un poco más ordenado (¿aunque alguien que esté lleno de Prototype / JavaScript podría sugerir mejoras?).
Solo llama con:
fuente
Hice algo bastante fácil. Primero puse TextArea en un DIV. En segundo lugar, he llamado a la
ready
función de este script.Sencillo. Es la altura máxima del div una vez que se renderiza, dividida por la altura de un TextArea de una fila.
fuente
Necesitaba esta función para mí, pero ninguna de las de aquí funcionó como las necesitaba.
Entonces usé el código de Orion y lo cambié.
Agregué una altura mínima, para que en la destrucción no se vuelva demasiado pequeña.
fuente
Como la respuesta de @memical.
Sin embargo, encontré algunas mejoras. Puede utilizar la
height()
función jQuery . Pero tenga en cuenta los píxeles de la parte superior y la parte inferior del relleno. De lo contrario, su área de texto crecerá demasiado rápido.fuente
Mi solución que no usa jQuery (porque a veces no tienen que ser lo mismo) está a continuación. Aunque solo se probó en Internet Explorer 7 , la comunidad puede señalar todas las razones por las que esto es incorrecto:
Hasta ahora me gusta mucho cómo funciona, y no me importan otros navegadores, así que probablemente lo aplicaré a todas mis áreas de texto:
fuente
Aquí hay una extensión del widget Prototype que Jeremy publicó el 4 de junio:
Evita que el usuario ingrese más caracteres si está usando límites en áreas de texto. Comprueba si quedan caracteres. Si el usuario copia texto en el área de texto, el texto se corta al máximo. longitud:
fuente
@memical tenía una solución increíble para establecer la altura del área de texto en la carga de página con jQuery, pero para mi aplicación quería poder aumentar la altura del área de texto a medida que el usuario agregaba más contenido. Construí la solución de memical con lo siguiente:
No es muy suave, pero tampoco es una aplicación orientada al cliente, por lo que la suavidad realmente no importa. (Si esto hubiera sido orientado al cliente, probablemente habría usado un complemento jQuery de cambio de tamaño automático).
fuente
Para aquellos que están codificando para IE y encuentran este problema. IE tiene un pequeño truco que lo convierte en 100% CSS.
Incluso puede proporcionar un valor para las filas = "n" que IE ignorará, pero lo utilizarán otros navegadores. Realmente odio la codificación que implementa hacks de IE, pero este es muy útil. Es posible que solo funcione en modo Quirks.
fuente
Los usuarios de Internet Explorer, Safari, Chrome y Opera deben recordar establecer explícitamente el valor de altura de línea en CSS. Hago una hoja de estilo que establece las propiedades iniciales para todos los cuadros de texto de la siguiente manera.
fuente
Aquí hay una función que acabo de escribir en jQuery para hacerlo: puede portarla a Prototype , pero no admiten la "viveza" de jQuery, por lo que los elementos agregados por las solicitudes de Ajax no responderán.
Esta versión no solo se expande, sino que también se contrae cuando se presiona borrar o retroceder.
Esta versión se basa en jQuery 1.4.2.
Disfruta;)
http://pastebin.com/SUKeBtnx
Uso:
o (cualquier selector de jQuery, por ejemplo)
Se probó en Internet Explorer 7 / Internet Explorer 8 , Firefox 3.5 y Chrome. Todo funciona bien.
fuente
Usando ASP.NET, simplemente haga esto:
fuente