31 votes

Comment puis-je appliquer une image d'arrière-plan à une entrée de texte sans perdre la bordure par défaut dans les navigateurs Firefox et WebKit?

Pour une raison que la plupart des navigateurs modernes vont cesser d'appliquer leur entrée par défaut le style de bordure de zones de texte, si vous leur donnez une image d'arrière-plan. Au lieu de cela, vous obtenez que le laid en médaillon de style. À partir de ce que je peux dire il n'y a pas de CSS façon d'appliquer le navigateur par défaut du style.

IE 8 n'ont pas ce problème. Chrome 2 et Firefox 3.5 et je suppose que les autres navigateurs aussi bien. De ce que j'ai lu en ligne, IE 7 a le même problème, mais que le post n'avez pas une solution.

Voici un exemple:

<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>

Dans Chrome 2, il ressemble à ceci: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d4ee9819-c92a-4bc2-b84e-e3a4ed6843b6

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

Mise à jour: JS Solution: je suis toujours l'espoir de trouver un pur CSS-sur-la-solution de saisie, mais voici la solution que je vais utiliser pour l'instant. Veuillez noter que ceci est collé à droite en sortant de mon application n'est donc pas un gentil, autonome exemple, comme ci-dessus. J'ai juste inclus les parties pertinentes de web app. Vous devriez être en mesure d'obtenir l'idée. Le HTML est de l'entrée avec le "lien" de la classe. La grande verticale de fond, parce que c'est un sprite. Testé dans IE6, IE7, IE8, FF2, FF3.5, Opera 9.6, Opera 10, Chrome 2, Safari 4. J'ai besoin de modifier le fond d'un couple de pixels dans certains navigateurs:

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; }

Mise à jour: CSS Assez Proche de la Solution: Basé sur la suggestion de kRON voici le CSS pour faire les entrées match FF et IE sous Vista qui fait un bon choix si vous décidez de renoncer à de pures valeurs par défaut et d'appliquer un style. J'ai modifié légèrement son et ajout de la "bleuâtre" effets:

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; }

10voto

sholsinger Points 1570

Lorsque vous modifiez la frontière ou d'arrière-plan de style sur des saisies de texte, Ils revenir à la base du mode de rendu. Des saisies de texte qui sont des os de style sont généralement des superpositions (comme flash) qui sont rendues sur le haut du document.

Je ne crois pas qu'il y est un pur CSS résoudre votre problème. La meilleure chose à faire - à mon avis - est de choisir un style que vous aimez et l'émuler avec les CSS. De sorte que, peu importe le navigateur que vous êtes dans, les entrées seront les mêmes. Vous pouvez toujours avoir des effets de survol et la comme. OS X le style des effets de brillance peut être difficile, mais je suis sûr que c'est faisable.

@Alex Morales: Votre solution est redondante. border: 0; est ignorée, au profit de la frontière: 1px solid #abadb3; et les résultats inutiles d'octets transférés sur le fil.

6voto

Filip Dupanović Points 10071

C'est le CSS que j'utilise qui peut fournir le look back par défaut:

 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;
}
 

Vous pouvez également appliquer :active et donner aux contrôles une teinte bleuâtre une fois qu'ils sont sélectionnés.

2voto

varl Points 141

Mise à jour!

Ok, voici une solution de contournement qui, je pense, est compatible avec tous les navigateurs. Le seul problème serait que le style par défaut diffère de quelques pixels de sorte que ce pourrait avoir besoin de quelques ajustements.

<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>

En utilisant absolu de positionnement relatif, vous pouvez faire le strict div (contenant l'image) loi absolue par rapport à sa mère qui tous les navigateurs je sais environ (sans compter les sous-versions IE6, IE6+ sont beaux) peut gérer. L'utilisateur mise à l'échelle peut être un problème, mais c'est la façon dont il est avec les solutions de contournement.

Sur le plan positif, vous n'avez pas à modifier les styles sur vos entrées (à l'exception de texte-tiret, mais vous feriez de toute façon je l'espère).

Sur le revers de la médaille, ce n'est pas la plus jolie solution de contournement.


Vieux!

Je sais que ce n'est pas ce que vous voulez, mais vous pourriez faire quelque chose comme cela pour au moins faire en sorte que tous les frontières cohérentes.

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

example image

Je n'ai pas essayé dans tous les navigateurs, mais puisque vous n'êtes pas à la définition de la frontière de style, il peut utiliser le natif de style, mais de taille différente (bien que vous pouvez ignorer que trop). Je pense que la clé est juste à la frontière-la couleur de quelque chose, de sorte que tous les champs de saisie, utilisez le même de la frontière de la couleur et de laisser le reste du navigateur.

0voto

Steve Teale Points 47

J'ai eu un texte d'arrière-plan de l'image, et cela a également été ennuyeux moi. Alors, j'ai mis un parent <div> tour <input> et ensuite ajouté l'image absolument placés sur <entrée>.

Alors bien sûr, j'avais besoin d'un peu plus de Javascript pour masquer l'image si elle a été cliqué, ou si l'entrée a obtenu l'accent mis par la tabulation, ou par le fait d'être cliqué sur les bords de l'image.

Avec un peu de tripoter ce l'air très bon avec IE8, Firefox, Chrome et Opera, mais c'est une horrible bidouille et ça serait sympa si les navigateurs, il fixe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X