2009-09-04 12 views
93

Ok, quindi sappiamo che l'impostazione di riempimento su un oggetto ne modifica la larghezza anche se è impostata in modo esplicito. Mentre si può argomentare la logica alla base di questo, ciò causa alcuni problemi con alcuni elementi.Riempimento all'interno degli input interrompe la larghezza 100%

Per la maggior parte dei casi, basta aggiungere un elemento figlio e aggiungere padding a quello anziché a 100%, ma per gli input del modulo non è possibile.

Date un'occhiata a questo: http://sandman.net/test/formcss.html

Il secondo ingresso ha il suo padding impostato 5px che ho molto preferisco l'impostazione predefinita. Ma sfortunatamente questo fa crescere l'input di 10px in tutte le direzioni, inclusa l'aggiunta di 10px alla larghezza del 100%.

Il problema è che non riesco ad aggiungere un elemento figlio all'interno dell'input, quindi non posso ripararlo. Quindi la domanda è:

C'è un modo per aggiungere padding all'interno dell'ingresso mantenendo la larghezza al 100%? Deve essere al 100% poiché i moduli verranno visualizzati in genitori con larghezza diversa, quindi non conosco in anticipo la larghezza del genitore.

+3

Vedere http://stackoverflow.com/questions/628500/can-i-stop-100-width-text-boxes-from-extending-beyond-their-containers/628912#628912 per come utilizzare il CSS3 ' attributo "dimensionamento box" –

+11

Devo solo dire, grazie per aver mantenuto la pagina di esempio per tutto questo tempo. Mi fa impazzire quando qualcuno posta un url nella domanda ed è giù dopo che la risposta ha risposto o non usano qualcosa come jsfiddle. –

+0

Relativamente all'utilizzo dell'attributo di dimensionamento della casella; il mio problema era lo stesso problema ma con altezza - altezza di impostazione al 100% da solo significa altezza + bordo + riempimento = altezza del contenitore. Per ottenere l'input per avere l'altezza effettiva del contenitore, ho semplicemente dovuto usare il dimensionamento della scatola : content-box. – Skychan

risposta

7

Non so come croce browser compatibile è (funziona in Firefox e Safari), ma si potrebbe provare questa soluzione:

DIV.formvalue { 
padding: 15px; 
} 
input.input { 
margin: -5px; 
} 

(Solo pubblicato i valori che ho cambiato)

+1

causa problemi in IE. – Tarik

+1

Preferisco usare il codice standard per una cosa così "semplice" ... – Sandman

+0

Beh, questo non mi sorprende molto :) Non penso che ci sia una soluzione cross browser facile senza modificare il markup. – michaelk

-1

L'unica cosa che so per evitare questo è assegnare valori come 100% -10. Ma ha alcuni problemi di compatibilità tho.

1

Forse togliere lo sfondo + lo sfondo dallo input e invece racchiuderlo in uno div con bordo + sfondo e larghezza: 100% e impostare un margine su input?

+0

Questo è il tipo di hack I Attualmente sto usando per questo problema, ma preferirei usare border sull'input per "ragioni di stile" o quant'altro. Ma sì, questo è quello che sto facendo in questo modo è una soluzione valida – Sandman

7

Un'opzione è quella di avvolgere il INPUT in un DIV che ha il riempimento.

CSS:

div.formvalue { 
    background-color: #eee; 
    border: 1px solid red; 
    padding: 10px; 
    margin: 0px; 
} 

div.paddedInput { 
    padding: 5px; 
    border: 1px solid black; 
    background-color: white; 
} 

div.paddedInput input { 
    border: 0px; 
    width: 100%; 
} 

HTML:

<div class="formvalue"> 
    <div class="paddedInput"><input type="text" value="Padded!" /></div> 
</div> 
+8

Il riempimento di un contenitore div produce risultati non identici all'aggiunta di padding a un campo di input. –

+0

