Hubo otro hilo sobre esto , que he probado. Pero hay un problema: el textarea
no se reduce si elimina el contenido. No puedo encontrar ninguna forma de reducirlo al tamaño correcto: el clientHeight
valor regresa como el tamaño completo del textarea
, no su contenido.
El código de esa página está abajo:
function FitToContent(id, maxHeight)
{
var text = id && id.style ? id : document.getElementById(id);
if ( !text )
return;
var adjustedHeight = text.clientHeight;
if ( !maxHeight || maxHeight > adjustedHeight )
{
adjustedHeight = Math.max(text.scrollHeight, adjustedHeight);
if ( maxHeight )
adjustedHeight = Math.min(maxHeight, adjustedHeight);
if ( adjustedHeight > text.clientHeight )
text.style.height = adjustedHeight + "px";
}
}
window.onload = function() {
document.getElementById("ta").onkeyup = function() {
FitToContent( this, 500 )
};
}
Respuestas:
Esto funciona para mí (Firefox 3.6 / 4.0 y Chrome 10/11):
Si quieres probarlo en jsfiddle , comienza con una sola línea y crece solo la cantidad exacta necesaria. Está bien para un solo
textarea
, pero quería escribir algo en el que tendría muchos, muchos, muchos de esostextarea
correos electrónicos (casi tanto como uno normalmente tendría líneas en un documento de texto grande). En ese caso es realmente lento. (En Firefox es increíblemente lento). Así que realmente me gustaría un enfoque que use CSS puro. Esto sería posible concontenteditable
, pero quiero que sea de texto sin formato.fuente
style.height='auto'
. Sospecho que la solución es agregar un hermano oculto utilizado solo para la medición.UNA SOLUCIÓN COMPLETA Y SIMPLE
2020-05-14 actualizado (Soporte de navegador mejorado para móviles y tabletas)
El siguiente código funcionará:
OPCIÓN 1 (Con jQuery)
Esta opción requiere jQuery y se ha probado y funciona con 1.7.2 - 3.3.1
Simple (Agregue este código jquery a su archivo de script maestro y olvídese).
Test on jsfiddle
OPCIÓN 2 (JavaScript puro)
Simple (Agregue este JavaScript a su archivo de script maestro y olvídese de él).
Test on jsfiddle
OPCIÓN 3 (extensión jQuery)
Útil si desea aplicar más encadenamiento a las áreas de texto que desea ajustar automáticamente.
Invocar con
$('textarea').autoHeight()
ACTUALIZAR TEXTAREA A TRAVÉS DE JAVASCRIPT
Al inyectar contenido en un área de texto a través de JavaScript, agregue el siguiente código para invocar la función en la opción 1.
ALTURA DE TEXTAREA PREDETERMINADA
Para corregir la altura inicial del área de texto, deberá agregar una condición adicional:
fuente
this.style.height = 'auto';
es el arreglo de comportamiento mágico. Estaba tan frustrado por qué el scrollHeight tenía un comportamiento tan extraño. La altura a automática, luego haciendo coincidir la altura de desplazamiento en el mismo ciclo de renderizado, todavía me sorprende cómo "soluciona" este problema, aunque solo debería estar técnicamente pintando la segunda altura.this.style.height = 'auto';
corrige el comportamiento de scrollHeight? Es solo magia.La solución jQuery ajusta el CSS para que coincida con sus requisitos
css ...
javascript ...
O alternativa para jQuery 1.7 + ...
He creado un violín con el estilo mínimo absoluto como punto de partida para sus experimentos ... http://jsfiddle.net/53eAy/951/
fuente
overflow-y: hidden;
al CSS para evitar que la barra de desplazamiento parpadee brevemente cuando se produce el cambio de tamaño.$('textarea.auto-resize').on('change cut paste drop keyup', function(){...})
Probado en Firefox 14 y Chromium 18. Los números 24 y 12 son arbitrarios, prueba para ver cuál te queda mejor.
Podría prescindir de las etiquetas de estilo y script, pero se vuelve un poco desordenado en mi humilde opinión (este es HTML + JS de estilo antiguo y no se recomienda).
Editar: código modernizado. Se cambió el atributo onkeyup a addEventListener.
Editar: keydown funciona mejor que keyup
Editar: declarar la función antes de usar
Editar: la entrada funciona mejor que keydown (thnx @ WASD42 y @ MA-Maddin)
jsfiddle
fuente
input
evento en su lugar. Ver stackoverflow.com/a/14029861/1951524textarea
soporte múltiple de una sola línea:document.querySelectorAll('textarea').forEach(function(te){ te.addEventListener("input", function() { this.style.height='24px'; this.style.height=this.scrollHeight+12+'px'; }); });
removeEventListener
y limpiar sus oyentes de eventos. Esto es especialmente importante cuando se crean oyentes de eventos por todo el lugar en un bucle forEach. Además, en mi opinión, la legibilidad es mucho más importante que la concisión.box-sizing: border-box;
propiedad esté establecida o de lo contrario, el área de texto explica 4px para cada evento onInput. Pasé como 3 horas hasta que descubrí que este era el problema.La mejor solución (funciona y es corta) para mí es:
Funciona a la perfección sin parpadear con pegar (con el mouse también), cortar, ingresar y se contrae al tamaño correcto.
Por favor, eche un vistazo a jsFiddle .
fuente
Está utilizando el valor más alto de la actual clientHeight y el contenido scrollHeight. Cuando hace que scrollHeight sea más pequeño al eliminar contenido, el área calculada no puede reducirse porque clientHeight, previamente establecido por style.height, lo mantiene abierto. En su lugar, puede tomar un máximo () de scrollHeight y un valor de altura mínima que haya predefinido o calculado a partir de textarea.rows.
En general, probablemente no debería confiar en scrollHeight en los controles de formulario. Además de que scrollHeight es tradicionalmente menos compatible que algunas de las otras extensiones de IE, HTML / CSS no dice nada acerca de cómo se implementan los controles de formulario internamente y no se garantiza que scrollHeight sea algo significativo. (Tradicionalmente, algunos navegadores han utilizado widgets del sistema operativo para la tarea, lo que hace imposible la interacción CSS y DOM en sus componentes internos). Al menos olfatee la existencia de scrollHeight / clientHeight antes de intentar habilitar el efecto.
Otro posible enfoque alternativo para evitar el problema si es importante que funcione más ampliamente podría ser usar un div oculto con el mismo ancho que el área de texto y establecerlo en la misma fuente. En el keyup, copia el texto del área de texto a un nodo de texto en div oculto (recordando reemplazar '\ n' con un salto de línea, y escapa '' '' 'correctamente' si está utilizando innerHTML). Luego, simplemente midiendo el desplazamiento del div, la altura le dará la altura que necesita.
fuente
scrollHeight
para las áreas de texto? Funciona bien con las versiones actuales de IE, Firefox y Opera ...Si no necesita admitir IE8, puede usar el
input
evento:Ahora solo necesita agregar un poco de CSS y ya está:
Uso:
Puedes leer más sobre cómo funciona en mi blog .
fuente
input
evento durante la inicialización en cada ciclo.tamaño automático
https://github.com/jackmoore/autosize
Just works, independiente, es popular (3.0k + estrellas GitHub a partir de octubre de 2018), disponible en cdnjs ) y ligero (~ 3.5k). Manifestación:
Por cierto, si está utilizando el editor ACE, use
maxLines: Infinity
: Ajusta automáticamente la altura a los contenidos en el editor Ace Cloud 9fuente
autosize
complemento no permite cambiar el tamaño manualmente usando el icono de cambio de tamaño en textarea.Encontré un trazador de líneas desde aquí ;
fuente
¿Alguien ha considerado contento? No pierda el tiempo con el desplazamiento, y el único JS que me gusta es si planea guardar los datos en el desenfoque ... y aparentemente, es compatible en todos los navegadores populares: http://caniuse.com/#feat = contentable
Simplemente dale estilo para que parezca un cuadro de texto, y se ajusta automáticamente ... Haz que su altura mínima sea la altura de texto preferida y tenlo.
Lo bueno de este enfoque es que puede guardar y etiquetar en algunos de los navegadores.
http://jsfiddle.net/gbutiri/v31o8xfo/
fuente
contenteditable
es bueno, pero si quieres texto sin formato necesita un montón de opciones como-webkit-user-modify: read-write-plaintext-only
ywhite-space: pre-wrap
.[dom-element].innerText
. @WebmasterG En mi humilde opinión, sería bueno omitir jquery (por transparencia) e incluir el ejemplo en esta página a través de Fragmento de código ejecutable en lugar de en jsfiddle.Usé el siguiente código para múltiples áreas de texto. Funciona bien en Chrome 12, Firefox 5 e IE 9, incluso con las acciones de eliminar, cortar y pegar realizadas en las áreas de texto.
fuente
Hay un enfoque ligeramente diferente.
La idea es copiar el texto desde
textarea
dentro de lapre
y dejar CSS asegurarse de que tienen el mismo tamaño.El beneficio es que los marcos presentan herramientas simples para mover el texto sin tocar ningún evento. A saber, en AngularJS agregarías un
ng-model="foo" ng-trim="false"
atextarea
yng-bind="foo + '\n'"
alpre
. Ver un violín .Solo asegúrese de que
pre
tenga el mismo tamaño de fuente quetextarea
.fuente
pre
tenga el mismo tamaño de fuente que eltextarea
" - Necesitan lo mismoline-height
, y una cantidad igual depadding
y / oborder
también. Esta es la mejor solución para Angular.Lo siguiente funciona para cortar, pegar, etc., independientemente de si esas acciones son del mouse, un atajo de teclado, seleccionando una opción de una barra de menú ... varias respuestas tienen un enfoque similar pero no tienen en cuenta el cuadro- dimensionamiento, por lo que aplican incorrectamente el estilo
overflow: hidden
.Hago lo siguiente, que también funciona bien con
max-height
yrows
para la altura mínima y máxima.Para completar por completo, debe llamar a la
adjust
función en algunas circunstancias más:textarea
cambios con el cambio de tamaño de la ventana u otros eventos que cambian el ancho del área de textotextarea
'sdisplay
cambios de atributos de estilo, por ejemplo, cuando pasa denone
(oculto) ablock
textarea
se cambia programáticamenteTenga en cuenta que usar
window.getComputedStyle
u obtenercurrentStyle
puede ser algo costoso desde el punto de vista computacional, por lo que es posible que desee almacenar en caché el resultado.Funciona para IE6, así que realmente espero que sea un soporte lo suficientemente bueno.
fuente
Como un enfoque diferente, puede usar un
<span>
que ajusta su tamaño automáticamente. Deberá hacerlo editable agregando lacontenteditable="true"
propiedad y listo:El único problema con este enfoque es que si desea enviar el valor como parte del formulario, deberá hacerlo usted mismo en JavaScript. Hacerlo es relativamente fácil. Por ejemplo, puede agregar un campo oculto y, en
onsubmit
caso de que el formulario se asigne, el valor delspan
campo oculto se enviará automáticamente con el formulario.fuente
Un poco de correcciones. Funciona perfectamente en Opera
fuente
Conozco una forma corta y correcta de implementar esto con jquery. No se necesita div oculto adicional y funciona en la mayoría de los navegadores
fuente
.live()
ha quedado en desuso. api.jquery.com/live En general, querrá usar.on()
en su lugar.No sé si alguien lo menciona de esta manera, pero en algunos casos es posible cambiar el tamaño de la altura con filas.
Manifestación
fuente
white-space: nowrap;
. Cuando una línea se ajusta a otra línea sin salto de línea, el área de texto ya no se ajustará correctamente.Aquí hay una directiva angularjs para la respuesta de panzi.
HTML:
fuente
Puede usar JQuery para expandir
textarea
mientras escribe:fuente
${textarea.scrollHeight}px
;});Aquellos que quieran lograr lo mismo en nuevas versiones de Angular.
Toma textArea elementRef.
También estoy agregando otro caso de uso que puede ser útil para algunos usuarios que leen el hilo, cuando el usuario desea aumentar la altura del área de texto a cierta altura y luego tenerlo
overflow:scroll
, el método anterior se puede extender para lograr el caso de uso mencionado.fuente
Algunas de las respuestas aquí no tienen en cuenta el relleno.
Suponiendo que tiene una altura máxima que no desea superar, esto funcionó para mí:
fuente
Un enfoque aún más simple y limpio es este:
// y el CSS
Todo lo que se necesita es agregar la
.auto-height
clase a cualquieratextarea
que desee apuntar.Probado en FF, Chrome y Safari. Avíseme si esto no funciona para usted, por alguna razón. Pero, esta es la forma más limpia y simple en que he encontrado que esto funciona. ¡Y funciona muy bien! :RE
fuente
Este código funciona para pegar y seleccionar eliminar también.
Aquí está el JSFiddle
fuente
Recomiendo la biblioteca javascript de http://javierjulio.github.io/textarea-autosize .
Por comentarios, agregue codeblock de ejemplo sobre el uso del complemento:
CSS mínimo requerido:
fuente
MakeTextAreaResisable que usa qQuery
fuente
Ninguna de las respuestas parece funcionar. Pero este funciona para mí: https://coderwall.com/p/imkqoq/resize-textarea-to-fit-content
fuente
mi implementación es muy simple, cuente el número de líneas en la entrada (y un mínimo de 2 filas para mostrar que es un área de texto):
ejemplo de trabajo completo con estímulo: https://jsbin.com/kajosolini/1/edit?html,js,output
(y esto funciona con el controlador de cambio de tamaño manual del navegador, por ejemplo)
fuente
La respuesta aceptada funciona bien. Pero eso es mucho código para esta funcionalidad simple. El siguiente código hará el truco.
fuente
Esto es lo que hice mientras usaba MVC HTML Helper para TextArea. Tenía bastantes elementos de área de texto, así que tuve que distinguirlos usando Id de modelo.
y en script agregó esto:
Lo he probado en IE10 y Firefox23
fuente
Puedes usar este código:
Coffescript:
Javascript
fuente