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


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.


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.


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

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

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.


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.


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


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


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/


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.


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


-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


-1

Ich hatte das gleiche Problem. Repariere es so:

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

-9

Du kannst das:

width: auto;
padding: 20px;

Dies ist nicht die gleiche 100% -Marge.
James
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.