Đặt biểu tượng bên trong phần tử đầu vào trong một biểu mẫu


272

Làm cách nào để đặt biểu tượng bên trong phần tử nhập của biểu mẫu?

Ảnh chụp màn hình của một biểu mẫu web có ba đầu vào có biểu tượng trong đó

Phiên bản trực tiếp tại: chủ đề Tidal Force


2
@IvanSokalskiy Giả sử ai đó đang sử dụng Bootstrap. Không phải ai đi ngang qua cũng sẽ sử dụng Bootstrap!
Barry Michael Doyle

Câu trả lời:


392

Trang web bạn liên kết sử dụng kết hợp các thủ thuật CSS để thực hiện điều này. Đầu tiên, nó sử dụng một hình ảnh nền cho <input>phần tử. Sau đó, để đẩy con trỏ qua, nó sử dụng padding-left.

Nói cách khác, họ có hai quy tắc CSS này:

background: url(images/comment-author.gif) no-repeat scroll 7px 7px;
padding-left:30px;

2
Bạn có thể vui lòng mô tả thêm về các tham số trên cùng và bên trái (7px 7 px) và các thuộc tính khác không? Đó là phải hữu ích.
QMaster

262
Lời khuyên: ngừng sử dụng và hỗ trợ IE 8.
một lập trình viên

3
Làm thế nào tôi có thể căn chỉnh hình ảnh vào cuối bên phải của trường đầu vào?
ishanbakshi

3
Vấn đề với hình ảnh nền là tính năng tự động điền của Chrome sẽ xóa hình nền và làm cho nền hoàn toàn màu vàng
Cătălin Rădoi

1
Để căn chỉnh để sử dụng đúng: nền-vị trí: phải;
raison

52

Các giải pháp CSS được đăng bởi những người khác là cách tốt nhất để thực hiện điều này.

Nếu điều đó sẽ cung cấp cho bạn bất kỳ vấn đề nào (đọc IE6), bạn cũng có thể sử dụng đầu vào không biên giới bên trong div.

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

Không phải là "sạch", nhưng nên hoạt động trên các trình duyệt cũ hơn.


2
một bổ sung tốt cho câu trả lời này. đôi khi tức là đưa ra vấn đề và đây là một cách tốt để giải quyết một trong số chúng. làm việc cho tôi mặc dù với một nhịp thay thế.
Ross

Cách tốt đẹp để thêm các cấu trúc phức tạp hơn bên trong đầu vào!
tham gia

@jonhue, tôi sẽ không khuyến nghị điều này trừ khi bạn vẫn còn sống trong thập kỷ trước và cần hỗ trợ IE6. Thậm chí sau đó, tôi sẽ không gọi nó là "sạch".
harpo

@harpo Làm thế nào bạn sẽ bao gồm các liên kết bên trong đầu vào sau đó?
tham gia

35

Một giải pháp không có ảnh nền:

#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

Bạn có thể thử điều này:

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

26

Tôi thấy đây là giải pháp tốt nhất và sạch nhất cho nó. Sử dụng văn bản thụt vào inputphần tử

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
Tôi đang hỗ trợ thụt lề văn bản vì phần đệm bên trái sẽ tăng chiều rộng của trường và nó sẽ tràn ra khỏi phần tử cha.
Kostiantyn

1
Tại sao bạn đặt kiểu nội tuyến thay vì trong #icon css?
Wylliam Judd

@WylliamJudd Đó chỉ là mục đích trình diễn :)
Rust

Tại sao bạn sử dụng id thay vì lớp?
savalanpour hùng vĩ

9

Cách đơn giản và dễ dàng để định vị Biểu tượng bên trong đầu vào là sử dụng thuộc tính CSS vị trí như được hiển thị trong mã bên dưới. Lưu ý: Tôi đã đơn giản hóa mã cho mục đích rõ ràng.

  1. Tạo các thùng chứa xung quanh đầu vào và biểu tượng.
  2. Đặt vị trí thùng chứa là tương đối
  3. Đặt biểu tượng là vị trí tuyệt đối. Điều này sẽ định vị biểu tượng liên quan đến container xung quanh.
  4. Sử dụng một trong hai bên trên, bên trái, dưới cùng, bên phải để định vị biểu tượng trong thùng chứa.
  5. Đặt phần đệm bên trong đầu vào để văn bản không chồng lên biểu tượng.

