2009-07-08 6 views
31

Por algún motivo, la mayoría de los navegadores modernos dejarán de aplicar su estilo de borde de entrada predeterminado a los cuadros de texto si les proporciona una imagen de fondo. En cambio, obtienes ese estilo de inserción feo. Por lo que puedo decir, tampoco hay una forma de CSS para aplicar el estilo de navegador predeterminado.¿Cómo puedo aplicar una imagen de fondo a una entrada de texto sin perder el borde predeterminado en los navegadores Firefox y WebKit?

IE 8 no tiene este problema. Chrome 2 y Firefox 3.5 lo hacen y asumo otros navegadores también. Por lo que he leído en línea, IE 7 tiene el mismo problema, pero esa publicación no tenía solución.

He aquí un ejemplo:

<html> 
<head> 
    <style> 
    .pictureInput { 
     background-image: url(http://storage.conduit.com/images/searchengines/search_icon.gif); 
     background-position: 0 1px; 
     background-repeat: no-repeat; 
    } 
    </style> 
<body> 
    <input type="text" class="pictureInput" /> 
    <br /> 
    <br /> 
    <input type="text"> 
</body> 
</html> 

En Chrome 2 se parece a esto: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d4ee9819-c92a-4bc2-b84e-e3a4ed6843b6

Y en Firefox 3.5: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc

Actualización: JS Solución: Todavía estoy esperando para encontrar una solución pura de CSS en la entrada, pero esta es la solución que usaré por ahora. Tenga en cuenta que esto está pegado directamente de mi aplicación, por lo que no es un buen ejemplo independiente como el anterior. Acabo de incluir las partes relevantes de mi gran aplicación web. Deberías ser capaz de entender la idea. El HTML es la entrada con la clase "enlace". La gran posición de fondo vertical se debe a que es un sprite. Probado en IE6, IE7, IE8, FF2, FF3.5, Opera 9.6, Opera 10, Chrome 2, Safari 4. Necesito ajustar la posición de fondo un par de píxeles en algunos navegadores aún:

JS:

$$('input.link').each(function(el) { 
    new Element('span',{'class':'linkIcon'}).setText(' ').injectBefore(el); 
    if (window.gecko) el.setStyle('padding', '2px 2px 2px 19px'); 
}); 

CSS:

input.link { padding-left: 19px; } 
span.linkIcon { z-index: 2; width: 19px; height: 19px; position: absolute; background-image: url(img/fields.gif); background-position: 1px -179px; background-repeat: no-repeat; } 

actualización: CSS bastante cercano Solución: sobre la base de la sugerencia de Kron aquí está la CSS para hacer las entradas coinciden con FF y el IE en Vista que hace una buena elección si decide renunciar a los valores predeterminados puros y aplicar un estilo. He modificado ligeramente y se suman los efectos "azulado":

CSS:

input[type=text], select, textarea { 
    border-top: 1px #acaeb4 solid; 
    border-left: 1px #dde1e7 solid; 
    border-right: 1px #dde1e7 solid; 
    border-bottom: 1px #e3e9ef solid; 
    -moz-border-radius: 2px; 
    -webkit-border-radius: 2px; 
    padding: 2px; 
} 
input[type=text]:hover, select:hover, textarea:hover, input[type=text]:focus, select:focus, textarea:focus { 
    border-top: 1px #5794bf solid; 
    border-left: 1px #c5daed solid; 
    border-right: 1px #b7d5ea solid; 
    border-bottom: 1px #c7e2f1 solid; 
} 
select { border: 1px; } 
+0

Oye, prueba esto. Es un poco hackish pero parece funcionar para mí. frontera: 0; borde: 1px sólido # abadb3; El 'borde: 0' eliminará el borde predeterminado en la entrada, y la siguiente regla será que se vea de la manera que desee. –

+0

Lo siento, no estaba claro. Eso funcionaría si simplemente quisiera que tuviera un borde sólido, pero lo que quiero es que se vea como lo hace en los navegadores cuando no hay estilo. Quiero el estilo de borde predeterminado nativo. Por ejemplo, vea el estilo en Firefox: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc –

+0

Mi respuesta no es redundante. El borde: 0 borra el estilo de borde en la entrada. El siguiente estilo aplica el nuevo estilo a la entrada. Al igual que en las hojas de estilos en cascada;) –

Respuesta

10

Cuando cambia el estilo de borde o fondo en las entradas de texto. Vuelven al modo de renderizado muy básico. Las entradas de texto que tienen el estilo del sistema operativo suelen ser superposiciones (como flash) que se representan en la parte superior del documento.

No creo que haya una solución de CSS pura para su problema. Lo mejor que puede hacer, en mi opinión, es elegir un estilo que le guste y emularlo con CSS. Para que no importa en qué navegador se encuentre, las entradas se verán igual. Aún puede tener efectos de desplazamiento y similares. Los efectos de brillo del estilo OS X pueden ser engañosos, pero estoy seguro de que es factible.

