Come realizzare una larghezza dell'elemento: 100% meno imbottitura?


397

Ho un input HTML.

L'ingresso ha padding: 5px 10px;che voglio che sia il 100% della larghezza del div del genitore (che è fluido).

Tuttavia, l'utilizzo width: 100%;fa sì che l'input sia 100% + 20pxcome posso aggirare questo?

Esempio


1
Vedi questa risposta che ho pubblicato non 15 minuti fa: stackoverflow.com/questions/5219030/… Questo dovrebbe funzionare perfettamente per te, a meno che tu non lo richieda per funzionare in IE7.
30

Se hai usato il mio metodo, vedi la leggera modifica che ho appena fatto sulla mia risposta. Garantisce "imbottitura uniforme" in alcuni browser.
30

@Hailwood ho una soluzione che mantiene imbottitura inpute supporta IE7
Vladimir Starkov,

Vedi anche la risposta sotto usando la funzione calc
Daan,

Risposte:


486

box-sizing: border-box è un modo rapido e semplice per risolverlo:

Questo funziona in tutti i browser moderni , e IE8 +.

Ecco una demo: http://jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

Le versioni con prefisso del browser ( -webkit-box-sizing, ecc.) Non sono necessarie nei browser moderni.


5
Non penso che sia una brutta soluzione. In generale, avvolgere gli elementi in un div extra è un buon modo per riempire gli elementi senza spingere la larghezza complessiva dell'elemento oltre il suo contenitore padre.
Jake Wilson,

1
Il padding di un div wrapping produce anche risultati non identici per l'aggiunta diretta del padding all'input.
Felix Fung il

@thirtydot ho alcune soluzioni più flessibili ed eleganti che mantengono la larghezza dell'input
Vladimir Starkov,

8
@thirtydot yeah, lascialo rotto per IE7 e lascia che M $ lo aggiusti :)
Petr Peller,

Ciò preserva anche le textareas di ridimensionamento automatico per tutti voi jQuery vs.
Michael J. Calkins,

276

Questo è il motivo per cui abbiamo box-sizingnei CSS.

Ho modificato il tuo esempio e ora funziona in Safari, Chrome, Firefox e Opera. Dai un'occhiata: http://jsfiddle.net/mathias/Bupr3/ Tutto quello che ho aggiunto è stato questo:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

Sfortunatamente i browser più vecchi come IE7 non lo supportano. Se stai cercando una soluzione che funzioni nei vecchi IE, controlla le altre risposte.


3
+1, ma caniuse.com/#search=box-sizing IE 8? Inoltre, github.com/Schepp/box-sizing-polyfill sembra fornire una soluzione per IE 6-7.
Alix Axel,

1
+1, questo è fantastico se non ti interessa IE (quando usi PhoneGap per esempio)
Luca B.

3
Che tipo di magia è questo? +1 per la risposta e +1 per il commento sopra di me (è esattamente quello di cui ho bisogno).
Eduard Luca,

20
Questo dovrebbe essere il comportamento predefinito .. anziché da +20 a larghezza. A volte CSS sembra seriamente incasinato.
Soth

2
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 sia di aiuto.
Sanjeev,

40

Usa anche l'imbottitura in percentuale e rimuovi dalla larghezza:

imbottitura: 5%;
larghezza: 90%;

19
Cordiali saluti, questa soluzione è ideale solo per layout non flessibili.
manicotti

+1, Il problema con questo sarebbe i confini immagino. Normalmente, sembrano solo "giusti" con 1-3 pixel max. I risultati sono troppo imprevedibili considerando le incoerenze del browser relative all'arrotondamento dei sub-pixel.
Alix Axel,

27

Puoi farlo senza usare box-sizinge non chiarire soluzioni come width~=99%.

Demo su jsFiddle :
inserisci qui la descrizione dell'immagine

  • Mantieni input paddingeborder
  • Aggiungi a input negativo orizzontale margin= border-width+horizontal padding
  • Aggiungi al wrapper dell'input orizzontale paddinguguale a margindal passaggio precedente

Markup HTML:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}

