Campo di immissione di testo HTML con simbolo di valuta


104

Vorrei avere un campo di immissione di testo contenente il segno "$" all'inizio e, indipendentemente dalle modifiche apportate al campo, affinché il segno sia persistente.

Sarei buono se solo i numeri fossero accettati per l'input, ma è solo un'aggiunta di fantasia.

Risposte:


103

Considerare la simulazione di un campo di input con un prefisso o un suffisso fisso utilizzando un intervallo con un bordo attorno a un campo di input senza bordi. Ecco un esempio di kickoff di base:

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


13
inoltre potresti racchiudere il '$' all'interno di un tag <Label>. Questo sposterà lo stato attivo sul campo di input quando fanno clic sul testo "$"
Cohen

2
@Cohen Sebbene sia una buona idea, avere più di un'etichetta può causare problemi di accessibilità .
rybo111

63

Usa un .input-icondiv genitore . Facoltativamente aggiungere .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>

Allinea l'icona verticalmente con transforme tope imposta pointer-eventssu in nonemodo che i clic si concentrino sull'input. Regolare paddinge widthcome appropriato:

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

A differenza della risposta accettata, questa manterrà l'evidenziazione della convalida dell'input, come un bordo rosso in caso di errore.

Esempio di utilizzo di JSFiddle con Bootstrap e Font Awesome


Lo volevo con un pulsante in una riga pulita e ho dovuto aggiungere float:leftal input-symboldiv
kluka

@ rybo111 no, intendevo un pulsante separato che si trova al di fuori del input-symbolcontenitore
kluka

Hai ragione, floatè pessimo quindi lo sto usando in display:inline-blockcombinazione con vertical-align:bottomadesso :) Non posso creare rapidamente un violino, però, ci sono troppi altri CSS in corso nel mio esempio attuale ;-)
kluka