@ Alex Morales: Su solución es redundante. frontera: 0; se ignora a favor del borde: 1px solid # abadb3; y da como resultado bytes innecesarios transferidos a través del cable.

2

actualización!

Bien, aquí hay una solución que creo que es compatible con varios navegadores. El único problema sería que el estilo predeterminado difiere en unos pocos píxeles, por lo que podría necesitar algunos ajustes.

<html> 
    <head> 
     <style> 
      .pictureInput { 
       text-indent: 20px; 
      } 
      .input-wrapper { 
       position:relative; 
      } 
      .img-wrapper { 
       position:absolute; 
       top:2px; 
       left:2px; 
      } 
     </style> 
    </head> 
    <body> 
     <div class="input-wrapper"> 
      <div class="img-wrapper"><img src="http://storage.conduit.com/images/searchengines/search_icon.gif" alt="asddasd" /></div> 
      <input type="text" class="pictureInput" /> 
     </div> 
     <br /> 
     <br /> 
     <input type="text"> 
    </body> 
</html>  

Mediante el uso de posicionamiento absoluto-relativo puede hacer que el div absoluta (que contiene la imagen) actuar absoluta en relación con su padre que todos los navegadores que conozco (sin contar las versiones sub-IE6, IE6 + están bien) puede encargarse de. La escala del usuario puede ser un problema, pero así es con las soluciones.

Por el lado positivo, no tiene que cambiar los estilos en sus entradas en absoluto (a excepción de texto, pero lo haría de todos modos, espero).

En el lado negativo, no es la solución más bonita.


¡Viejo!

Sé que esto no es lo que quiere, pero podría hacer algo como esto para al menos hacer todos los bordes de entrada consistentes.

input { 
    border-color:#aaa; 
    border-width:1px; 
} 

example image http://i26.tinypic.com/282eul1.png

Yo no lo he probado en todos los navegadores, pero ya no está configurando el estilo de borde que puede ser que utilice el estilo nativo pero con otro tamaño (aunque puede omitir que también) Creo que la clave es establecer el color del borde en algo para que todos los campos de entrada utilicen el mismo color de borde y dejar el resto al navegador.

+0

Eso lo hace ver más cerca, pero no es lo mismo. Y no es solo el aspecto estático. El estilo de entrada predeterminado en Firefox obtiene un efecto de desplazamiento y enfoque.En Chrome, el efecto de enfoque siempre se aplica, incluso en el borde modificado del que estamos hablando, porque el efecto parece estar alrededor del borde (¿contorno?) En lugar de cambiar el borde. –

+0

Espero que alguien venga con soluciones más elegantes, porque las mías son bastante toscas. Actualicé mi primera solución con otra, aunque en realidad no es una solución, sino más bien una solución alternativa. – varl

+0

Gracias por la sugerencia. Aunque todavía espero que esta pregunta de desbordamiento de pila conduzca a una solución completa, puedo usar su sugerencia para acercarme. Excepto por IE8. Es el único navegador que probé que no se vio afectado por este error, pero luego tu idea, que mejora Chrome y Firefox, hace que IE8 se rompa y también pierda el estilo y el efecto de desplazamiento. –

6

Este es el CSS que yo uso que puede proporcionar el valor por defecto mirar hacia atrás:

input, select, textarea { 
    border-top: 1px #acaeb4 solid; 
    border-left: 1px #dde1e7 solid; 
    border-right: 1px #dde1e7 solid; 
    border-bottom: 2px #f1f4f7 solid; 
    -moz-border-radius: 2px; 
    -webkit-border-radius: 2px; 
} 

También podría aplicarse :active y dar a los controles que azulado tono una vez que se seleccionaron.

+0

Útil, gracias! –

+0

Eso se ve muy bien en IE, Firefox y Safari en Vista. Chrome y Opera tienen diferentes valores predeterminados, al igual que otros sistemas operativos. Pero, su sugerencia es la que usaré si decido rendirme y aplicar un estilo. Entonces, aunque esto técnicamente no responde a la pregunta, muchas gracias por compartir. –

+0

np;)! Si puede analizar el parámetro de usuario-agente desde el encabezado de la solicitud, podría hacer referencia de manera condicional a CSS que contenga declaraciones específicas del navegador. Cada uno tendría su propia 'entrada, selección, área de texto {}' donde podría emular el aspecto * deafult *. Hacer las cosas bien a menudo requiere mucho trabajo :)! –

0

Tenía una imagen de fondo de texto, y esto también me molestaba. Así que puse un pariente <div> alrededor de la entrada < > y luego agregué la imagen posicionada completamente sobre la entrada < >.

Luego, por supuesto, necesitaba un poco más de Javascript para ocultar la imagen si se hacía clic, o si la entrada obtenía el foco mediante tabulación o haciendo clic en los bordes de la imagen.

Con un poco de toqueteo esto se veía bastante bien con IE8, Firefox, Chrome y Opera, pero es un error horrible y sería bueno si los navegadores lo arreglaran.

Cuestiones relacionadas