4
Questo è un buon trucco, usare il margine per l'input e il padding per il wrapper per compensare il padding in input.
maulik13,

Accetto totalmente !!! Ho usato questa soluzione e funziona ampiamente senza trucchi sporchi! Questa doveva essere la soluzione per ogni tipo di risposta.
Andre Figueiredo,

Non capisco bene quale sia il ruolo del margine negativo - tutto quello che so è che se il valore è sbagliato, la scatola finisce da un lato, ma in qualche modo un margine simmetrico lo risolve
Casebash

21

Usa css calc ()

Super semplice e fantastico.

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

Come visto qui: Larghezza div 100% meno quantità fissa di pixel
Di webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Fonte originale: http://web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

L'ho appena copiato qui, perché l'ho quasi perso nell'altro thread.


Tuttavia, è necessario programmarlo manualmente. Idealmente sarebbe determinato automaticamente.
JackHasaTastiera

11

Supponendo che io sia in un contenitore con imbottitura 15px, questo è quello che uso sempre per la parte interna:

width:auto;
right:15px;
left:15px;

Ciò allungherà la parte interna a qualunque larghezza dovrebbe essere inferiore di 15 pixel su entrambi i lati.


Potresti pubblicare un esempio completo di width:autoapplicato a un inputcampo?
Jakakiszon,

questa è solo una mezza risposta. la posizione predefinita degli elementi è statica, quindi sinistra e destra non faranno esattamente nulla qui. e larghezza auto è anche il valore iniziale, quindi .. tutta questa risposta non fa nulla :)
honk31

5

Puoi provare alcuni trucchi di posizionamento. Puoi inserire l'input in un div con position: relativeun'altezza fissa, quindi sull'input position: absolute; left: 0; right: 0;e su qualsiasi padding che ti piace.

Esempio dal vivo


In quali browser hai provato questo? :(
twentydot

Hmm, funziona solo in Chrome. Ma so di avere qualcosa di molto simile al lavoro anche in FF e IE.
Felix

Sembra che non funzioni <input> elementi di Firefox (idk su IE). Funziona con <div>s, però. E no, display: blocksulla <input>non funziona neanche: - /
Felix

5

Ecco la raccomandazione di codeontrack.com , che contiene buoni esempi di soluzione:

Invece di impostare la larghezza del div al 100%, impostarlo su auto e assicurarsi che <div>sia impostato su display: block (impostazione predefinita per <div>).


3
Non dovresti pubblicare link direttamente. Puoi includere le informazioni da quel link. Il motivo è che potrebbe essere domani che il link non sarà disponibile e la tua risposta non sarà più valida ..
Amnesh Goel

4

Sposta il riempimento della casella di input su un elemento wrapper.

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

Vedi esempio qui: http://jsfiddle.net/L7wYD/1/


2

Basta capire la differenza tra larghezza: auto; e larghezza: 100%; Larghezza: auto; (AUTO) calcolerà MATICALMENTE la larghezza per adattarsi esattamente al dato del div avvolgimento inclusa l'imbottitura. Larghezza 100% espande la larghezza e aggiunge l'imbottitura.


Puoi includere un esempio in cui funziona con <input>? Altrimenti stai solo mandando persone in una caccia all'oca selvatica.
Lister,

0

Che ne dite di avvolgerlo in un contenitore. Lo shoud container ha uno stile come:

{
    width:100%;
    border: 10px solid transparent;
}


-1

Per me, usando margin:15px;padding:10px 0 15px 23px;width:100%, il risultato è stato questo:

inserisci qui la descrizione dell'immagine

La soluzione per me era usare width:autoinvece di width:100%. Il mio nuovo codice era:

margin:15px;padding:10px 0 15px 23px;width:auto. Quindi l'elemento allineato correttamente:

inserisci qui la descrizione dell'immagine


-1

Ho avuto lo stesso problema. Risolvilo in questo modo:

width: 100%;
box-sizing: border-box;

-9

Puoi farlo:

width: auto;
padding: 20px;

Questo non è lo stesso margine del 100%.
James,
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.