Posso impedire che le caselle di testo con larghezza del 100% si estendano oltre i loro contenitori?


181

Diciamo che ho una casella di testo che voglio riempire un'intera riga. Gli darei uno stile come questo:

input.wide {display:block; width: 100%}

Ciò causa problemi perché la larghezza si basa sul contenuto della casella di testo. Le caselle di testo hanno margine, bordi e riempimento per impostazione predefinita, il che rende una casella di testo con larghezza del 100% più grande del suo contenitore.

Ad esempio, qui a destra:

inserisci qui la descrizione dell'immagine

C'è un modo per fare in modo che una casella di testo riempia la larghezza del suo contenitore senza espandersi oltre?

Ecco alcuni esempi di HTML per mostrare cosa intendo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
        #inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
        input.wide {display:block; margin: 0px}
        input.normal {display:block; float: right}
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner">
            <input type="text" class="wide" />
            <input type="text" class="normal" />
            <div style="clear:both;"></div>
        </div>
    </div>
</body>
</html>

Se questo viene eseguito, puoi vedere guardando la casella di testo "normale" che la casella di testo "larga" sporge oltre il contenitore. La casella di testo "normale" si sposta sul bordo effettivo del contenitore. Sto cercando di fare in modo che la casella di testo "largo" riempia il suo contenitore, senza espandersi oltre il bordo come la casella di testo "normale".

Risposte:


87

Quello che potresti fare è rimuovere gli "extra" predefiniti su input:

input.wide {display:block; width:100%;padding:0;border-width:0}

Ciò manterrà l' inputinterno del suo contenitore. Ora, se si vuole i confini, avvolgere il inputin una div, con i confini stabiliti sul div(modo in cui è possibile rimuovere il display:blockdal inputtroppo). Qualcosa di simile a:

<div style="border:1px solid gray;">
 <input type="text" class="wide" />
</div>

Modifica: un'altra opzione è quella di, invece di rimuovere lo stile da input, compensarlo nel pacchetto div:

input.wide {width:100%;}

<div style="padding-right:4px;padding-left:1px;margin-right:2px">
  <input type="text" class="wide" />
</div>

Ciò fornirà risultati leggermente diversi nei diversi browser, ma non si sovrapporranno al contenitore. I valori nel div dipendono da quanto è grande il bordo inpute da quanto spazio vuoi tra inputil bordo e.


3
Questa è una soluzione molto creativa. L'unico problema che ho è che non riesco a definire un contorno nella casella di testo quando diventa attivo a meno che non usi JavaScript per modificare il bordo del div wrapper.
Dan Herbert,

@DanHerbert, hai ragione, questo è un grosso difetto UX di questo metodo
Baumr

275

C'è un modo per fare in modo che una casella di testo riempia la larghezza del suo contenitore senza espandersi oltre?

Sì: usando la proprietà CSS3 'box-sizing: border-box', puoi ridefinire cosa significa 'larghezza' per includere il riempimento esterno e il bordo.

Sfortunatamente, poiché si tratta di CSS3, il supporto non è molto maturo e, poiché il processo di specifica non è ancora terminato, nel frattempo ha diversi nomi temporanei nei browser. Così:

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

L'alternativa della vecchia scuola è semplicemente quella di mettere una quantità di 'padding-right' sull'elemento <div> o <td> che racchiude uguale a circa la quantità di padding / border extra sinistro e destro in 'px' che pensi che i browser dare l'input. (In genere 6px per IE <8.)


Funzionerebbe alla grande, tranne che non posso usarlo perché sto prendendo di mira dispositivi mobili che probabilmente non lo supporteranno per anni. : - \
Dan Herbert

20
Penso che i dispositivi mobili dispongano del pieno supporto HTML5 prima dei computer.
Mariano Cavallo,

4
@Kindred: sicuramente no se includi IEMobile e Blackberry in questo.
bobince

1
Questo ha un ottimo supporto per i browser desktop, tuttavia: quirksmode.org/css/contents.html
logan

2
Come mi ci è voluto così tanto tempo per trovare questo fantastico salsa di burro ??? Possiamo per favore rendere questa la risposta accettata?
streetlogics,

14

Questo ha risolto il problema per me!

Senza la necessità di un div esterno. Basta applicarlo alla casella di testo specificata.

box-sizing: border-box; 

Con questa proprietà "Le proprietà di larghezza e altezza (e proprietà min / max) includono contenuto, riempimento e bordo, ma non il margine"

Vedi la descrizione della proprietà su w3schools .

Spero che questo aiuti qualcuno!


Meravigliosamente semplice! Grazie!
nurider,

10

Ho riscontrato questo problema da solo, e l'unica soluzione che ho trovato che ha funzionato in tutti i miei browser di test (IE6, IE7, Firefox) è stata la seguente:

  1. Avvolgere il campo di input in due DIV separati
  2. Impostare il DIV esterno su una larghezza del 100%, questo impedisce al nostro contenitore di traboccare il documento
  3. Inserire un'imbottitura nel DIV interno della quantità esatta per compensare il trabocco orizzontale dell'input.
  4. Imposta il padding personalizzato sull'input in modo che trabocchi della stessa quantità consentita nel DIV interno

