Placer l'icône à l'intérieur de l'élément d'entrée dans un formulaire

273

Comment placer une icône à l'intérieur de l'élément d'entrée d'un formulaire?

Capture d'écran d'un formulaire Web avec trois entrées contenant des icônes

Version en direct sur: Thème Tidal Force

akif
la source
2
@IvanSokalskiy Cela suppose que quelqu'un utilise Bootstrap. Tous ceux qui rencontrent cela n'utiliseront pas Bootstrap!
Barry Michael Doyle

Réponses:

394

Le site que vous avez lié utilise une combinaison d'astuces CSS pour y parvenir. Tout d'abord, il utilise une image d'arrière-plan pour l' <input>élément. Ensuite, pour pousser le curseur dessus, il utilise padding-left.

En d'autres termes, ils ont ces deux règles CSS:

background: url(images/comment-author.gif) no-repeat scroll 7px 7px;
padding-left:30px;
Dan Lew
la source
2
Pourriez-vous décrire plus en détail les paramètres supérieurs et gauches (7 px 7 px) et d'autres attributs? Cela doit être utile.
QMaster
262
Conseil: arrêtez d'utiliser et de supporter IE 8.
un codeur
3
comment puis-je aligner l'image à l'extrémité droite du champ de saisie?
ishanbakshi
3
Le problème avec les images de fond est que le remplissage automatique de Chrome supprime l'image de fond et rend le fond complètement jaune
Cătălin Rădoi
1
Pour aligner à droite, utilisez: background-position: right;
raison
52

Les solutions CSS publiées par d'autres sont le meilleur moyen d'y parvenir.

Si cela vous pose des problèmes (lire IE6), vous pouvez également utiliser une entrée sans bordure à l'intérieur d'un div.

<div style="border: 1px solid #DDD;">
    <img src="icon.png"/>
    <input style="border: none;"/>
</div>

Pas aussi "propre", mais devrait fonctionner sur les anciens navigateurs.

harpo
la source
2
un bon ajout à cette réponse. parfois c'est-à-dire pose des problèmes et c'est un bon moyen de résoudre l'un d'entre eux. travaillé pour moi bien qu'avec une envergure à la place.
Ross
Belle façon d'ajouter des structures plus complexes à l'intérieur des entrées!
jonhue
@jonhue, je ne recommanderais pas cela à moins que vous ne viviez encore dans la décennie précédente et que vous ayez besoin de prendre en charge IE6. Même alors, je n'appellerais pas ça "propre".
harpo
@harpo Comment incluriez-vous alors les liens dans les entrées?
jonhue
35

Une solution sans images d'arrière-plan:

#input_container {
    position:relative;
    padding:0 0 0 20px;
    margin:0 20px;
    background:#ddd;
    direction: rtl;
    width: 200px;
}
#input {
    height:20px;
    margin:0;
    padding-right: 30px;
    width: 100%;
}
#input_img {
    position:absolute;
    bottom:2px;
    right:5px;
    width:24px;
    height:24px;
}
<div id="input_container">
    <input type="text" id="input" value>
    <img src="https://cdn4.iconfinder.com/data/icons/36-slim-icons/87/calender.png" id="input_img">
</div>

majid savalanpour
la source
34

Vous pouvez essayer ceci:

input[type='text'] {
    background-image: url(images/comment-author.gif);
    background-position: 7px 7px;
    background-repeat: no-repeat;
}
Alan Haggai Alavi
la source
26

Je trouve que c'est la solution la meilleure et la plus propre. Utilisation du retrait de texte sur l' inputélément

CSS:

#icon{
background-image:url(../images/icons/dollar.png); 
background-repeat: no-repeat; 
background-position: 2px 3px;
}

HTML:

<input id="icon" style="text-indent:17px;" type="text" placeholder="Username" />
Rouille
la source
3
Je soutiens le retrait de texte car padding-left augmentera la largeur du champ et débordera de l'élément parent.
Kostiantyn
1
pourquoi avez-vous mis le style en ligne plutôt que dans le #icon css?
Wylliam Judd
@WylliamJudd C'est juste à des fins de démonstration :)
Rust
pourquoi avez-vous utilisé id au lieu de class?
majid savalanpour
9

Un moyen simple et facile de positionner une icône à l'intérieur d'une entrée consiste à utiliser la propriété CSS position comme indiqué dans le code ci-dessous. Remarque: J'ai simplifié le code à des fins de clarté.

  1. Créez le conteneur entourant l'entrée et l'icône.
  2. Définir la position du conteneur comme relative
  3. Définissez l'icône comme position absolue. Cela positionnera l'icône par rapport au conteneur environnant.
  4. Utilisez en haut, à gauche, en bas, à droite pour positionner l'icône dans le conteneur.
  5. Définissez le remplissage à l'intérieur de l'entrée afin que le texte ne chevauche pas l'icône.

#input-container {
  position: relative;
}

#input-container > img {
  position: absolute;
  top: 12px;
  left: 15px;
}

#input-container > input {
  padding-left: 40px;
}
<div id="input-container">
  <img/>
  <input/>
</div>

Ryan Forte
la source
1
Propre et simple, oui. Vous devez également supprimer la bordure d'entrée avec input { border: none; }et ajouter la bordure pour #input-container { border: 1px solid #000; }lui donner l'impression que l'image est à l'intérieur et fait réellement partie de l'entrée.
Mario Werner
1
@MarioWerner, il a poussé l'image à l'intérieur de l'entrée, pas besoin de faire des hacks de bordure, c'est la beauté. Je vais utiliser l'idée.
The Fool
8
.icon{
background: url(1.jpg) no-repeat;
padding-left:25px;
}

