Wie erstelle ich eine Elementbreite: 100% minus Polsterung?

396

Ich habe eine HTML-Eingabe.

padding: 5px 10px;Ich möchte, dass die Eingabe 100% der Breite des übergeordneten Divs beträgt (was fließend ist).

Verwendung jedoch width: 100%;Ursachen die Eingabe zu sein , 100% + 20pxwie ich das umgehen kann?

Beispiel

Hagelholz
quelle
1
Siehe diese Antwort, die ich vor nicht einmal 15 Minuten gepostet habe: stackoverflow.com/questions/5219030/… Dies sollte perfekt für Sie funktionieren, es sei denn, Sie benötigen es, um in IE7 zu funktionieren.
dreißig Punkte
Wenn Sie meine Methode verwendet haben, lesen Sie die geringfügige Änderung, die ich gerade an meiner Antwort vorgenommen habe. In einigen Browsern wird ein "gleichmäßiges Auffüllen" sichergestellt.
dreißig Punkte
@ Hagelholz Ich habe Lösung, die Polsterung für inputund Unterstützung von IE7
Vladimir Starkov
Bitte sehen Sie auch die Antwort unten mit der Calc-Funktion
Daan

Antworten:

485

box-sizing: border-box ist eine schnelle und einfache Möglichkeit, das Problem zu beheben:

Dies funktioniert in allen modernen Browsern und IE8 +.

Hier ist eine Demo: http://jsfiddle.net/thirtydot/QkmSk/301/

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

Die Versionen mit Browserpräfix ( -webkit-box-sizingusw.) werden in modernen Browsern nicht benötigt.

dreißig Punkte
quelle
5
Ich denke nicht, dass dies eine so schlechte Lösung ist. Im Allgemeinen ist das Umschließen von Elementen in ein zusätzliches Div eine gute Möglichkeit, Elemente aufzufüllen, ohne die Gesamtbreite des Elements über den übergeordneten Container hinaus zu verschieben.
Jake Wilson
1
Das Auffüllen eines Wrapping-Divs führt auch zu nicht identischen Ergebnissen beim direkten Auffüllen der Eingabe.
Felix Fung
@ Thirtydot Ich habe einige flexiblere und elegantere Lösungen, die die Breite der Eingabe beibehalten
Vladimir Starkov
8
@ Thirtydot Ja, lassen Sie es einfach für IE7 kaputt und lassen Sie M $ das beheben :)
Petr Peller
Auf diese Weise werden auch Textbereiche für die automatische Größenänderung für jeden von Ihnen beibehalten.
Michael J. Calkins
276

Deshalb haben wir box-sizingin CSS.

Ich habe Ihr Beispiel bearbeitet und jetzt funktioniert es in Safari, Chrome, Firefox und Opera. Probieren Sie es aus: http://jsfiddle.net/mathias/Bupr3/ Alles, was ich hinzugefügt habe, war Folgendes :

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

Leider unterstützen ältere Browser wie IE7 dies nicht. Wenn Sie nach einer Lösung suchen, die in alten IEs funktioniert, lesen Sie die anderen Antworten.

Mathias Bynens
quelle
3
+1, aber caniuse.com/#search=box-sizing IE 8? Außerdem scheint github.com/Schepp/box-sizing-polyfill eine Lösung für IE 6-7 zu bieten.
Alix Axel
1
+1, das ist großartig, wenn Sie sich nicht für IE interessieren (wenn Sie zum Beispiel PhoneGap verwenden)
Luke B.
3
Was für eine Art von Zauberei ist das? +1 für die Antwort und +1 für den Kommentar über mir (genau dafür brauche ich ihn).
Eduard Luca
20
Dies sollte das Standardverhalten sein. Anstelle von +20 bis Breite. Manchmal scheint CSS ernsthaft durcheinander zu sein.
Soth
2
Um die Unterstützung der Boxgröße im IE zu verdeutlichen, funktioniert die Eigenschaft der IE-Boxgröße vom IE-Dokumentmodus ab "IE8-Standardmodus" und höher. Daher funktioniert es in der IE8-Browserversion auch, wenn der Dokumentmodus "IE8-Standardmodus" ist. Hoffe das hilft.
Sanjeev
40

Verwenden Sie die Polsterung auch in Prozent und entfernen Sie sie aus der Breite:

Polsterung: 5%;
Breite: 90%;
Alex
quelle
19
Zu Ihrer Information, diese Lösung ist nur ideal für nicht flexible Layouts.
Muffs
+1, Das Problem dabei wären wohl die Grenzen. Normalerweise sehen sie nur mit maximal 1 bis 3 Pixel "richtig" aus. Die Ergebnisse sind angesichts der Browser-Inkonsistenzen bei der Rundung von Subpixeln zu unvorhersehbar.
Alix Axel
27

Sie können es ohne Verwendung box-sizingund nicht klare Lösungen wie tun width~=99%.

Demo auf jsFiddle :
Geben Sie hier die Bildbeschreibung ein

  • Behalten Sie die Eingaben paddingundborder
  • Addiere zum Eingang negative horizontale margin= border-width+horizontal padding
  • Zum horizontalen Wrapper der Eingabe hinzufügen padding, der margindem vorherigen Schritt entspricht

