2012-05-31 15 views
8

Cómo calcular el ancho de un elemento HTML de entrada para que coincida con el tamaño de su contenido? ya puedo actualizar una entrada sobre la marcha a medida que el usuario escribe:¿Cómo calcular el ancho de un elemento HTML de entrada para que coincida con el tamaño de su contenido?

<input type='text' onkeydown='this.size=this.value.length' /> 

Sin embargo, esto no parece del todo correcta, ya que no tiene en cuenta el hecho de que algunos caracteres son más que otros:

  • voy a conseguir más y más espacios en blanco si escribo sólo algunos caracteres "L"
  • el tamaño será insuficiente si escribo sólo algunos caracteres "w"

¿Cómo proceder?

PD: ¿Por qué quiero hacer esto (ya respondió esto en una respuesta que se eliminó)? Tengo oraciones en las que tengo que reemplazar el contenido del paréntesis por entradas (por ejemplo: [el usuario] tiene [años]). No tengo idea de lo que puede ser la oración, por lo que no conozco una longitud adecuada para las entradas, y me gustaría mantenerla legible en una línea (evitando demasiados espacios en blanco).

+2

¿Por qué quiere esto en primer lugar? Tal vez haya una solución más fácil –

+0

onkeydown no captaría pegar con un clic del mouse –

+0

@Pekka Pregunta editada. Véase más arriba. –

Respuesta

4

Puede usar un lienzo (oculto) y el measureText() método del contexto para obtener el ancho de su cadena.

EDIT:

Parece fast enough.

+0

Lienzo no compatible con IE8 Me temo (por favor no preguntes por qué tengo que apoyar IE8). Sin embargo, tengo curiosidad sobre lo eficiente/rápido que sería. ¿Funcionaría lo suficientemente rápido para onkeyup? –

+0

Buena pregunta. Lo probaré. – dda

+0

Véase la respuesta modificada. – dda

3

En primer lugar, definir un poco de CSS ...

input, 
#input-helper { 
    display: inline; 
    font-size: 14px; 
    font-family: serif; 
    line-height: 16px; 
} 

#input-helper { 
    position: absolute; 
    top: -10000px; 
} 

... a continuación, utilizar algo de JavaScript ...

var div = document.createElement("div"); 
div.id = "input-helper"; 
document.body.appendChild(div); 

var input = document.querySelector("input"); 

input.addEventListener("keyup", function() { 
    div.textContent = this.value; 
    input.style.width = div.offsetWidth + "px"; 
});​ 

jsFiddle.

También querrá elegir un ancho de inicio razonable para su elemento input.

+0

bien, listo. Pero no estoy seguro si esto será lo suficientemente rápido. onkeyup se puede disparar bastantes veces en 1 segundo. Hará la prueba. –

+0

+1 para crear un método excelente para usar. Para mi gusto, cambiando '" px "' a '+ 15 +" px "' hace que el texto [menos nervioso] (http://jsfiddle.net/Y5vAe/1/). La respuesta que proporcioné podría ser exagerada, pero el archivo fuente de 2kb también se basa en '.offsetWidth' también. ¡Aclamaciones! – arttronics

2

Si usar jQuery no es un problema, he aquí una demostración que preparé en jsFiddle. Utiliza un archivo Autoexpand.js que hace lo que desea. Mira el último ejemplo en el violín.

Algunos detalles:

  1. Se basa en .keyup.keypress y para la respuesta más rápida posible.
  2. Tiene en cuenta el marcado HTML pegado en el cuadro. Se abordan cosas como los saltos de línea.
  3. El archivo de origen muestra un procesamiento inteligente al tomar en consideración todo lo relacionado con la fuente.

También se incluyen en el jsFiddle enlaces para descargar una versión pegada del violín ya que jsFiddle Sandbox se rompe en IE8. Dicho esto, ¡también funciona en IE7 también!

+0

En mi caso, no puedo usar JQuery. Gracias anyawy, podría ser útil para otros. –

0

Primero: Añadir este div donde desea

<div id="calcsize" style="display:none;"></div> 

Segundo: Utilice esta función

function getWidthof(txt) 
{ 
    $('#calcsize').empty().append(txt); 
    return $('#calcsize').width(); 
} 
Cuestiones relacionadas