带有货币符号的HTML文本输入字段


104

我想在开始时有一个包含“ $”符号的文本输入字段,无论对该字段进行什么编辑,以使该符号保持不变。

如果只接受数字作为输入,我会很好,但这只是一个幻想。

Answers:


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-icondiv。(可选)添加.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-eventsnone,以使单击集中在输入上。调整paddingwidth适当:

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

与接受的答案不同,这将保留输入验证突出显示,例如出现错误时显示为红色边框。

具有Bootstrap和Font Awesome的JSFiddle使用示例


我希望在一个整齐的行中使用一个按钮来完成此操作,并且不得不添加float:leftinput-symboldiv
kluka '16

@ rybo111不,我的意思是input-symbol容器外面有一个单独的按钮
kluka '16

你是对的,float很糟糕,所以我现在使用display:inline-block结合vertical-align:bottom:)虽然我不能快速
搞怪

1
我喜欢这个答案,而不是被接受的答案,因为它(如作者所述)保留了bootstrap的验证行为,这真是太好了!,谢谢您的帮助。
Vadiraj

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 '16

22

既然你不能做::beforecontent: '$'投入和增加绝对定位的元素增加了额外的HTML -我喜欢做一个背景SVG内联CSS。

它是这样的:

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
谢谢!我知道这一点,但实际上我需要货币符号位于文本字段内。下面有一个更好的答案,我相信这对很多人都可以有所帮助。
User3419 2010年

@Hristo:很高兴您找到适合的解决方案。但是记录下来,您标记为答案的那条记录并未将您的$ 放入输入字段。它仅使它似乎具有样式。也就是说,它绝对是光滑的!
dnagirl

1
是的,它可以从视觉上解决问题,而您的建议只是针对性的(是的,仍然朝着正确的方向),但我不会将其称为解决方案。再次非常感谢您,并记住我不是要冒犯任何人!
User3419 2010年


2

如果只需要支持Safari,则可以这样做:

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

和一个输入字段

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

这样,您就不需要多余的标签并将符号信息保留在标记中。


7
:before和:after CSS伪选择器只能用于容器标签,不适用于输入标签。stackoverflow.com/questions/2587669/...
文卡塔斯楠楠

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

我只是用:before输入,并通过$作为内容

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>


没有解释的代码对OP或将来的读者没有什么帮助。您应该解释这如何回答问题。
leigero

0

如果您担心将左边框与输入表单上的其他文本字段对齐,那么这些答案都将无济于事。

我建议将美元符号绝对定位在-10px或5px的左侧(取决于您要在输入框内还是输入框外)。内部解决方案要求输入CSS上的direction:rtl。

您也可以在输入中添加填充,以避开direction: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
Ted Scheckler,

我已经更新了此解决方案以将美元符号放置在输入中:plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview(位置绝对左5px,并将输入方向设置为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

是的,如果您正在使用引导程序,则可以使用。

.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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.