ajoutez les balises ci-dessus dans votre fichier CSS et utilisez la classe spécifiée.

Rafi Haidari
la source
6

Cela fonctionne pour moi:

input.valid {
   border-color: #28a745;
   padding-right: 30px;
   background-image: url('https://www.stephenwadechryslerdodgejeep.com/wp-content/plugins/pm-motors-plugin/modules/vehicle_save/images/check.png');
   background-repeat: no-repeat;
   background-size: 20px 20px;
   background-position: right center;
}
<form>
<label for="name">Name</label>
<input class="valid" type="text" name="name" />
</form>

Gxzzin
la source
l'image disparaît lors de la saisie semi-automatique sur chrome
neptune
Comment rendre l'image cliquable, par exemple si vous utilisez une icône "enregistrer"?
user460114
Cela a fonctionné pour moi pour mon application hybride, je viens de rendre la zone de saisie entière cliquable après l'insertion de l'image.
shivam srivastava
5

Vous pouvez essayer ceci: Bootstrap-4 Beta
https://www.codeply.com/go/W25zyByhec

<div class="container">
            <form>
                <div class="row">
                    <div class="input-group mb-3 col-sm-6">
                      <input type="text" class="form-control border-right-0" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1">
                        <div class="input-group-prepend bg-white">
                            <span class="input-group-text border-left-0 rounded-right bg-white" id="basic-addon1"><i class="fas fa-search"></i></span>
                        </div>
                    </div>
                </div>
            </form>
        </div>





Hasan
la source
4

Utilisez simplement la propriété background dans votre CSS.

<input id="foo" type="text" />

#foo
{
    background: url(/img/foo.png);
}
Dan Walker
la source
4

J'avais une situation comme ça. Cela n'a pas fonctionné à cause de background: #ebebeb;. Je voulais mettre un arrière-plan sur le champ de saisie et cette propriété apparaissait constamment en haut de l'image d'arrière-plan, et je ne pouvais pas voir l'image! J'ai donc déplacé la backgroundpropriété au-dessus de la background-imagepropriété et cela a fonctionné.

input[type='text'] {
    border: 0;
    background-image: url('../img/search.png');
    background-position: 9px 20px;
    background-repeat: no-repeat;
    text-align: center;
    padding: 14px;
    background: #ebebeb;
}

La solution pour mon cas était:

input[type='text'] {
    border: 0;
    background: #ebebeb;
    background-image: url('../img/search.png');
    background-position: 9px 20px;
    background-repeat: no-repeat;
    text-align: center;
    padding: 14px;
}

Il suffit de mentionner, border, paddinget les text-alignpropriétés ne sont pas importantes pour la solution. Je viens de répliquer mon code d'origine.

fantja
la source
1
C'est super ancien et j'espère que vous avez peut-être appris depuis plus d'un an, mais backgroundc'est un nom de propriété raccourci que vous utilisez pour couvrir toutes les propriétés d'arrière-plan à la fois:, background: [color] [image url] [repeat] [position]et c'est pourquoi votre couleur écrasait tout. Vous auriez aussi pu le laisser en place et renommer la propriété enbackground-color
borbulon
@borbulon oui vous avez raison. il est presque toujours préférable d'utiliser un nom de propriété raccourci, vous êtes totalement d'accord avec cela. Mais le but de cet article est de souligner que l'ordre des propriétés est parfois important, et ces «petites» règles CSS peuvent être très frustrantes, en particulier pour les nouveaux arrivants en développement.
fantja
1
Tout à fait d'accord, mais le point demeure: backgroundc'est un nom de propriété raccourci. Une meilleure solution aurait été de ne pas utiliser le raccourci, mais d'utiliser background-colorla propriété color (en supposant que vous vouliez à la fois une couleur et une image).
borbulon
3

Utilisation avec font-icon

<input name="foo" type="text" placeholder="&#61447;">

OU

<input id="foo" type="text" />

#foo::before
{
  font-family: 'FontAwesome';
  color:red;
  position: relative;
  left: -5px;
  content: "\f007";    
}
Ali Göksel Bektaş
la source
7
Semble que :: before ne peut pas être appliqué à l'élément d'entrée.
Vishnja
2

utilisez cette classe css pour votre entrée au début, puis personnalisez-la en conséquence:

    
 .inp-icon{
background: url(https://i.imgur.com/kSROoEB.png)no-repeat 100%;
background-size: 16px;
 }
<input class="inp-icon" type="text">

csandreas1
la source
savez-vous comment définir l'événement de clic uniquement pour cette image.?
Arjun
1
 <label for="fileEdit">
    <i class="fa fa-cloud-upload">
    </i>
    <input id="fileEdit" class="hidden" type="file" name="addImg" ng-file-change="onImageChange( $files )" ng-multiple="false" accept="{{ contentType }}"/>
  </label>

Par exemple, vous pouvez utiliser ceci: étiquette avec entrée cachée (l'icône est présente).

yazabara
la source
0

Cela fonctionne pour moi pour des formulaires plus ou moins standard:

  <button type="submit" value="Submit" name="ButtonType" id="whateveristheId" class="button-class">Submit<img src="/img/selectedImage.png" alt=""></button>
Yan D
la source