2011-07-08 27 views
14

Tengo un formulario de inicio de sesión diseñado para que los cuadros de texto y el botón enviar se extiendan al 100% del tamaño del contenedor. Esto es para una distribución móvil fluida, pero mi ejemplo de jsbin a continuación tiene un tamaño de contenedor fijo para demostración.ancho del 100% en el tipo de entrada enviar frente al texto del tipo de entrada

http://jsbin.com/ozutoq/9

En IE7, IE8, FF 4, Safari - todas rinden el botón un poco más corto que los de texto presente. La herramienta de diseño de Firebug muestra los cuadros de texto a 500px de ancho, pero el botón de enviar a 498px de ancho. En mi ejemplo real, el botón de enviar es 6px más delgado. ¿Cómo puedo solucionar esto, así que ocupa todo el ancho?

actualización

lo hice otra prueba mediante el establecimiento de un ancho fijo en las entradas. Parece que el botón Enviar no sigue el modelo de caja. Usé un ancho de 100 píxeles, y mostró 98 píxeles + 2 píxeles para los bordes, mientras que los cuadros de texto mostraron 100 píxeles de ancho + 2 píxeles para las fronteras.

Entonces, supongo que la pregunta es ¿cómo puedo manejar esto en un diseño fluido? -1px relleno derecho e izquierdo en los botones no parece funcionar, ¡y el diseño requiere un borde de 1px en el botón! ¿Tendré que recurrir a js?

+0

Puede haber habido un relleno o margen en alguna parte. Intenta dar '{padding: 0px; margin: 0px};' – Balanivash

+0

El ejemplo jsbin establece el margen y el relleno en 0 – ScottE

+0

Interesante. Cuando miré tu código con la vista previa en tiempo real de jsbin, parece estar bien. Pero parece incorrecto cuando solo se usa la función de representación –

Respuesta

27

Por alguna razón Mozilla establece las entradas de texto tipo de -moz-box-sizing:content-box; pero el botón de enviar se establece en -moz-box-sizing:border-box;

Ajuste de la siguiente le dará la prestación prevista en FF.

.login-tb { 
    border:1px solid red; 
    -moz-box-sizing:border-box; 
    -webkit-box-sizing:border-box; 
    box-sizing:border-box; 
    margin: 0; 
    padding: 0; 
    width:100%; 
} 

Actualización: el apoyo Agregado Safari y IE8 +

+1

+1 Estaba a punto de publicar lo mismo. La razón por la cual todo esto es un desastre es que nunca se definió qué modelo debería seguir el navegador cuando se procesaban las entradas, de modo que algunos seguían usando lo que se usaba años atrás cuando las entradas de formularios aún estaban vendadas y cada vendedor acababa de usar su propio razonamiento para tratar con eso. El desastre todavía está por aquí hoy, pero afortunadamente tenemos CSS mejorando en esto. Sin embargo, IE seguirá cayendo de esto. – easwee

+0

Interesante. Esto existe en css3, pero eso no va a ayudar para ScottE

+0

IE8 parece ser compatible con el equivalente css3, siempre que no esté en modo peculiar. – ScottE

0

De hecho, es bastante raro. Creo que el borde de 1px se agrega al exterior de las entradas de texto, por lo que tiene 500 píxeles de ancho.

Si bien en el botón Enviar se calcula el botón en los lados, pero muestra en el interior, por lo que obtener 500px - 1px - 1px = 498px de ancho ...

Una posible solución que se puede hacer es simplemente crear el siguiente CSS:

.login-tb { 
    border: 1px solid red; 
    margin: 0; 
    padding: 0; 
    width: 500px; 
} 

#login-tb { 
    border: 1px solid red; 
    margin: 0; 
    padding: 0; 
    width: 502px; 
} 

Eso soluciona el problema y todavía muestra su botón de enviar como 500px de ancho en Firebug. Y como su formulario se establece en 500 píxeles de ancho de todos modos y esto no cambia, no es de mucha utilidad implementar un ancho establecido en un porcentaje.

+0

El problema es que estoy tratando con un diseño fluido: no puedo usar un ancho fijo para las entradas. – ScottE

3

Creo que es la forma en que el navegador calcula las dimensiones de entrada [type = submit]. Traté de aplicar algunos reinicios pero tampoco parecían funcionar. Estoy en una Macbook Air con Chrome y en su ejemplo de JSBin, la vista previa en tiempo real se veía bien, pero el "Render" validó su problema.

Intenté jsfiddle.net y mostró el mismo problema. Aquí hay una solución si esto volará para su aplicación.Basta con quitar el borde y el fondo del botón de enviar y estilo del div contenedor en su lugar, a continuación, poner un detector de clics en el div para enviar el formulario:

CSS:

form { 
    width: 500px; 
    padding:0; 
    margin:0; 
} 
form div, form div input { 
    height:20px; 
    margin-bottom:4px; 
} 
input[type=text] { 
    width: 100%; 
    border: 1px solid red; 
    padding: 0; 
    margin: 0; 
} 
#submit input{ 
    background:transparent; 
    margin:auto; 
    border:none; 
} 
#submit{ 
    text-align:center; 
    background-color:#CCC; 
    width: 100%; 
    border: 1px solid red; 
    padding: 0; 
    margin: 0; 
    cursor:pointer; 
} 

JQUERY:

$('#submit').click(function(){ 
    $('#login').submit(); 
}); 

$('#login').submit(function(){ 
    alert('form submitted'); 
    return false; 
}); 

http://jsfiddle.net/pZcx4/

ALTERNATIVOS JS orígenes:

function submit_form() 
{ 
    alert('form submitted'); 
    return false; 

    // when you are ready, do this: document.forms['login'].submit(); 
} 


document.getElementById('submit').addEventListener('click',submit_form,false); 

http://jsfiddle.net/pZcx4/3/

+0

Lamentablemente, no podré usar la biblioteca jquery. Además, el botón de enviar tiene esquinas redondeadas (css3), lo que complicaba las cosas. – ScottE

+0

Puede aplicar las esquinas redondeadas al envoltorio div fácilmente. ¿Qué biblioteca estás usando para JS? – AlienWebguy

+0

No estamos usando una biblioteca js. Es para una aplicación móvil. jquery mobile ya fue rechazado por el cliente. Son, como es habitual en un cliente bancario, preocupados por la seguridad. Tratamos de educar, pero no tiene sentido discutir. – ScottE

0

No estoy seguro de que esto funcionará para su entorno. Cuando jugaba con el jsbin, el ajuste de la width trabajaron ...

.login-tb { width: 99.75%; border: 1px solid red; padding: 0; margin: 0; }

probado sólo en Chrome.

+0

No, no funcionará. Es fluido, por lo que el contenedor tendrá un ancho desconocido. – ScottE

+0

Me funcionó cuando reinicié el 'ancho' de' 500px' a '100%' en su jsbin antes de publicar. –

Cuestiones relacionadas