Поле введення тексту HTML з символом валюти


104

Я хотів би, щоб у самому початку було поле для введення тексту, що містить знак "$", і незалежно від того, яке редагування відбувається в полі, щоб знак був стійким.

Було б добре, якби для введення були прийняті лише номери, але це лише химерне доповнення.

Відповіді:


103

Розглянемо змоделювання поля введення з фіксованим префіксом або суфіксом за допомогою прольоту з облямівкою навколо поля введення без полів. Ось основний приклад старту:

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


13
крім того, ви можете загортати '$' всередині тегу <Label>. Це перемістить фокус на поле введення, натиснувши текст "$"
Cohen

2
@Cohen Хоча гарна ідея, наявність декількох етикеток може спричинити проблеми з доступністю .
rybo111

63

Скористайтеся батьківським .input-iconділом. За бажанням додати .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>

Зіставте значок вертикально transformі top, і набір pointer-eventsдля noneтак , що клацання зосередитися на вході. Відрегулюйте paddingта, widthяк це необхідно:

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

На відміну від прийнятої відповіді, це дозволить зберегти підсвічування вхідних даних, наприклад, червону межу, коли є помилка.

Приклад використання JSFiddle з Bootstrap та Awesome Font


Мені хотілося цього за допомогою кнопки в одному акуратному рядку і довелося додати float:leftйого до input-symboldiv
kluka

@ rybo111 ні, я мав на увазі окрему кнопку, яка знаходиться поза input-symbolконтейнером
kluka

Ви маєте рацію, floatце погано, тому я використовую в display:inline-blockпоєднанні з vertical-align:bottomзараз :) Я не можу швидко скласти загадку, хоча в моєму прикладі зараз дуже багато інших CSS ;-)
kluka

1
Мені подобається ця відповідь, ніж прийнята, оскільки ця (як зазначає автор) зберігає валідаційну поведінку завантажувальної програми, що чудово !, дякую за цю допомогу.
Вадирай

30

Ви можете загорнути поле введення в проміжок, який ви position:relative;. Потім ви додаєте :before content:"€"свій символ грошової одиниці і вносите його position:absolute. Робоча JSFiddle

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

Оновлення Якщо ви хочете поставити символ євро в лівій або правій частині текстового поля. Робоча JSFiddle

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

Це дуже близько до того, що я хочу, але введення не є стаціонарним за шириною сторінки і не може використовувати абсолютне. Відносна також переміщує символ навколо. Як ми можемо встановити положення абсолютне / відносно вхідного верхнього лівого кута?
nwolybug

Валюта євро завжди відображається справа. Свій символ слід поставити праворуч, а не ліворуч.
jadok

Я по-французьки і ціна завжди написана як 2,50 € не 2,50 євро, і я впевнений, що інша країна єврозони зробить те саме.
jadok

2
@jadok Я живу в Нідерландах, тут ціни написані як € 2,50.
Вінсент Кок

1
@VincentKok Після того, як розпитати, здається, це залежить від країни, країни європейських країн (Франція, Іспанія, ...) поставлять його праворуч, а країна північної / східної Європи зліва, ви можете спробувати це з amazone на прикладі : www.amazone.fr, www.amazone.nl, ...
jadok

22

Оскільки ви не можете робити ::beforeз content: '$'введеннями та додавання абсолютно розміщеного елемента додає додатковий html - мені подобається робити до фонового css SVG inline.

Це щось подібне:

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

Він виводить наступне:

svg знак долара фон css

Примітка: код повинен бути в одному рядку. Підтримка досить хороша в сучасних браузерах, але обов'язково протестуйте.


2
Приємне рішення. Я завершив додавання, background-repeat: no-repeat;оскільки у полі введення повторювався $.
Хамід Таваколі

Оскільки браузери можуть відображати елементи введення як "замінені елементи" (наприклад, як власні віджети системи), це означає, що вони background-imageможуть не підтримуватися, або браузер може зробити сам віджет замість того, щоб використовувати віджети, надані системою.
Дай

4