#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
Sạch sẽ và đơn giản, vâng. Bạn cũng nên xóa đường viền đầu vào input { border: none; }và thêm đường viền #input-container { border: 1px solid #000; }để làm cho nó trông giống như hình ảnh bên trong và thực sự là một phần của đầu vào.
Mario Werner

1
@MarioWerner anh ấy đã đẩy hình ảnh vào bên trong đầu vào, không cần phải hack, đó là vẻ đẹp. Tôi sẽ sử dụng ý tưởng.
The Fool

8
.icon{
background: url(1.jpg) no-repeat;
padding-left:25px;
}

thêm các thẻ ở trên vào tệp CSS của bạn và sử dụng lớp được chỉ định.


6

Điều này làm việc cho tôi:

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>


hình ảnh biến mất khi tự động hoàn tất trên chrome
neptune

Làm thế nào để bạn làm cho hình ảnh có thể nhấp, ví dụ: nếu sử dụng biểu tượng "lưu"?
dùng460114

Nó hoạt động với tôi cho ứng dụng lai của tôi, tôi chỉ cần làm cho toàn bộ hộp đầu vào có thể nhấp được sau khi chèn hình ảnh.
shivam srivastava

5

Bạn có thể thử điều này: 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>






4

Chỉ cần sử dụng thuộc tính nền trong CSS của bạn.

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

#foo
{
    background: url(/img/foo.png);
}

4

Tôi đã có tình huống như thế này. Nó không hoạt động vì background: #ebebeb;. Tôi muốn đặt nền trên trường đầu vào và thuộc tính đó liên tục hiển thị trên đỉnh của hình nền và tôi không thể nhìn thấy hình ảnh! Vì vậy, tôi đã chuyển backgroundtài sản lên trên background-imagetài sản và nó đã hoạt động.

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

Giải pháp cho trường hợp của tôi là:

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

Chỉ cần đề cập đến, border, paddingtext-alignthuộc tính không quan trọng cho các giải pháp. Tôi chỉ sao chép mã gốc của tôi.


1
Điều này đã quá cũ và tôi hy vọng có thể bạn đã học được từ hơn một năm trước, nhưng backgroundlà một tên thuộc tính tốc ký mà bạn sử dụng để bao gồm tất cả các thuộc tính nền cùng một lúc: background: [color] [image url] [repeat] [position]và đó là lý do tại sao màu của bạn ghi đè lên mọi thứ. Bạn cũng có thể để nó tại chỗ và đổi tên tài sản thànhbackground-color
borbulon

@borbulon vâng bạn đúng. Hầu như luôn luôn tốt nhất để sử dụng tên thuộc tính tốc ký, hoàn toàn đồng ý về điều đó. Nhưng mục đích của bài đăng này là để chỉ ra rằng thứ tự các thuộc tính đôi khi có vấn đề và các quy tắc CSS 'nhỏ' đó có thể gây khó chịu rất nhiều, đặc biệt là cho những người mới phát triển.
fantja

1
Hoàn toàn đồng ý, nhưng quan điểm vẫn đứng: backgroundlà một tên tài sản tốc ký. Một sửa chữa tốt hơn sẽ là không sử dụng tốc ký, nhưng sử dụng background-colorcho thuộc tính màu sắc (giả sử bạn muốn cả màu sắc và hình ảnh).
borbulon

3

Sử dụng với biểu tượng phông chữ

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

HOẶC LÀ

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

#foo::before
{
  font-family: 'FontAwesome';
  color:red;
  position: relative;
  left: -5px;
  content: "\f007";    
}

7
Có vẻ như :: trước đây không thể được áp dụng của phần tử đầu vào.
Vishnja

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>

Ví dụ: bạn có thể sử dụng cái này: nhãn với đầu vào ẩn (biểu tượng hiện diện).


1

sử dụng lớp css này cho đầu vào của bạn khi bắt đầu, sau đó tùy chỉnh cho phù hợp:

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


Bạn có biết cách đặt sự kiện nhấp chỉ cho hình ảnh này không?
Arjun

0

Điều này làm việc cho tôi cho các hình thức tiêu chuẩn nhiều hay ít:

  <button type="submit" value="Submit" name="ButtonType" id="whateveristheId" class="button-class">Submit<img src="/img/selectedImage.png" alt=""></button>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.