L'imbottitura all'interno degli ingressi rompe la larghezza del 100%


130

Ok, quindi sappiamo che l'impostazione del riempimento su un oggetto fa sì che la sua larghezza cambi anche se è impostata esplicitamente. Mentre si può argomentare la logica dietro questo, provoca alcuni problemi con alcuni elementi.

Nella maggior parte dei casi, è sufficiente aggiungere un elemento figlio e aggiungere il riempimento a quello invece di quello impostato al 100%, ma per gli input del modulo non è un passaggio possibile.

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

Il secondo input ha il padding impostato su 5px che preferisco di gran lunga all'impostazione predefinita. Ma sfortunatamente ciò fa aumentare l'input di 10 pixel in tutte le direzioni, incluso l'aggiunta di 10 pixel alla larghezza del 100%.

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

C'è un modo per aggiungere imbottitura all'interno dell'input mantenendo comunque la larghezza al 100%? Deve essere al 100% poiché i moduli verranno visualizzati in genitori di larghezza diversa, quindi non conosco in anticipo la larghezza del padre.


3
Vedi stackoverflow.com/questions/628500/… per come utilizzare l' box-sizingattributo CSS3
Daniel LeCheminant

15
Devo solo dire, grazie per aver tenuto la tua pagina di esempio per tutto questo tempo. Mi fa impazzire quando qualcuno pubblica un URL nella domanda ed è inattivo dopo la risposta alla risposta o non usano qualcosa come jsfiddle.
Jonathan Dumaine,

Per quanto riguarda l'utilizzo dell'attributo di ridimensionamento della casella; il mio problema era lo stesso problema ma con l'altezza: impostare l'altezza al 100% da solo significa altezza + bordo + imbottitura = altezza contenitore. Per ottenere l'input per avere l'altezza effettiva del contenitore, dovevo semplicemente usare il dimensionamento box: content-box.
Skychan,

Tranne quello che ho appena detto non funziona in IE. IE11 con ridimensionamento della casella: la casella del contenuto non regola affatto l'altezza con l'altezza: 100%. Lo rispetta con un'altezza px specifica. Quindi altezza: 31px senza ridimensionamento della scatola è 6px in meno rispetto all'altezza: 31px + dimensionamento della scatola: scatola-contenuto. Ma l'idea è di usare l'altezza: 100%, quindi non sono preoccupato per le dimensioni specifiche dei pixel!
Skychan,

Risposte:


288

Utilizzando CSS3 è possibile utilizzare il ridimensionamento delle caselle delle proprietà per modificare il modo in cui il browser calcola la larghezza dell'input .

  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+ */
  }

Puoi leggere di più qui: http://css-tricks.com/box-sizing/


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

1
Il supporto è il seguente: Chrome (qualsiasi): ridimensionamento Opera 8.5+: ridimensionamento Firefox (qualsiasi): -moz-dimensionamento Safari 3: -webkit-box-dimensionamento (non prefissato nelle versioni 5.1+) IE8 +: box -sizing. Inoltre lo consiglio per la risposta accettata, è una soluzione più elegante.
Baconbeastnz,

1
Per chiarire il supporto del ridimensionamento delle scatole su IE, poiché la proprietà del ridimensionamento delle scatole IE dipende dalla modalità documento IE, funziona su "Modalità standard IE8" e successive. Funzionerà quindi nella versione browser IE8 anche se la modalità documento è "Modalità standard IE8". Spero che questo aiuti
Sanjeev il

Onestamente, box-sizing: border-box;è la prima cosa a cui ho pensato, ma non funziona assolutamente per me. Forse il bis-bisnonno display: flex;sta scherzando con questo?
Cody,

Sembra che sia supportato su tutti i principali browser senza prefisso, ed è stato per diversi versoins: caniuse.com/#feat=css3-boxsizing
Jason

7

Non so quanto sia compatibile con il browser (funziona in Firefox e Safari), ma potresti provare questa soluzione:

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

(Ha pubblicato solo i valori che ho modificato)


1
Causa problemi in IE.
Tarik,

Bene, questo non mi sorprende molto :) Non pensare che ci sia una soluzione cross-browser semplice senza cambiare il markup.
michaelk,

Ok, sto votando questa soluzione ora dall'aggiunta del margine: -5px apparentemente non è una violazione. Ho aggiunto un quarto input alla pagina che lo utilizza e sembra funzionare davvero. jigsaw.w3.org/css-validator/…
Sandman

7

Un'opzione è quella di avvolgere INPUTin un DIVche ha l'imbottitura.

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 div contenitore produce risultati non identici per l'aggiunta di riempimento a un campo di input.
Felix Fung il

Aggiungi a ciò che ha detto Felix Fung: perdi la possibilità di fare clic con il mouse nell'area di riempimento e di focalizzare il campo di input, tra gli altri problemi più evidenti. Volevo solo sottolineare questo problema meno noto / noto - Mi dà fastidio senza fine quando si utilizzano pagine Web che utilizzano questo hack.
eselk,

5

I spesso dimenticati calcpossono venire in soccorso qui:

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

Poiché sappiamo che l'imbottitura si aggiungerà alla larghezza dell'elemento, sottrarremo semplicemente l'imbottitura dalla larghezza complessiva. È supportato da tutti i principali browser, è reattivo e non richiede div di wrapper disordinati.


4

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

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

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

padding di 8px per includere il bordo e il padding dell'input / textarea. Spero che questo ti aiuti!


QUESTA tecnica funziona benissimo per allineare la larghezza delle celle che contengono input riempiti con celle che non lo fanno. Basta applicare il padding-right selettivamente a qualsiasi TD che contenga un input di larghezza del 100%.
Seb Barre,

1

Forse togli il bordo + lo sfondo da input, e invece racchiudilo in un divbordo + sfondo e larghezza: 100% e imposta un margine sul input?


Questo è il tipo di hack che sto attualmente usando per questo problema, ma preferirei usare il bordo sull'input per "motivi di stile" o quant'altro. Ma sì, è così che sto attualmente facendo, quindi è una soluzione praticabile
Sandman

1

Una soluzione che ho trovato funziona è quella di posizionare assolutamente l'input con un tag genitore relativamente posizionato.

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

Applica 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 presente è che il tag di paragrafo necessita di un'impostazione di altezza poiché i suoi figli posizionati in modo assoluto non aumenteranno la sua altezza. Questo evita la necessità di impostare width: 100%bloccandolo sui lati sinistro e destro dell'elemento genitore.


0

Prova a usare le percentuali per il tuo riempimento:

.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 sei preoccupato per gli utenti dei vecchi browser che non riescono a vedere il box-shadow, dai un input al colore di sfondo sottile come backup. Se stai usando i pixel per questo genere di cose, allora è probabile che li stai usando altrove, il che potrebbe presentare alcune sfide extra, fammi sapere se li incontri.


-3

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

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.