Il codice:

<div style="width: 100%">
    <div style="padding-right: 6px;">
        <input type="text" style="width: 100%; padding: 2px; margin: 0;
                                  border : solid 1px #999" />
    </div>
</div>

Qui, l'overflow orizzontale totale per l'elemento di input è 6px - 2x (padding + border) - quindi impostiamo un padding-right per il DIV interno di 6px.


aggiungi all'elemento di input un padding di 8px e non funziona più
JuHwon

7

il supporto per il dimensionamento delle scatole è piuttosto buono in realtà: http://caniuse.com/#search=box-sizing

Quindi, a meno che non si scelga IE7, si dovrebbe essere in grado di risolvere questo tipo di problemi utilizzando questa proprietà. Un livello come sass o meno semplifica la gestione di regole prefissate del genere, tra l'altro.


3

In realtà, è perché CSS definisce il 100% rispetto all'intera larghezza del contenitore, compresi i suoi margini, bordi e riempimento; ciò significa che lo spazio è utile. il suo contenuto è inferiore del 100%, a meno che il contenitore non abbia margini, bordi o imbottiture.

Questo è controintuitivo e ampiamente considerato da molti come un errore di cui ora siamo bloccati . Significa effettivamente che le dimensioni% non vanno bene per qualcosa di diverso da un contenitore di livello superiore e anche in questo caso, solo se non ha margini, bordi o imbottiture.

Si noti che i margini, i bordi e il riempimento del campo di testo sono inclusi nella dimensione CSS specificata per esso: è il contenitore che butta via le cose.

Ho tollerabilmente lavorato su di esso usando il 98%, ma questa è una soluzione tutt'altro che perfetta, poiché i campi di input tendono a ridursi ulteriormente man mano che il contenitore diventa più grande.


EDIT: Mi sono imbattuto in questa domanda simile : non ho mai provato la risposta fornita e non so con certezza se si applica al tuo problema, ma sembra che lo farà.


1

Una soluzione che potrebbe funzionare (funziona per me) è applicare un margine negativo all'ingresso (casella di testo) ... o una larghezza fissa per ie7 o eliminare il supporto ie7. Questo risulta in pixel di larghezza perfetta .. Per me sono 7, quindi ho aggiunto 3 e 4 ma è comunque pixel perfetto ..

Ho avuto lo stesso problema e odiavo avere div extra per il confine ecc.!

Quindi ecco la mia soluzione che sembra funzionare!

Dovresti usare un foglio di stile solo ie7 per evitare gli Starhack.

input.text{
    background-color: #fbfbfb;
    border : solid #eee 1px;
    width: 100%;
    -box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 32px;

    *line-height:32px;
    *margin-left:-3px;
    *margin-right:-4px;
    display: inline;   
    padding: 0px 0 0 5px;

}

1

Se non puoi usarlo box-sizing:border-boxpuoi provare a rimuovere width:100%e mettere un sizeattributo molto grande <input>nell'elemento, lo svantaggio è tuttavia che devi modificare l'html e non puoi farlo solo con CSS:

<input size="1000"></input>

0

Se non hai bisogno di farlo dinamicamente (ad esempio, il tuo modulo ha una larghezza fissa) puoi semplicemente impostare la larghezza degli <input>elementi figlio sulla larghezza del loro contenitore meno eventuali decorazioni come imbottitura, margine, bordo, ecc .:

 // the parent div here has a width of 200px:
.form-signin input[type="text"], .form-signin input[type="password"], .form-signin input[type="email"], .form-signin input[type="number"] {
  font-size: 16px;
  height: auto;
  display: block;
  width: 280px;
  margin-bottom: 15px;
  padding: 7px 9px;
}

0

Se non è possibile utilizzare il ridimensionamento della casella (ad esempio quando si converte HTML in PDF utilizzando iText). Prova questo:

CSS

.input-wrapper { border: 1px solid #ccc; padding: 0 5px; min-height: 20px; } 
.input-wrapper input[type=text] { border: none; height: 20px; width: 100%; padding: 0; margin: 0; }

HTML

<div class="input-wrapper">
     <input type="text" value="" name="city"/>
</div>

0

Questo funziona:

<div>
    <input type="text" 
        style="margin: 5px; padding: 4px; border: 1px solid; 
        width: 200px; width: calc(100% - 20px);">
</div>

La prima "larghezza" è una regola di fallback per i browser più vecchi.


0

Dai uno stile all'input per compensare il padding extra. Nel seguente esempio il padding sull'input sarebbe 10px a sinistra e a destra per un offset di padding totale di 20px:

input[type=text]{
   width: calc(100% - 20px);
}
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.