У кінцевому підсумку мені потрібно було зберегти тип як номер, тому використовував CSS, щоб натиснути знак долара у поле введення, використовуючи абсолютну позицію.

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


3

Поставте "$" перед полем для введення тексту замість нього. Це набагато полегшує перевірку числових даних, оскільки вам не потрібно розбирати "$" після надсилання.

За допомогою JQuery.validate () (або іншого) ви можете додати деякі правила перевірки на стороні клієнта, які обробляють валюту. Це дозволить вам мати "$" всередині поля введення. Але вам все одно доведеться провести перевірку на стороні сервера для безпеки, і це поверне вас у позицію необхідності видалити '$'.


1
Дякую! Я це знав, але мені фактично потрібен мій знак валюти, щоб бути всередині текстового поля. Нижче є краща відповідь, на яку я вважаю, що може допомогти багатьом людям.
Користувач3419

@Hristo: Я радий, що ти знайшов рішення, яке підходить. Але для запису той, який ви позначили як відповідь, не вводить ваші $ у поле введення. Це лише здається, що є там зі стилями. Це сказало, це безумовно гладко!
dnagirl

1
Так, це візуально вирішує проблему, тоді як ваша пропозиція лише вказує (так, все ще в правильному напрямку), але я б не назвав це рішенням. Ще раз дякую вам і пам’ятайте, що я не хотів нікого тут ображати!
Користувач3419


2

Якщо вам потрібно лише підтримувати Safari, ви можете зробити це так:

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

і таке поле введення

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

Таким чином, вам не потрібен додатковий тег і зберігати інформацію про символи в розмітці.


7
: до і: після CSS псевдоселектори можуть використовуватися лише для тегів контейнерів і не працюють для тегу введення. stackoverflow.com/questions/2587669 / ...
Venkatesh Nannan

1

Ще одне рішення, яке я віддаю перевагу - використовувати додатковий елемент введення для зображення символу валюти. Ось приклад використання зображення лупи в текстовому полі пошуку:

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

Це призводить до введення лівої бічної панелі тут:

https://fsfe.org


1

Я щойно використовував: раніше з введенням і передав $ як вміст

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

1
Я не можу відтворити це в Chrome. Чи можете ви розмістити робочий приклад JSFiddle?
Дай

входи не підтримують псевдоелементів у CSS3. Іншими словами, з чистим CSS це неможливо. Однак якщо ви використовуєте jquery, ви можете використовувати $ ("input"). After ("$");
TaterJuice

0

Для завантажувальних робіт його роботи

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

Не використовуйте class = "form-control" у полі введення.


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>


Код без пояснень мало допомагає ОП або майбутнім глядачам у цій відповіді. Ви повинні пояснити, як це відповідає на питання.
leigero

0

Жоден із цих відповідей насправді не допомагає, якщо ви переймаєтеся вирівнюванням лівої межі з іншими текстовими полями на формі введення.

Я рекомендую розміщувати знак долара абсолютно ліворуч приблизно -10px або ліворуч 5px (залежно від того, чи ви хочете його всередині або поза полем для введення). Внутрішнє рішення вимагає напрямку: rtl на вхідному css.

Ви також можете додати накладки на вхід, щоб уникнути напрямку: rtl, але це змінить ширину вхідного контейнера, щоб не збігатися з іншими контейнерами тієї ж ширини.

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

або

<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

Приклад: https://plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview


1
Жодна з відповідей не допоможе в цьому, тому що це не те, що запитували. Символ повинен бути всередині входу.
rybo111

Технічно відповіді css також не ставлять знак долара всередині вхідного контейнера. Я думаю, що прийняте рішення css вводить складну проблему вирівнювання при застосуванні до типової форми. Як бачимо тут: plnkr.co/edit/uhOfLw5WB6DIn2le9GZm?p=preview
Тед Шеклер

Я оновив це рішення, щоб розмістити знак долара всередині входу: plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview (абсолютна позиція ліворуч 5 пікселів і встановити напрямок введення до rtl)
Тед Шеклер

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

Так, якщо ви використовуєте bootstrap, це буде працювати.

.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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.