<html>
<head>
</head>
<body>
<input type="text" value="1" style="min-width:1px;" />
</body>
</html>
Este es mi código y no funciona. ¿Hay alguna otra forma en HTML, JavaScript, PHP o CSS para establecer el ancho mínimo?
Quiero un campo de entrada de texto con un ancho que cambie dinámicamente, para que el campo de entrada fluya alrededor de su contenido. Cada entrada tiene un relleno incorporado 2em
, ese es el problema y el segundo problema es que min-width
no funciona en absoluto en la entrada.
Si configuro el ancho más de lo necesario de lo que todo el programa es desordenado, necesito el ancho de 1px, más solo si es necesario.
javascript
html
css
Kerc
fuente
fuente
Respuestas:
Parece que su expectativa es que el estilo se aplique dinámicamente al ancho del cuadro de texto en función del contenido del cuadro de texto. Si es así, necesitará algunos js para ejecutar el cambio de contenido del cuadro de texto, algo como esto :
Nota: esta solución solo funciona cuando cada carácter es exactamente
8px
ancho.fuente
onInput
En las versiones modernas del navegador, la unidad CSS
ch
también está disponible. A mi entender, es una unidad independiente de la fuente, donde1ch
es igual al ancho del carácter0
(cero) en cualquier fuente dada.Por lo tanto, algo tan simple como lo siguiente podría usarse como función de cambio de tamaño:
Ese ejemplo redimensionaría "elem" a la longitud del valor + 2 caracteres extra.
fuente
input
elemento, comofont-style
,letter-spacing
etc. He editado la respuesta con una demostración en vivo..
se encuentra un.Para calcular el ancho de la entrada actual, deberá incrustarlo en un
span
elemento temporal , adjuntarlo al DOM, obtener el ancho calculado (en píxeles) utilizando lascrollWidth
propiedad y eliminarlospan
nuevamente. Por supuesto, deberá asegurarse de utilizar la misma familia de fuentes, tamaño de fuente, etc.,input
tanto en elspan
elemento como en el elemento. Por lo tanto, les asigné la misma clase.Adjunté la función al
keyup
evento, ya quekeypress
el carácter de entrada aún no se agrega a la entradavalue
, por lo que el ancho será incorrecto. Desafortunadamente, no sé cómo deshacerme del desplazamiento del campo de entrada (al agregar caracteres al final del campo); se desplaza, porque el carácter se agrega y se muestra antes de queadjustWidthOfInput()
se llame. Y, como se dijo, no puedo hacer esto al revés porque entonces tendrás el valor del campo de entrada antes de insertar el carácter presionado. Intentaré resolver este problema más tarde.Por cierto, solo probé esto en Firefox (3.6.8), pero espero que entiendas el punto.
fuente
white-space: pre;
en css de esta manera:.tmp-element{ visibility: hidden; white-space: pre;}
. De lo contrario, los espacios en blanco se combinan y el cálculo del ancho falla.<input>
y se<span>
comporta de manera diferente con respecto al manejo<input>
de espacios en blanco , retiene espacios en blanco y<span>
combina espacios en blanco secuenciales en uno siwhite-space: pre;
no se agrega.tmp.getBoundingClientRect().width
es mejor quetmp.scrollWidth
, porque eso a veces devuelve 0.replace(/ /g, " ")
Aquí hay una modificación de la respuesta de Lyth que tiene en cuenta:
¡También permite cualquier cantidad de campos de entrada! Para verlo en acción: http://jsfiddle.net/4Qsa8/
Guión:
Estilo:
HTML:
Mostrar fragmento de código
fuente
change
oinput
sería suficienteAquí hay una solución que no necesita fuente monoespaciada , con un código de pieza muy pequeño de javascript , no necesita calcular estilos calculados e, incluso admite ime , admite textos rtl .
Use
span.text
para ajustar el ancho del texto y deje que la entrada tenga el mismo tamaño conposition: absolute
el contenedor. Copie el valor de la entradaspan
cada vez que cambie (puede cambiar este código a vainilla js fácilmente). Por lo tanto, la entrada simplemente "se ajustará" al tamaño de su contenido.fuente
PARA UNA MIRADA Y SENTIR NICER
Debe usar el evento jQuery keypress () en combinación con String.fromCharCode (e.which) para obtener el carácter presionado. Por lo tanto, puede calcular cuál será su ancho . ¿Por qué? Porque se verá mucho más sexy :)Aquí hay un jsfiddle que resulta en un comportamiento agradable en comparación con las soluciones que usan el evento keyup: http://jsfiddle.net/G4FKW/3/
A continuación se muestra un JS de vainilla que escucha el
input
evento de un<input>
elemento y establece que unspan
hermano tenga el mismo valor de texto para medirlo.fuente
span
css.Esta es una respuesta específica de Angular, pero funcionó para mí y ha sido muy satisfactoria en términos de simplicidad y facilidad de uso:
Se actualiza automáticamente a través de las unidades de personajes en la respuesta de Jani .
fuente
Aquí hay una forma alternativa de resolver esto usando un DIV y la propiedad 'contenteditable':
HTML:
CSS: (para darle al DIV algunas dimensiones y facilitar su visualización)
Nota: Si planea usar esto dentro de un elemento FORM que planea enviar, necesitará usar Javascript / jQuery para capturar el evento de envío para poder analizar el 'valor' (
.innerHTML
o.html()
respectivamente) del DIV.fuente
También puede establecer el ancho de una entrada utilizando el atributo de tamaño . El tamaño de una entrada determina su ancho en caracteres.
Una entrada podría ajustar dinámicamente su tamaño al escuchar eventos clave.
Por ejemplo
JsFiddle aquí
fuente
Podrías hacer algo como esto
fuente
Solo agregando sobre otras respuestas.
Noté que hoy en día en algunos navegadores el campo de entrada tiene un desplazamiento de ancho. Lo que significa:
Debería funcionar bien. Probado en Chrome, Firefox y Safari.
Para el soporte de eliminación, puede agregar '= 0' primero y luego reajustar.
fuente
Aquí hay un JS simple y un complemento jQuery que escribí que manejará el cambio de tamaño de un elemento de entrada usando un lienzo y el tamaño de fuente / familia para determinar la longitud real de la cadena cuando se procesa. (solo funciona en> IE9, Chrome, Safari, Firefox, Opera y la mayoría de los otros navegadores principales que han implementado el elemento Canvas).
PlainJS:
Complemento jQuery:
Nota: esto no manejará las transformaciones de texto, el espaciado entre líneas y el espaciado entre letras, y probablemente algunas otras propiedades de cambio de tamaño de texto. Para manejar el conjunto de propiedades de transformación de texto y ajustar el valor del texto para que coincida con esa propiedad. Los otros son probablemente bastante sencillos. Implementaré si esto comienza a ganar algo de tracción ...
fuente
Vale la pena señalar que se puede hacer un cambio de tamaño agradable cuando la fuente es monoespaciada, por lo que podemos cambiar el tamaño del
input
elemento perfectamente usando lach
unidad.También en este enfoque podemos actualizar el ancho del campo simplemente actualizando una variable CSS ( propiedad personalizada ) en el
input
evento y también debemos ocuparnos de la entrada ya rellenada previamente en elDOMContentLoaded
eventoMargen
CSS
Como variable raíz establecemos
--size: 0
: esta variable contendrá la longitud de la entrada y se multiplicará por1ch
dentro de lacalc()
expresión. Por defecto, también podríamos establecer un ancho mínimo, por ejemplo10ch
La parte Javascript lee la longitud del valor insertado y actualiza la variable
--size
:JS
por supuesto, esto aún funciona incluso si no usa una fuente monoespaciada, pero en ese caso deberá cambiar la
calc()
fórmula multiplicando la--size
variable por otro valor (que depende estrictamente defont-family
yfont-size
) diferente de1ch
.fuente
Esta respuesta proporciona uno de los métodos más precisos para recuperar el ancho de texto disponible en el navegador y es más precisa que la respuesta aceptada. Utiliza el elemento lienzo html5 y, a diferencia de otras respuestas, no agrega el elemento al DOM y, por lo tanto, evita cualquier problema de reflujo causado por la adición excesiva de elementos al DOM.
Lea más sobre el elemento Canvas aquí en relación con el ancho del texto.
fuente
Puede hacerlo aún más simple en angularjs utilizando la directiva incorporada ng-style .
En tu html:
En tu controlador:
En tu css:
Ajuste el ancho de char para que coincida con el ancho de su fuente. Parece ser 7 con un tamaño de letra de 12px;
fuente
Si usa Bootstrap, se podría hacer muy fácilmente:
<div contenteditable="true" class="form-control" style="display: inline"></div>
Solo tendrá que buscar el contenido de div y ponerlo en una entrada oculta antes de enviar el formulario.
fuente
Creo que estás malinterpretando la propiedad CSS de ancho mínimo . min-width se usa generalmente para definir un ancho DOM mínimo en un diseño fluido, como:
Eso establecería el elemento de entrada en un ancho mínimo de 200 píxeles. En este contexto, "px" significa "píxeles".
Ahora, si está tratando de verificar para asegurarse de que el campo de entrada contiene al menos un carácter cuando un usuario lo envía, deberá validar un formulario con JavaScript y PHP. Si eso es lo que estás intentando hacer, editaré esta respuesta y haré todo lo posible para ayudarte.
fuente
<input type="text" value="1" style="width:1px;" />
Realmente me gustó la respuesta de Lyth , pero también quería:
Adapte su JSFiddle y se me ocurrió esto . Una mejora que no está presente en este violín sería usar algo como jQuery CSS Parser para leer realmente el ancho inicial de la regla input.textbox-autosize y usarlo como minWidth. Bien, simplemente estoy usando un atributo en el, lo que lo convierte en una demostración compacta pero no es ideal. ya que requiere un atributo adicional en cada entrada. También es posible que solo desee colocar el minWidth como 100 directamente en JavaScript.
HTML:
CSS:
JavaScript:
fuente
Mejor es
onvalue
:También implica pegar, arrastrar y soltar, etc.
fuente
Aquí están mis 2 centavos. Crea un div invisible vacío. Rellenar con el contenido de entrada y devolver el ancho al campo de entrada. Haga coincidir los estilos de texto entre cada cuadro.
fuente
Bastante sencillo:
Donde N es algún número (2 en el ejemplo, 17 en algo que estoy desarrollando) que se determina experimentalmente.
Restar N evita que este extraño y extenso espacio se acumule mucho antes de que el texto llegue al final del cuadro de texto.
Comparar. Presta mucha atención a cómo cambia el tamaño incluso después del primer personaje.
fuente
oninput='this.style.width = (this.scrollWidth-2) + "px";'
poroninput='this.style.width = 0; this.style.width = this.scrollWidth + "px";'
deshacerse del espacio de acumulaciónSolo paso algún tiempo descubriendo cómo hacerlo.
En realidad, la forma más simple que encontré es mover el valor de entrada para abarcar justo antes de la entrada, manteniendo el ancho del símbolo de entrada 1. Aunque no puedo estar seguro de que se ajuste a tu necesidad inicial.
Tal vez sea un código extra, pero en la aplicación basada en react + flux es una solución bastante natural.
fuente
Basado en la respuesta de Michael, he creado mi propia versión de esto usando jQuery. Creo que es una versión más limpia / corta de la mayoría de las respuestas aquí y parece hacer el trabajo.
Estoy haciendo lo mismo que la mayoría de las personas aquí usando un espacio para escribir el texto de entrada y luego obtener el ancho. Luego estoy configurando el ancho cuando se llaman las acciones
keyup
yblur
.Aquí hay un codepen que funciona . Este codepen muestra cómo se puede usar con múltiples campos de entrada.
Estructura HTML:
jQuery:
La función anterior obtiene el valor de las entradas, recorta los espacios adicionales y establece el texto en el intervalo para obtener el ancho. Si no hay texto, obtiene el marcador de posición y lo ingresa en el intervalo. Una vez que ingresa el texto en el intervalo, establece el ancho de la entrada. El
+ 5
ancho es porque sin eso la entrada se corta un poco en el navegador Edge.Si esto pudiera mejorarse, avíseme, ya que esta es la solución más limpia que se me ocurrió.
fuente
¿Por qué no usar solo css?
@Iain Todd introdujo este código y pensé que debería compartirlo
fuente
Una forma genérica a prueba de balas tiene que:
input
elemento medido.Codepen demo
fuente
Solo puede establecer el
size
atributo. Si está utilizando uno de los marcos reactivos, lo siguiente será suficiente:pero si está utilizando js puro, debe establecer controladores de eventos, como:
fuente