Trường nhập văn bản HTML có ký hiệu tiền tệ


104

Tôi muốn có một trường nhập văn bản có chứa ký hiệu "$" ngay từ đầu và bất kể trường hợp nào xảy ra chỉnh sửa, để ký hiệu này luôn tồn tại.

Tôi sẽ rất tốt nếu chỉ những con số được chấp nhận cho đầu vào, nhưng đó chỉ là một bổ sung ưa thích.

Câu trả lời:


103

Xem xét mô phỏng trường nhập với tiền tố hoặc hậu tố cố định bằng cách sử dụng khoảng có đường viền xung quanh trường nhập không có đường viền. Đây là một ví dụ khởi động cơ bản:

.currencyinput {
    border: 1px inset #ccc;
}
.currencyinput input {
    border: 0;
}
<span class="currencyinput">$<input type="text" name="currency"></span>


13
ngoài ra, bạn có thể bọc '$' bên trong thẻ <Label>. Điều này sẽ di chuyển tập trung vào lĩnh vực đầu vào khi họ nhấp vào '$' - văn bản
Cohen

2
@Cohen Mặc dù là một ý tưởng hay, nhưng có nhiều nhãn có thể gây ra vấn đề với khả năng truy cập .
rybo111

63

Sử dụng .input-icondiv cha . Thêm tùy ý .input-icon-right.

<div class="input-icon">
  <input type="text">
  <i>$</i>
</div>

<div class="input-icon input-icon-right">
  <input type="text">
  <i></i>
</div>

Căn chỉnh biểu tượng theo chiều dọc với transformtopvà đặt pointer-eventsđể nonecác nhấp chuột tập trung vào đầu vào. Điều chỉnh paddingwidthkhi thích hợp:

.input-icon {
  position: relative;
}

.input-icon > i {
  position: absolute;
  display: block;
  transform: translate(0, -50%);
  top: 50%;
  pointer-events: none;
  width: 25px;
  text-align: center;
  font-style: normal;
}

.input-icon > input {
  padding-left: 25px;
  padding-right: 0;
}

.input-icon-right > i {
  right: 0;
}

.input-icon-right > input {
  padding-left: 0;
  padding-right: 25px;
  text-align: right;
}

Không giống như câu trả lời được chấp nhận, điều này sẽ giữ lại đánh dấu xác thực đầu vào, chẳng hạn như đường viền màu đỏ khi có lỗi.

Ví dụ sử dụng JSFiddle với Bootstrap và Font Awesome


Tôi muốn điều này với một nút trong một dòng gọn gàng và phải thêm float:leftvào input-symboldiv
kluka

@ rybo111 không, tôi có nghĩa là một nút riêng biệt mà là bên ngoài của input-symbolthùng chứa
kluka

Bạn nói đúng, floatlà xấu vì vậy tôi đang sử dụng display:inline-blockkết hợp với vertical-align:bottombây giờ :) Tôi không thể nhanh chóng làm cho một fiddle tuy nhiên, có CSS quá nhiều khác đi trong ví dụ hiện tại của tôi ;-)
kluka

1
Tôi thích câu trả lời này hơn câu trả lời được chấp nhận vì điều này (như tác giả đã đề cập) giữ lại hành vi xác nhận của bootstrap, điều này thật tuyệt !, cảm ơn vì sự trợ giúp này.
Vadiraj

30

Bạn có thể bao bọc trường nhập của mình thành một khoảng, mà bạn position:relative;. Sau đó, bạn thêm :before content:"€"ký hiệu tiền tệ của mình và tạo ra nó position:absolute. JSFiddle làm việc

HTML

<span class="input-symbol-euro">
    <input type="text" />
</span>

CSS

.input-symbol-euro {
    position: relative;
}
.input-symbol-euro input {
    padding-left:18px;
}
.input-symbol-euro:before {
    position: absolute;
    top: 0;
    content:"€";
    left: 5px;
}

Cập nhật Nếu bạn muốn đặt biểu tượng đồng euro ở bên trái hoặc bên phải của hộp văn bản. JSFiddle làm việc

HTML

<span class="input-euro left">
    <input type="text" />
</span>
<span class="input-euro right">
    <input type="text" />
</span>

CSS

 .input-euro {
     position: relative;
 }
 .input-euro.left input {
     padding-left:18px;
 }
 .input-euro.right input {
     padding-right:18px;
     text-align:end; 
 }

 .input-euro:before {
     position: absolute;
     top: 0;
     content:"€";
 }
 .input-euro.left:before {
     left: 5px;
 }
 .input-euro.right:before {
     right: 5px;
 }

Điều này rất gần với những gì tôi muốn, nhưng đầu vào không cố định theo chiều rộng trang và không thể sử dụng tuyệt đối. Tương đối cũng di chuyển biểu tượng xung quanh. Làm cách nào chúng ta có thể đặt vị trí tuyệt đối / tương đối cho góc trên cùng bên trái của đầu vào?
nwolybug

