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.