1
Mi piace questa risposta rispetto a quella accettata poiché questa (come menziona l'autore) mantiene il comportamento di convalida del bootstrap che è fantastico!, Grazie per questo aiuto.
Vadiraj,

30

Puoi racchiudere il tuo campo di input in un intervallo, che tu position:relative;. Quindi aggiungi con il :before content:"€"tuo simbolo di valuta e fallo position:absolute. JSFiddle funzionante

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

Aggiorna Se si desidera inserire il simbolo dell'euro a sinistra oa destra della casella di testo. JSFiddle funzionante

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

Questo è molto vicino a quello che voglio, ma l'input non è stazionario sulla larghezza della pagina e non può usare l'assoluto. Parente sposta anche il simbolo. Come possiamo impostare la posizione assoluta / relativa all'angolo in alto a sinistra dell'input?
nwolybug

La valuta euro è sempre mostrata a destra. Dovresti mettere il tuo simbolo a destra invece che a sinistra.
jadok

Sono francese e il prezzo è sempre scritto come 2,50 € non 2,50 € e sono abbastanza sicuro che l'altro paese della zona euro faccia lo stesso.
jadok

2
@jadok Vivo nei Paesi Bassi qui i prezzi sono scritti come € 2,50.
Vincent Kok,

1
@VincentKok Dopo aver chiesto in giro sembra che dipenda dal paese, il paese europeo latino (Francia, Spagna, ...) lo metterà a destra e il paese nord / est europeo a sinistra, puoi provarlo con amazone per esempio : www.amazone.fr, www.amazone.nl, ...
jadok

22

Dal momento che non puoi fare ::beforecon gli content: '$'input e l'aggiunta di un elemento posizionato in modo assoluto aggiunge html extra, mi piace farlo a un css inline SVG in background.

Va più o meno così:

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

Emette quanto segue:

svg segno di dollaro sfondo css

Nota: il codice deve essere tutto su una sola riga. Il supporto è abbastanza buono nei browser moderni, ma assicurati di testarlo.


2
Bella soluzione. Ho finito per aggiungere background-repeat: no-repeat;mentre $ si stava ripetendo nella casella di input.
Hamid Tavakoli

Poiché i browser possono rendere gli elementi di input come "elementi sostituiti" (ad es. Come widget nativi del sistema), significa che background-imagepotrebbe non essere supportato, oppure il browser potrebbe eseguire il rendering del widget stesso invece di utilizzare i widget forniti dal sistema.
Dai

4

Ho finito per aver bisogno che il tipo rimanesse ancora come numero, quindi ho usato CSS per inserire il simbolo del dollaro nel campo di input utilizzando una posizione assoluta.

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


3

Metti il ​​"$" davanti al campo di immissione del testo, invece che al suo interno. Rende la convalida dei dati numerici molto più semplice perché non è necessario analizzare il "$" dopo l'invio.

Puoi, con JQuery.validate () (o altro), aggiungere alcune regole di convalida lato client che gestiscono la valuta. Ciò ti consentirebbe di avere il "$" all'interno del campo di input. Ma devi ancora eseguire la convalida lato server per motivi di sicurezza e questo ti rimette nella posizione di dover rimuovere '$'.


1
Grazie! Ne ero consapevole, ma in realtà avevo bisogno che il mio segno di valuta fosse all'interno del campo di testo. C'è una risposta migliore sotto la quale credo possa essere di aiuto a molte persone.
Utente3419

@Hristo: sono contento che tu abbia trovato una soluzione adatta. Ma per la cronaca, quello che hai contrassegnato come risposta non mette il tuo $ nel campo di input. Si rende solo sembra essere lì con lo styling. Detto questo, è decisamente liscio!
dnagirl

1
Sì, risolve visivamente il problema, mentre il tuo suggerimento punta solo (sì, ancora nella giusta direzione), ma non la chiamerei soluzione. Grazie mille ancora e ricorda che non volevo offendere nessuno qui!
Utente3419


2

Se hai solo bisogno di supportare Safari, puoi farlo in questo modo:

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

e un campo di input come

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

In questo modo non hai bisogno di un tag aggiuntivo e mantieni le informazioni sui simboli nel markup.


7
: prima e: dopo gli pseudo selettori CSS possono essere utilizzati solo per i tag contenitore e non funzionano per i tag di input. stackoverflow.com/questions/2587669/…
Venkatesh Nannan

1

Un'altra soluzione che preferisco è utilizzare un elemento di input aggiuntivo per un'immagine del simbolo di valuta. Ecco un esempio utilizzando un'immagine di una lente di ingrandimento all'interno di un campo di testo di ricerca:

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

Ciò si traduce nell'input sulla barra laterale sinistra qui:

https://fsfe.org


1

Ho appena usato: prima con l'input e ho passato $ come contenuto

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

1
Non riesco a riprodurlo in Chrome. Puoi pubblicare un esempio JSFiddle funzionante?
Dai

gli input non supportano gli pseudo elementi in CSS3. In altre parole è impossibile con il puro CSS. Tuttavia, se usi jquery puoi usare $ ("input"). After ("$");
TaterJuice

0

Per il bootstrap funziona

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

Non utilizzare class = "form-control" nel campo di input.


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>


Il codice senza spiegazione fa poco per aiutare l'OP oi futuri spettatori di questa risposta. Dovresti spiegare come questo risponde alla domanda.
leigero

0

Nessuna di queste risposte aiuta davvero se sei preoccupato di allineare il bordo sinistro con altri campi di testo in un modulo di input.

Ti consiglio di posizionare il segno del dollaro assolutamente a sinistra di circa -10px o di 5px a sinistra (a seconda che tu lo voglia all'interno o all'esterno della casella di input). La soluzione interna richiede una direzione: rtl sul css di input.

Potresti anche aggiungere il riempimento all'input per evitare la direzione: rtl, ma ciò modificherà la larghezza del contenitore di input in modo che non corrisponda agli altri contenitori della stessa larghezza.

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

o

<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

Esempio: https://plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview


1
Nessuna delle risposte aiuterà in questo perché non è quello che la domanda richiedeva. Il simbolo dovrebbe trovarsi all'interno dell'input.
rybo111

Tecnicamente, le risposte CSS non inseriscono nemmeno il segno del dollaro all'interno del contenitore di input. Penso che la soluzione CSS accettata stia introducendo un complicato problema di allineamento quando applicato a un modulo tipico. Come visto qui: plnkr.co/edit/uhOfLw5WB6DIn2le9GZm?p=preview
Ted Scheckler

Ho aggiornato questa soluzione per inserire il segno del dollaro all'interno dell'input: plnkr.co/edit/yshyuRMd06K1cuN9tFDv?p=preview (posizione assoluta a sinistra 5px e impostare la direzione di input su 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

Sì, se stai usando bootstrap, funzionerebbe.

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

e

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.