Aggiungete a ciò che Felix Fung ha detto: perdete la possibilità di fare clic con il mouse nell'area del padding e farlo mettere a fuoco il campo di immissione - tra altri problemi più evidenti. Volevo solo sottolineare questo problema meno noto/noto - Mi infastidisce senza fine quando uso le pagine web che usano questo hack. – eselk

4

ho avuto alcuni problemi con qualcosa di simile a questo. Ho tds con ingressi del 100% e una piccola imbottitura. Quello che ho fatto è stato compensare l'imbottitura del TD come segue:

.form td { 
    padding-right:8px; 
} 

.form input, .form textarea { 
    border: 1px solid black; 
    padding:3px; 
    width:100%; 
} 

imbottitura di 8px per includere il confine e imbottitura del input/textarea. Spero che questo aiuti!

+0

QUESTA tecnica funziona perfettamente per allineare la larghezza delle celle che contengono input imbottiti con celle che non lo sono. Basta applicare il padding-right in modo selettivo a qualsiasi TD che contenga un input di larghezza del 100%. –

1

Una soluzione che ho trovato funziona è posizionare l'input in modo assoluto con un tag padre relativamente posizionato.

<p class="full-width-input"> 
    <input type="text" class="text /> 
</p> 

Il applicare lo stile:

p.full-width-input { 
    position: relative; 
    height: 35px; 
} 

p.full-width-input input.text { 
    position: absolute; 
    top: 0; 
    left: 0; 
    right: 0; 
    padding: 5px; 
} 

L'unica cosa da tenere in mente è che il tag di paragrafo ha bisogno di regolazione come i suoi figli con posizionamento assoluto non si espanderà la sua altezza di altezza. Ciò evita la necessità di impostare width: 100% bloccandolo ai lati sinistro e destro dell'elemento genitore.

+1

testato .. non funziona ... potresti pubblicare una demo? – mrdaliri

211

Usando CSS3 è possibile utilizzare la proprietà box-sizing per alterare come il browser calcolare la con del di ingresso.

input.input { 
    width: 100%; 
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ 
    -moz-box-sizing: border-box; /* Firefox, other Gecko */ 
    box-sizing: border-box;   /* Opera/IE 8+ */ 
    } 

Si può leggere di più su di esso qui: http://css-tricks.com/box-sizing/

+3

+1 e se il mio capo ha finalmente deciso di abbandonare il supporto per IE7, non deve essere usato molto ... è super vecchia scuola. – eselk

+0

@ Víctor Dieppa Garriga Grazie, è un'ottima soluzione. – sinanakyazici

+1

Il supporto è il seguente: Chrome (qualsiasi): box-dimensionamento Opera 8.5+: box-dimensionamento Firefox (qualsiasi): -moz-box-dimensionamento Safari 3: -webkit-box-dimensionamento (non prefisso nelle versioni 5.1+) IE8 +: dimensionamento della scatola. Raccomando anche questo per la risposta accettata, è una soluzione più elegante. – Baconbeastnz

0

Prova utilizzando le percentuali per il padding:

.input { 

    // remove border completely 
    border: none; 

    // don't forget to use the browser prefixes 
    box-shadow: 0 0 0 1px silver; 

    // Use PERCENTAGES for at least the horizontal padding 
    padding: 5%; 

    // 100% - (2 * 5%) 
    width: 90%; 

} 

Se siete preoccupati per utenti su vecchi browser che non possono vedere il box-shadow, basta dare all'input un colore di sfondo sottile come backup. Se stai usando pixel per questo genere di cose, allora è probabile che tu li stia utilizzando altrove, il che potrebbe presentare alcune sfide extra, fammi sapere se le incontri.

2

Il spesso dimenticato calc può venire in soccorso qui:

input { 
    width: calc(100% - 1em); 
    padding: 0.5em; 
} 

Poiché sappiamo l'imbottitura aggiungerà alla larghezza dell'elemento, abbiamo semplicemente sottrarre l'imbottitura dalla larghezza complessiva. È supportato da tutti i principali browser, è reattivo e non richiede disordine wrapper wrapper.

Problemi correlati