ช่องใส่ข้อความ HTML พร้อมสัญลักษณ์สกุลเงิน


105

ฉันต้องการให้ช่องป้อนข้อความที่มีเครื่องหมาย "$" อยู่ในตอนต้นและไม่ว่าการแก้ไขจะเกิดขึ้นกับช่องใดเพื่อให้เครื่องหมายยังคงอยู่

ฉันจะดีถ้ายอมรับตัวเลขเท่านั้นสำหรับการป้อนข้อมูล แต่นั่นเป็นเพียงส่วนเสริมที่น่าสนใจ

คำตอบ:


104

ลองจำลองช่องป้อนข้อมูลที่มีคำนำหน้าหรือคำต่อท้ายคงที่โดยใช้ช่วงที่มีเส้นขอบรอบช่องป้อนข้อมูลแบบไร้ขอบ นี่คือตัวอย่างการเริ่มต้นพื้นฐาน:

.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-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 และ Font Awesome


ฉันต้องการสิ่งนี้ด้วยปุ่มในบรรทัดเดียวและต้องเพิ่มfloat:leftในinput-symboldiv
kluka

@ rybo111 ไม่ฉันหมายถึงปุ่มแยกต่างหากที่อยู่นอกinput-symbolคอนเทนเนอร์
kluka

คุณพูดfloatถูกไม่ดีดังนั้นฉันจึงใช้display:inline-blockร่วมกับvertical-align:bottomตอนนี้ :) ฉันไม่สามารถสร้างซอได้อย่างรวดเร็วแม้ว่าจะมี CSS อื่น ๆ อยู่ในตัวอย่างปัจจุบันของฉันมากเกินไป ;-)
kluka

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 ยูโร
Vincent Kok

1
@ VincentKok หลังจากถามรอบ ๆ ดูเหมือนว่ามันขึ้นอยู่กับประเทศแล้วประเทศในทวีปยุโรป (ฝรั่งเศสสเปน ... : www.amazone.fr, www.amazone.nl, ...
jadok

22

เนื่องจากคุณไม่สามารถทำได้::beforeกับcontent: '$'อินพุตและการเพิ่มองค์ประกอบที่อยู่ในตำแหน่งที่แน่นอนจึงเพิ่ม 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;เมื่อ $ ทำซ้ำในช่องป้อนข้อมูล
Hamid Tavakoli

เนื่องจากเบราว์เซอร์สามารถแสดงองค์ประกอบอินพุตเป็น "อิลิเมนต์ที่ถูกแทนที่" (เช่นวิดเจ็ตเนทีฟของระบบ) จึงหมายความว่าbackground-imageอาจไม่ได้รับการสนับสนุนหรือเบราว์เซอร์อาจแสดงวิดเจ็ตเองแทนที่จะใช้วิดเจ็ตที่ระบบให้มา
Dai

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

@Hristo: ฉันดีใจที่คุณพบวิธีแก้ปัญหาที่เหมาะสม แต่สำหรับบันทึกรายการที่คุณทำเครื่องหมายเป็นคำตอบจะไม่ใส่ $ ของคุณในช่องป้อนข้อมูล มันทำให้ดูเหมือนมีสไตล์เท่านั้น บอกเลยว่าเนียนแน่นอน!
dnagirl

1
ใช่มันช่วยแก้ปัญหาได้ด้วยสายตาในขณะที่คำแนะนำของคุณเป็นเพียงการชี้ (ใช่ยังอยู่ในทิศทางที่ถูกต้อง) แต่ฉันจะไม่เรียกว่าวิธีแก้ปัญหา ขอบคุณมากอีกครั้งและจำไว้ว่าฉันไม่ได้ตั้งใจจะรุกรานใครที่นี่!
User3419

2

1
ใช่ฉันต้องการให้สัญลักษณ์สกุลเงินอยู่ในฟิลด์ แต่ขอบคุณสำหรับลิงก์ จำกัด การป้อนข้อมูล!
User3419

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 and: after CSS pseudo selectors สามารถใช้ได้กับแท็กคอนเทนเนอร์เท่านั้นและไม่สามารถใช้กับแท็กอินพุตได้ 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

สำหรับ bootstrap มันใช้งานได้

<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 (ขึ้นอยู่กับว่าคุณต้องการให้อยู่ในหรือนอกช่องป้อนข้อมูล) โซลูชันภายในต้องการทิศทาง: 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
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
.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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.