Đồng tiền chung euro luôn được hiển thị ở bên phải. Bạn nên đặt biểu tượng của mình ở bên phải thay vì bên trái.
jadok

Tôi là người Pháp và giá luôn được viết là 2,50 € chứ không phải 2,50 € và tôi khá chắc chắn rằng quốc gia khác trong khu vực đồng euro cũng làm như vậy.
jadok

2
@jadok Tôi sống ở Hà Lan giá ở đây được viết là € 2,50.
Vincent Kok,

1
@VincentKok Sau khi hỏi xung quanh, có vẻ như nó phụ thuộc vào quốc gia, quốc gia châu Âu theo vĩ độ Latinh (Pháp, Tây Ban Nha, ...) sẽ đặt nó ở bên phải và quốc gia bắc / đông châu Âu ở bên trái, bạn có thể thử nó với amazone. : www.amazone.fr, www.amazone.nl, ...
jadok

22

Vì bạn không thể làm ::beforevới content: '$'đầu vào và thêm một phần tử được định vị hoàn toàn sẽ thêm html - tôi thích làm với css nội tuyến SVG.

Nó đi một cái gì đó như thế này:

input {
    width: 85px;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='16px' width='85px'><text x='2' y='13' fill='gray' font-size='12' font-family='arial'>$</text></svg>");
    padding-left: 12px;
}

Nó xuất ra như sau:

svg đô la ký hiệu nền css

Lưu ý: tất cả mã phải nằm trên một dòng. Hỗ trợ khá tốt trong các trình duyệt hiện đại, nhưng hãy nhớ kiểm tra.


2
Giải pháp tốt. Tôi đã kết thúc việc thêm background-repeat: no-repeat;vì $ đang lặp lại trong hộp nhập liệu.
Hamid Tavakoli

Vì trình duyệt có thể hiển thị các phần tử đầu vào dưới dạng "các phần tử được thay thế" (ví dụ như các widget gốc của hệ thống), điều đó có nghĩa là nó có background-imagethể không được hỗ trợ hoặc trình duyệt có thể hiển thị chính widget đó thay vì sử dụng các widget do hệ thống cung cấp.
Đài

4

Cuối cùng, tôi cần loại vẫn còn ở dạng số, vì vậy đã sử dụng CSS để đẩy ký hiệu đô la vào trường nhập bằng cách sử dụng vị trí tuyệt đối.

<div>
   <span style="position: absolute; margin-left: 1px; margin-top: 1px;">$</span>
   <input type="number" style="padding-left: 8px;">
</div>


3

Đặt '$' trước trường nhập văn bản, thay vì đặt bên trong trường. Nó làm cho việc xác thực dữ liệu số dễ dàng hơn rất nhiều vì bạn không phải phân tích cú pháp '$' sau khi gửi.

Bạn có thể, với JQuery.validate () (hoặc khác), thêm một số quy tắc xác thực phía máy khách để xử lý tiền tệ. Điều đó sẽ cho phép bạn có '$' bên trong trường đầu vào. Nhưng bạn vẫn phải thực hiện xác thực phía máy chủ để bảo mật và điều đó khiến bạn trở lại vị thế phải xóa '$'.


1
Cảm ơn bạn! Tôi đã biết điều đó, nhưng tôi thực sự cần ký hiệu tiền tệ của mình ở bên trong trường văn bản. Dưới đây là một câu trả lời hay hơn mà tôi tin rằng có thể giúp ích cho nhiều người.
Người dùng 3419

@Hristo: Tôi rất vui vì bạn đã tìm thấy một giải pháp phù hợp. Nhưng đối với những kỷ lục, là bạn đã đánh dấu là câu trả lời không đặt $ của bạn trong lĩnh vực đầu vào. Nó chỉ làm cho nó dường như ở đó với phong cách. Điều đó nói rằng, nó chắc chắn là bóng bẩy!
dnagirl

1
Có, nó giải quyết vấn đề một cách trực quan, trong khi đề xuất của bạn chỉ là chỉ (vâng, vẫn đúng hướng), nhưng tôi sẽ không gọi nó là giải pháp. Cảm ơn bạn rất nhiều một lần nữa và hãy nhớ rằng tôi không có ý xúc phạm bất kỳ ai ở đây!
Người dùng 3419


2

Nếu bạn chỉ cần hỗ trợ Safari, bạn có thể làm như sau:

input.currency:before {
  content: attr(data-symbol);
  float: left;
  color: #aaa;
}

và một trường đầu vào như

<input class="currency" data-symbol="€" type="number" value="12.9">

Bằng cách này, bạn không cần thêm thẻ và giữ thông tin ký hiệu trong phần đánh dấu.


7
: before và: after CSS pseudo selectors chỉ có thể được sử dụng cho các thẻ vùng chứa và không hoạt động cho thẻ đầu vào. stackoverflow.com/questions/2587669/…
Venkatesh Nannan,

1

