Поместите значок внутри элемента ввода в форме

273

Как поместить значок внутри элемента ввода формы?

Снимок экрана веб-формы с тремя входами, на которых есть значки

Живая версия на тему : Приливная сила

Акиф
источник
2
@IvanSokalskiy Предполагается, что кто-то использует Bootstrap. Не каждый, кто сталкивается с этим, будет использовать Bootstrap!
Барри Майкл Дойл

Ответы:

394

Сайт, на который вы ссылаетесь, использует комбинацию трюков CSS, чтобы осуществить это. Во-первых, он использует background-image для <input>элемента. Затем, чтобы переместить курсор, он использует padding-left.

Другими словами, у них есть эти два правила CSS:

background: url(images/comment-author.gif) no-repeat scroll 7px 7px;
padding-left:30px;
Дэн Лью
источник
2
Не могли бы вы рассказать подробнее о верхнем и левом параметрах (7px 7 px) и других атрибутах? Это должно быть полезно.
QMaster
262
Совет: прекратите использовать и поддерживать IE 8.
Кодер
3
как выровнять изображение по правому краю поля ввода?
Ишанбакши
3
Проблема с фоновыми изображениями заключается в том, что автозаполнение Chrome удаляет фоновое изображение и делает фон полностью желтым
Cătălin Rădoi
1
Для выравнивания по правому краю используйте: background-position: right;
raison
52

Решения CSS, опубликованные другими, являются лучшим способом для достижения этой цели.

Если это должно вызвать у вас какие-либо проблемы (читайте IE6), вы также можете использовать ввод без полей внутри div.

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

Не такой «чистый», но должен работать на старых браузерах.

Харпо
источник
2
хорошее дополнение к этому ответу. иногда то есть дает проблемы, и это хороший способ решить одну из них. работал для меня, хотя с пролетом вместо этого.
Росс
Хороший способ добавить более сложные структуры внутри входов!
Понедельник,
@jonhue, я бы не советовал, если вы все еще живете в предыдущем десятилетии и нуждаетесь в поддержке IE6. Даже тогда я бы не назвал это "чистым".
Harpo
@harpo Как бы вы включили ссылки внутри входов тогда?
Jonhue
35

Решение без фоновых изображений:

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

Маджид Саваланпур
источник
34

Вы можете попробовать это:

input[type='text'] {
    background-image: url(images/comment-author.gif);
    background-position: 7px 7px;
    background-repeat: no-repeat;
}
Алан Хаггай Алави
источник
26

Я считаю, что это лучшее и самое чистое решение. Использование text-indent для inputэлемента

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" />
Ржавчина
источник
3
Я поддерживаю text-indent, потому что padding-left увеличит ширину поля и будет переполнен из родительского элемента.
Константин
1
почему вы вставили стиль вместо #icon css?
Уильям Джадд
@WylliamJudd Это только для демонстрации :)
Rust
почему вы использовали идентификатор вместо класса?
Маджид Саваланпур
9

Простой и легкий способ разместить Icon внутри ввода - использовать CSS-свойство position, как показано в коде ниже. Примечание: я упростил код для ясности.

  1. Создайте контейнер, окружающий вход и значок.
  2. Установите положение контейнера как относительное
  3. Установите значок как абсолютное положение. Это позволит расположить значок относительно окружающего контейнера.
  4. Используйте верхнюю, левую, нижнюю, правую стороны, чтобы разместить значок в контейнере.
  5. Установите отступ внутри ввода, чтобы текст не перекрывал значок.

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

Райан Форте
источник
1
Чисто и просто, да. Вы также должны удалить входную границу с помощью input { border: none; }и добавить границу, чтобы #input-container { border: 1px solid #000; }она выглядела так, как будто изображение находится внутри и фактически является частью ввода.
Марио Вернер
1
@MarioWerner он вставил изображение в поле ввода, не нужно делать взломы границ, в этом вся прелесть. Я собираюсь использовать эту идею.
Дурак
8
.icon{
background: url(1.jpg) no-repeat;
padding-left:25px;
}

Добавьте вышеупомянутые теги в свой CSS-файл и используйте указанный класс.

Рафи Хайдари
источник
6

Это работает для меня:

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
источник
изображение исчезает при автозаполнении на Chrome
Нептун
Как сделать изображение кликабельным, например, при использовании значка «Сохранить»?
user460114
У меня это работало для моего гибридного приложения, я просто сделал целое поле ввода кликабельным после вставки изображения.
Шивам Шривастава
5

Вы можете попробовать это: 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
источник
4

Просто используйте свойство background в вашем CSS.

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

#foo
{
    background: url(/img/foo.png);
}
Дэн Уокер
источник
4

У меня была такая ситуация. Это не сработало из-за background: #ebebeb;. Я хотел поместить фон в поле ввода, и это свойство постоянно отображалось в верхней части фонового изображения, и я не мог видеть изображение! Таким образом, я переместил backgroundсобственность, чтобы быть выше background-imageсобственности, и это работало.

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

Решение для моего случая было:

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

Просто говоря, border, paddingи text-alignсвойства не важны для решения. Я просто скопировал свой оригинальный код.

fantja
источник
1
Это очень старое, и я надеюсь, что, возможно, вы узнали более года назад, но backgroundэто сокращенное имя свойства, которое вы используете для одновременного покрытия всех свойств фона: background: [color] [image url] [repeat] [position]и именно поэтому ваш цвет перезаписывает все. Вы также можете оставить его на месте и переименовать собственность вbackground-color
borbulon
@borbulon да, ты прав. почти всегда лучше использовать сокращенное имя свойства, полностью согласен с этим. Но цель этого поста состоит в том, чтобы указать, что порядок свойств иногда имеет значение, и эти «маленькие» правила CSS могут сильно расстраивать, особенно для новичков в разработке.
Фанта
1
Полностью согласен, но точка зрения остается неизменной: backgroundэто сокращенное имя свойства. Лучшим решением было бы не использовать сокращение, а использовать background-colorсвойство color (при условии, что вы хотите и цвет, и изображение).
борбулон
3

Использование с font-icon

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

ИЛИ

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

#foo::before
{
  font-family: 'FontAwesome';
  color:red;
  position: relative;
  left: -5px;
  content: "\f007";    
}
Али Гексель Бекташ
источник
7
Кажется, что :: before не может быть применен к элементу input.
Вишня
2

используйте этот класс CSS для ввода в начале, затем настройте соответственно:

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

csandreas1
источник
Вы знаете, как установить событие клика только для этого изображения.?
Арджун
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>

Например, вы можете использовать это: метка со скрытым вводом (значок присутствует).

yazabara
источник
0

Это работает для меня для более или менее стандартных форм:

  <button type="submit" value="Submit" name="ButtonType" id="whateveristheId" class="button-class">Submit<img src="/img/selectedImage.png" alt=""></button>
Ян Д
источник