Expandir automáticamente un área de texto usando jQuery
128
¿Cómo puedo hacer que un área de texto se expanda automáticamente usando jQuery?
Tengo un cuadro de texto para explicar la agenda de la reunión, por lo que quiero ampliar ese cuadro de texto cuando el texto de mi agenda siga creciendo en esa área.
Considere cambiar su pregunta y eliminar la palabra "jQuery"
vsync
Respuestas:
113
He intentado mucho y
este es genial. Link está muerto. La versión más nueva está disponible aquí . Vea a continuación la versión anterior. Puede intentar presionando y manteniendo presionada la tecla Intro en el área de texto. Compare el efecto con el otro complemento textarea de expansión automática ...
Para evitar que la barra de desplazamiento en el área de texto parpadee durante la expansión / contracción, también puede configurarlo overflowen hidden:
Tuve que eliminar + parseFloat ($ (this) .css ("borderTopWidth")) + parseFloat ($ (this) .css ("borderBottomWidth")), de lo contrario, se repite infinitamente con un área de texto diseñada con bootstrap
@metakungfu Bueno, en lugar de solo votar negativamente, tal vez puedas ayudar a mejorar la respuesta. No tengo ninguna forma de probar el cajero automático de Apple y el safari para Windows se suspendió hace mucho tiempo. Así que realmente no puedo hacer nada para determinar por qué no funcionaría. En cuanto al código, no hay nada de malo en esta solución. ¿Estás seguro de que es el código el que se rompe y no el safari que se rompe en jsfiddle? Safari es bastante exigente y Fiddle acaba de pasar por una actualización importante. Mayeb puede abrir dev con y proporcionar más detalles?
SpYk3HH
1
También necesita área de texto conjunto desbordamiento-y a escondidas para evitar parpadear desplazamiento
iulial
2
Si deseo eliminar las filas agregadas, el tamaño ampliado del cuadro de texto sigue siendo el mismo, ¿es posible que también pueda cambiar el tamaño automáticamente?
Steven
33
Crece / encoge el área de texto. Esta demostración utiliza jQuery para el enlace de eventos, pero no es imprescindible de ninguna manera. ( sin compatibilidad con IE: IE no responde al cambio de atributo de filas )
porque el código debe esperar un poco para que la letra que escribió se imprima dentro del área de texto y, por lo tanto, cambie las dimensiones del área de texto
vsync
1
Ya veo, la solución se rompe cuando el texto se copia (CTRL + V) de cualquier fuente. Si bien, si el texto se escribe manualmente, esto es increíble y muy suave.
Satya Kalluri
1
@vsync: ¿cómo modificaría para múltiples áreas de texto? ¿Tienes textarea1 y textarea2 y quieres permitir que ambos crezcan?
si desea obtener el scrollHeight de $ (this), puede usar $ (this) .prop ('scrollHeight'); en cambio;)
Samuel Vicent
3
parpadea cada salto de línea
Joe
11
Gracias a SpYk3HH, comencé con su solución y la convertí en esta solución, que agrega la funcionalidad de reducción y es aún más simple y rápido, supongo.
no funciona bien en absoluto: / cada carácter que escribo, agrega altura.
vsync
1
¡Funciona perfecto para mí! Definitivamente no hay nada en el código simple para hacer lo que usted dice que hace.
drolex
1
Sí, lo veo ahora, su código debe tener la línea que establece la altura a 30 inicialmente. esto es probablemente una ilne no-necesaria, ya que obliga al desarrollador para modificar el código, en lugar del código de entender y adaptarse al área de texto,
VSYNC
1
Eso es incorrecto El desarrollador no necesita modificar el código. Se requiere establecer la altura en 30 y funciona para todo. El usuario nunca ve que eso suceda. Así es como puede reducir el área de texto. El código comprende y se adapta al área de texto. Ese es el punto.
drolex
Estás en lo correcto. página de demostración: jsbin.com/ObEcoza/2/edit (establecer la altura en 1pxparece ser mejor)
vsync
10
Para definir un área de texto auto expandible, debe hacer dos cosas:
Expanda una vez que haga clic en la tecla Intro, o escriba contenido en más de una línea.
Y reduzca al desenfoque para obtener el tamaño real si el usuario ha ingresado espacios en blanco. ( Bonificación )
Aquí hay una función hecha a mano para realizar la tarea.
Funciona bien con casi todos los navegadores (<IE7) . Aquí está el método:
//Here is an event to get TextArea expand when you press Enter Key in it.// intiate a keypress event
$('textarea').keypress(function(e){if(e.which ==13){var control = e.target;var controlHeight = $(control).height();//add some height to existing height of control, I chose 17 as my line-height was 17 for the control
$(control).height(controlHeight+17);}});
$('textarea').blur(function(e){var textLines = $(this).val().trim().split(/\r*\n/).length;
$(this).val($(this).val().trim()).height(textLines*17);});
Un cuadro de texto (elemento de texto de entrada, supongo) no es multilínea. Use un área de texto, pero póngale un estilo apropiado: filas, columnas, etc., y luego use el complemento de crecimiento automático como se indicó anteriormente.
richsage
4
Todos deberían probar este complemento jQuery: xautoresize-jquery . Es realmente bueno y debería resolver tu problema.
Este me dio los mejores resultados y también es fácil de implementar.
bombardeo el
4
function autosize(textarea){
$(textarea).height(1);// temporarily shrink textarea so that scrollHeight returns content height when content does not fill textarea
$(textarea).height($(textarea).prop("scrollHeight"));}
$(document).ready(function(){
$(document).on("input","textarea",function(){
autosize(this);});
$("textarea").each(function(){
autosize(this);});});
(Esto no funcionará en Internet Explorer 9 o anterior, ya que hace uso del inputevento)
en mi proyecto, ya que estoy representando cosas enteras en la página por Jquery y mecanografiado, su solución fue la única forma en que pude resolver mi problema gracias
Harry Sarshogh
3
Acabo de construir esta función para expandir áreas de texto en la carga de la página. Sólo cambia eacha keyupy ocurrirá cuando el área de texto se escribe en.
// On page-load, auto-expand textareas to be tall enough to contain initial content
$('textarea').each(function(){var pad = parseInt($(this).css('padding-top'));if($.browser.mozilla)
$(this).height(1);var contentHeight =this.scrollHeight;if(!$.browser.mozilla)
contentHeight -= pad *2;if(contentHeight > $(this).height())
$(this).height(contentHeight);});
Probado en Chrome, IE9 y Firefox. Desafortunadamente, Firefox tiene este error que devuelve el valor incorrecto para scrollHeight, por lo que el código anterior contiene una solución (hacky).
Solucioné algunos errores en la respuesta proporcionada por Reigel (la respuesta aceptada):
El orden en que se reemplazan las entidades html ahora no causa código inesperado en el elemento sombra. (El original reemplazó ">" por "& ampgt;", causando un cálculo incorrecto de la altura en algunos casos raros).
Si el texto termina con una nueva línea, la sombra ahora obtiene un carácter adicional "#", en lugar de tener una altura adicional fija, como es el caso en el original.
Cambiar el tamaño del área de texto después de la inicialización actualiza el ancho de la sombra.
ajuste de palabra agregado: palabra de interrupción para sombra, por lo que se rompe igual que un área de texto (forzando interrupciones para palabras muy largas)
Hay algunos problemas pendientes con respecto a los espacios. No veo una solución para los espacios dobles, se muestran como espacios individuales en la sombra (representación html). Esto no puede solucionarse usando & nbsp ;, porque los espacios deberían romperse. Además, el área de texto rompe una línea después de un espacio, si no hay espacio para ese espacio, romperá la línea en un punto anterior. Las sugerencias son bienvenidas.
Código de SpYk3HH con adición para reducir el tamaño.
function get_height(elt){return elt.scrollHeight + parseFloat($(elt).css("borderTopWidth"))+ parseFloat($(elt).css("borderBottomWidth"));}
$("textarea").keyup(function(e){var found =0;while(!found){
$(this).height($(this).height()-10);while($(this).outerHeight()< get_height(this)){
$(this).height($(this).height()+1);
found =1;};}});
Para cualquiera que use el complemento publicado por Reigel, tenga en cuenta que esto deshabilitará la funcionalidad de deshacer en Internet Explorer (vaya a probar la demostración).
Quería animaciones y auto encogimiento. La combinación es aparentemente difícil, porque a la gente se le ocurrieron soluciones bastante intensas. También lo hice a prueba de múltiples textos. Y no es tan ridículamente pesado como el complemento jQuery.
Nota: he notado que a veces funciona mejor con box-sizing: content-box. Sin embargo, no estoy completamente seguro de por qué, debería procesar el relleno correctamente :(
Lodewijk
1
Hay muchas respuestas para esto, pero encontré algo muy simple, adjunte un evento keyup al área de texto y verifique la tecla enter, presione el código 13
Antigua pregunta pero podrías hacer algo como esto:
html:
<textareaclass="text-area"rows="1"></textarea>
jquery:
var baseH;// base scroll height
$('body').one('focus.textarea','.text-area',function(e){
baseH =this.scrollHeight;}).on('input.textarea','.text-area',function(e){if(baseH <this.scrollHeight){
$(this).height(0).height(this.scrollHeight);}else{
$(this).height(0).height(baseH);}});
De esta manera, el cambio de tamaño automático se aplicará a cualquier área de texto con la clase "área de texto". También se reduce cuando se elimina el texto.
Respuestas:
He intentado mucho y este es genial.Link está muerto. La versión más nueva está disponible aquí . Vea a continuación la versión anterior.Puede intentar presionando y manteniendo presionada la tecla Intro en el área de texto. Compare el efecto con el otro complemento textarea de expansión automática ...
editar basado en comentario
nota: debe incluir los archivos js necesarios ...
Para evitar que la barra de desplazamiento en el área de texto parpadee durante la expansión / contracción, también puede configurarlo
overflow
enhidden
:Actualizar:
El enlace de arriba está roto. Pero aún puede obtener los archivos javascript aquí .
fuente
Si no quieres un complemento, hay una solución muy simple
Véalo trabajando en un jsFiddle Solía responder otra pregunta de textarea aquí .
Para responder a la pregunta de hacerlo a la inversa o hacerlo más pequeño a medida que se elimina el texto: jsFiddle
@ Jason ha diseñado uno aquí
fuente
if (this.clientHeight < this.scrollHeight) { this.style.height = this.scrollHeight + 'px'; }
Crece / encoge el área de texto. Esta demostración utiliza jQuery para el enlace de eventos, pero no es imprescindible de ninguna manera.
( sin compatibilidad con IE: IE no responde al cambio de atributo de filas )
PAGINA DEMO
HTML
CSS
javascript (actualizado)
fuente
fuente
Puedes probar este
fuente
Gracias a SpYk3HH, comencé con su solución y la convertí en esta solución, que agrega la funcionalidad de reducción y es aún más simple y rápido, supongo.
Probado en el navegador actual Chrome, Firefox y Android 2.3.3.
Puede ver destellos de las barras de desplazamiento en algunos navegadores. Agregue este CSS para resolver eso.
fuente
1px
parece ser mejor)Para definir un área de texto auto expandible, debe hacer dos cosas:
Aquí hay una función hecha a mano para realizar la tarea.
Funciona bien con casi todos los navegadores (<IE7) . Aquí está el método:
AQUÍ hay una publicación sobre esto.
fuente
He usado el complemento Textarea Expander jQuery antes con buenos resultados.
fuente
Todos deberían probar este complemento jQuery: xautoresize-jquery . Es realmente bueno y debería resolver tu problema.
fuente
(Esto no funcionará en Internet Explorer 9 o anterior, ya que hace uso del
input
evento)fuente
Acabo de construir esta función para expandir áreas de texto en la carga de la página. Sólo cambia
each
akeyup
y ocurrirá cuando el área de texto se escribe en.Probado en Chrome, IE9 y Firefox. Desafortunadamente, Firefox tiene este error que devuelve el valor incorrecto para
scrollHeight
, por lo que el código anterior contiene una solución (hacky).fuente
Solucioné algunos errores en la respuesta proporcionada por Reigel (la respuesta aceptada):
Hay algunos problemas pendientes con respecto a los espacios. No veo una solución para los espacios dobles, se muestran como espacios individuales en la sombra (representación html). Esto no puede solucionarse usando & nbsp ;, porque los espacios deberían romperse. Además, el área de texto rompe una línea después de un espacio, si no hay espacio para ese espacio, romperá la línea en un punto anterior. Las sugerencias son bienvenidas.
Código corregido:
fuente
Código de SpYk3HH con adición para reducir el tamaño.
fuente
Esto me funcionó mejor:
fuente
La gente parece tener soluciones muy trabajadas ...
Así es como lo hago:
Esto funcionará con líneas largas, así como con saltos de línea ... crece y se contrae ...
fuente
Escribí esta función jquery que parece funcionar.
Sin embargo, debe especificar min-height en css y, a menos que desee hacer algo de codificación, debe tener dos dígitos. es decir, 12px;
fuente
Para cualquiera que use el complemento publicado por Reigel, tenga en cuenta que esto deshabilitará la funcionalidad de deshacer en Internet Explorer (vaya a probar la demostración).
Si esto es un problema para usted, sugeriría usar el complemento publicado por @richsage, ya que no sufre este problema. Para obtener más información, consulte el segundo punto en Búsqueda del área de texto de cambio de tamaño definitivo .
fuente
También está el
bgrins/ExpandingTextareas (github)
proyecto genial , basado en una publicación de Neill Jenkins llamada Expanding Text Areas Made Elegantfuente
Quería animaciones y auto encogimiento. La combinación es aparentemente difícil, porque a la gente se le ocurrieron soluciones bastante intensas. También lo hice a prueba de múltiples textos. Y no es tan ridículamente pesado como el complemento jQuery.
Me basé en la respuesta de vsync (y la mejora que hizo), http://codepen.io/anon/pen/vlIwj es el codepen para mi mejora.
HTML
CSS
JS
fuente
Hay muchas respuestas para esto, pero encontré algo muy simple, adjunte un evento keyup al área de texto y verifique la tecla enter, presione el código 13
keyPressHandler(e){
if(e.keyCode == 13){
e.target.rows = e.target.rows + 1;
}
}
Esto agregará otra fila a su área de texto y puede diseñar el ancho usando CSS.
fuente
Digamos que estás tratando de lograr esto usando Knockout ... así es como:
En pagina:
En vista del modelo:
Esto debería funcionar incluso si tiene varias áreas de texto creadas por un foreach Knockout como yo.
fuente
Solución simple:
HTML:
JS:
https://fiddle.jshell.net/7wsnwbzg/
fuente
La solución más simple:
html:
css:
js (jquery):
fuente
Solución con JS puro
https://jsfiddle.net/Samb102/cjqa2kf4/54/
fuente
Esta es la solución que terminé usando. Quería una solución en línea, y hasta ahora parece funcionar muy bien:
fuente
https://codepen.io/nanachi1/pen/rNNKrzQ
Esto debería funcionar.
fuente
@Georgiy Ivankin hizo una sugerencia en un comentario, la usé con éxito :) -, pero con ligeros cambios:
Deja de expandirse después de alcanzar una altura máxima de 200 px
fuente
Antigua pregunta pero podrías hacer algo como esto:
html:
jquery:
De esta manera, el cambio de tamaño automático se aplicará a cualquier área de texto con la clase "área de texto". También se reduce cuando se elimina el texto.
jsfiddle:
https://jsfiddle.net/rotaercz/46rhcqyn/
fuente
Prueba esto:
fuente
Solución simple de jQuery:
HTML:
El desbordamiento debe estar oculto . Cambiar el tamaño es ninguno si no desea que sea redimensionable con el mouse.
fuente