Một giải pháp khác mà tôi thích là sử dụng một yếu tố đầu vào bổ sung cho hình ảnh của biểu tượng tiền tệ. Đây là ví dụ sử dụng hình ảnh kính lúp trong trường văn bản tìm kiếm:

html:

<input type="image" alt="Subscribe" src="/graphics/icons/search-button.png">
<input type="text" placeholder="Search" name="query">

css:

#search input[type="image"] {
background-color: transparent;
border: 0 none;
margin-top: 10px;
vertical-align: middle;
margin: 5px 0 0 5px;
position: absolute;
}

Điều này dẫn đến đầu vào trên thanh bên trái ở đây:

https://fsfe.org


1

Tôi vừa sử dụng: before với đầu vào và chuyển $ làm nội dung

input{ 
   margin-left: 20px;
 }
input:before {
  content: "$";
  position: absolute;
}

1
Tôi không thể tái tạo điều này trong Chrome. Bạn có thể đăng một ví dụ JSFiddle đang hoạt động không?
Đại

đầu vào không hỗ trợ các phần tử giả trong CSS3. Nói cách khác, điều đó là không thể với CSS thuần túy. Tuy nhiên nếu sử dụng jquery bạn có thể sử dụng $ ("input"). After ("$");
TaterJuice

0

Đối với bootstrap hoạt động của nó

<span class="form-control">$ <input type="text"/></span>

Không sử dụng class = "form-control" trong trường đầu vào.


0

.currencyinput {
    border: 1px inset #ccc;
    padding-bottom: 1px;//FOR IE & Chrome
}
.currencyinput input {
    border: 0;
}
<span class="currencyinput">$<input type="text" name="currency"></span>


Mã không có lời giải thích không giúp ích gì nhiều cho OP hoặc những người xem tương lai về câu trả lời này. Bạn nên giải thích cách trả lời câu hỏi này.
leigero

0

Không câu trả lời nào trong số những câu trả lời này thực sự hữu ích nếu bạn lo lắng về việc căn chỉnh đường viền bên trái với các trường văn bản khác trên biểu mẫu nhập liệu.

Tôi khuyên bạn nên đặt ký hiệu đô la hoàn toàn sang trái khoảng -10px hoặc sang trái 5px (tùy thuộc vào việc bạn muốn nó bên trong hay bên ngoài hộp nhập liệu). Giải pháp bên trong yêu cầu hướng: rtl trên css đầu vào.

Bạn cũng có thể thêm phần đệm vào đầu vào để tránh hướng: rtl, nhưng điều đó sẽ thay đổi chiều rộng của vùng chứa đầu vào để không khớp với các vùng chứa khác có cùng chiều rộng.

<div style="display:inline-block">
 <div style="position:relative">
  <div style="position:absolute; left:-10px;">$</div>
 </div>
 <input type='text' />
</div>

hoặc là

<div style="display:inline-block">
 <div style="position:relative">
  <div style="position:absolute; left:5px;">$</div>
 </div>
 <input type='text' style='direction: rtl;' />
</div>

https://i.imgur.com/ajrU0T9.png

Ví dụ: https://plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview


1
Không có câu trả lời nào sẽ giúp ích cho việc đó vì đó không phải là những gì câu hỏi yêu cầu. Biểu tượng được cho là bên trong đầu vào.
rybo111

Về mặt kỹ thuật, các câu trả lời css cũng không đặt ký hiệu đô la bên trong vùng chứa đầu vào. Tôi nghĩ rằng giải pháp css được chấp nhận đang đưa ra một vấn đề liên kết phức tạp khi áp dụng cho một dạng điển hình. Như đã thấy ở đây: plnkr.co/edit/uhOfLw5WB6DIn2le9GZm?p=preview
Ted Scheckler

Tôi đã cập nhật giải pháp này để đặt ký hiệu đô la bên trong đầu vào: plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview (vị trí tuyệt đối bên trái 5px và đặt hướng đầu vào thành rtl)
Ted Scheckler

0

<style>
.currencyinput {
    border: 1px inset #ccc;
    
    border-left:none;
}
.currencyinput input {
    border: 0;
}
</style>
<!DOCTYPE html>
<html>
<head>

</head>
<body>

<input type="text" oninput="this.value = this.value.replace(/[^0-9]/.g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" style="text-align:right;border-right:none;outline:none" name="currency"><span class="currencyinput">%</span>
</body>
</html>

%


-1

Có, nếu bạn đang sử dụng bootstrap, điều này sẽ hoạt động.

.form-control input {
    border: none;
    padding-left: 4px;
}

<span class="form-control">$ <input type="text"/></span>

-1
.currencyinput {
    border: 1px inset #ccc;

    border-left:none;
}
.currencyinput input {
    border: 0;`enter code here`
}

<input type="text" oninput="this.value = this.value.replace(/[^0-9]/.g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" style="text-align:right;border-right:none;outline:none" name="currency"><span class="currencyinput">%</span>
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.