HTML-Markup:

<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 */ 
}
Vladimir Starkov
quelle
4
Das ist ein guter Trick, um den Rand für die Eingabe und das Auffüllen für den Wrapper zu verwenden, um das Auffüllen der Eingabe zu kompensieren.
maulik13
Stimme vollkommen zu !!! Ich habe diese Lösung verwendet und sie funktioniert weitgehend ohne schmutzige Tricks! Dies musste die Lösung für jede Art dieser Antworten sein.
Andre Figueiredo
Ich verstehe nicht ganz, welche Rolle der negative Rand spielt - alles was ich weiß ist, dass wenn der Wert falsch ist, die Box auf einer Seite endet, aber irgendwie behebt ein symmetrischer Rand dies
Casebash
21

Verwenden Sie css calc ()

Super einfach und super.

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

Wie hier zu sehen: Div Breite 100% minus feste Pixelanzahl
Von webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Originalquelle: http://web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

Habe das hier einfach kopiert, weil ich es im anderen Thread fast verpasst habe.

Daan
quelle
Sie müssen dies jedoch manuell programmieren. Im Idealfall wird es automatisch ermittelt.
JackHasaKeyboard
11

Angenommen, ich bin in einem Container mit 15px Polsterung, dann verwende ich das immer für den inneren Teil:

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

Dadurch wird der Innenteil auf die Breite gedehnt, die auf beiden Seiten weniger als 15 Pixel betragen sollte.

Andologie
quelle
Könnten Sie ein vollständiges Beispiel für die width:autoAnwendung auf ein inputFeld veröffentlichen?
Jakubiszon
das ist nur eine halbe Antwort. Die Standardposition der Elemente ist statisch, sodass links und rechts hier genau nichts bewirken. und width auto ist auch der Anfangswert, also .. alles, was diese Antwort tut, ist nichts :)
honk31
5

Sie können einige Positionierungstricks ausprobieren. Sie können die Eingabe in ein div mit position: relativeund einer festen Höhe setzen, dann auf die Eingabe haben position: absolute; left: 0; right: 0;und jede Auffüllung, die Sie mögen.

Live Beispiel

Felix
quelle
In welchen Browsern haben Sie dies getestet? :(
dreißig Punkte
Hmm, funktioniert nur in Chrome. Aber ich weiß, dass ich etwas sehr Ähnliches habe, um auch in FF & IE zu arbeiten.
Felix
Scheint, als würde es nicht mit <input>Elementen in Firefox funktionieren (idk about IE). Es funktioniert jedoch mit <div>s. Und nein, display: blockdas <input>funktioniert auch nicht: - /
Felix
5

Hier ist die Empfehlung von codeontrack.com , die gute Lösungsbeispiele enthält:

Anstatt die Breite des div auf 100% zu setzen, stellen Sie es auf auto ein und stellen Sie sicher, dass das <div>auf display: block eingestellt ist (Standard für <div>).

MEIN PC
quelle
3
Sie sollten den Link nicht direkt posten. Sie können die Informationen von diesem Link einfügen. Grund dafür ist, dass morgen möglicherweise kein Link verfügbar ist und Ihre Antwort dann nicht mehr gültig ist.
Amnesh Goel
4

Verschieben Sie die Auffüllung des Eingabefelds in ein Wrapper-Element.

<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>

Siehe Beispiel hier: http://jsfiddle.net/L7wYD/1/

Martin Jespersen
quelle
2

Verstehe einfach den Unterschied zwischen Breite: auto; und Breite: 100%; Breite: auto; berechnet (AUTO) MATICALLY die Breite, um die genaue Angabe des Wickelbereichs einschließlich der Polsterung zu treffen. Breite 100% erweitert die Breite und fügt die Polsterung hinzu.

user3849374
quelle
Können Sie ein Beispiel hinzufügen, in dem dies mit <Eingabe> funktioniert? Ansonsten schickst du nur Leute auf eine wilde Gänsejagd.
Herr Lister
0

Was ist mit dem Einwickeln in einen Behälter? Behälter sollten Stil haben wie:

{
    width:100%;
    border: 10px solid transparent;
}
Vitali Protosovitski
quelle
0

Versuche dies:

width: 100%;
box-sizing: border-box;
Manolo Ramos
quelle
-1

Für mich war margin:15px;padding:10px 0 15px 23px;width:100%das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Die Lösung für mich war, width:autostatt zu verwenden width:100%. Mein neuer Code war:

margin:15px;padding:10px 0 15px 23px;width:auto. Dann ist das Element richtig ausgerichtet:

Geben Sie hier die Bildbeschreibung ein

Jaime Montoya
quelle
-1

Ich hatte das gleiche Problem. Repariere es so:

width: 100%;
box-sizing: border-box;
Manny Alvarado
quelle
-9

Du kannst das:

width: auto;
padding: 20px;
MissHD
quelle
Dies ist nicht die gleiche 100% -Marge.
James