Das Auffüllen innerhalb der Eingänge unterbricht die Breite um 100%

130

Ok, wir wissen also, dass das Festlegen des Auffüllens für ein Objekt dazu führt, dass sich seine Breite ändert, selbst wenn es explizit festgelegt wird. Während man die Logik dahinter argumentieren kann, verursacht sie einige Probleme mit einigen Elementen.

In den meisten Fällen fügen Sie einfach ein untergeordnetes Element hinzu und fügen diesem statt dem auf 100% festgelegten Element eine Auffüllung hinzu. Bei Formulareingaben ist dies jedoch kein möglicher Schritt.

Schau dir das an: http://sandman.net/test/formcss.html

Beim zweiten Eingang ist die Auffüllung auf 5 Pixel eingestellt, was ich der Standardeinstellung sehr vorziehe. Leider wächst die Eingabe dadurch in alle Richtungen um 10 Pixel, einschließlich des Hinzufügens von 10 Pixel zur 100% -Breite.

Das Problem hierbei ist, dass ich der Eingabe kein untergeordnetes Element hinzufügen kann, sodass ich es nicht beheben kann. Die Frage ist also:

Gibt es eine Möglichkeit, dem Eingang eine Auffüllung hinzuzufügen, während die Breite 100% bleibt? Es muss 100% sein, da die Formulare in Eltern unterschiedlicher Breite gerendert werden, sodass ich die Breite der Eltern nicht im Voraus kenne.

Sandmann
quelle
3
Siehe stackoverflow.com/questions/628500/… für die Verwendung des CSS3- box-sizingAttributs
Daniel LeCheminant
15
Ich muss nur sagen, danke, dass Sie Ihre Beispielseite die ganze Zeit auf dem Laufenden gehalten haben. Macht mich verrückt, wenn jemand eine URL in der Frage veröffentlicht und diese nicht mehr angezeigt wird, nachdem die Antwort beantwortet wurde, oder wenn er so etwas wie jsfiddle nicht verwendet.
Jonathan Dumaine
In Bezug auf die Verwendung des Box-Sizing-Attributs; Mein Problem war das gleiche Problem, aber mit der Höhe bedeutet das Einstellen der Höhe auf 100% allein Höhe + Rand + Polsterung = Containerhöhe. Um die Eingabe auf die tatsächliche Höhe des Containers zu bringen, musste ich einfach die Boxgröße: content-box verwenden.
Skychan
Außer was ich gerade gesagt habe funktioniert nicht im IE. IE11 mit Box-Größe: Content-Box passt die Höhe mit Höhe: 100% überhaupt nicht an. Es respektiert es mit spezifischer px Höhe. Die Höhe: 31 Pixel ohne Boxgröße ist also 6 Pixel kleiner als die Höhe: 31 Pixel + Boxgröße: Inhaltsfeld. Die Idee ist jedoch, die Höhe zu verwenden: 100%, damit ich mir keine Sorgen um die bestimmte Pixelgröße mache!
Skychan

Antworten:

288

Mit CSS3 können Sie die Größe des Eigenschaftsfelds verwenden, um zu ändern, wie der Browser die Breite der Eingabe berechnet .

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

Sie können mehr darüber hier lesen: http://css-tricks.com/box-sizing/

Víctor Dieppa Garriga
quelle
@ Víctor Dieppa Garriga Danke, es ist eine großartige Lösung.
Sinanakyazici
1
Die Unterstützung ist wie folgt: Chrome (beliebig): Box-Größe Opera 8.5+: Box-Größe Firefox (beliebig): -moz-Box-Größe Safari 3: -webkit-Box-Größe (in 5.1+ Versionen nicht festgelegt) IE8 +: Box -Größe. Auch ich empfehle dies für die akzeptierte Antwort, es ist eine elegantere Lösung.
Baconbeastnz
1
Um die Unterstützung der Boxgröße im IE zu verdeutlichen, funktioniert die Eigenschaft der Boxgröße im IE vom IE-Dokumentmodus. Sie funktioniert im "IE8-Standardmodus" und höher. Daher funktioniert es in der IE8-Browserversion auch, wenn der Dokumentmodus "IE8-Standardmodus" ist. Hoffe das hilft
Sanjeev
Ehrlich gesagt, box-sizing: border-box;ist das erste, woran ich dachte, aber es funktioniert absolut nicht für mich. Vielleicht spielt der Ur-Ur-Großelternteil display: flex;damit?
Cody
Sieht so aus, als ob es in allen gängigen Browsern ohne Präfix unterstützt wird und für mehrere Versoins gilt: caniuse.com/#feat=css3-boxsizing
Jason
7

Ich weiß nicht, wie browserübergreifend es kompatibel ist (es funktioniert in Firefox und Safari), aber Sie könnten diese Lösung ausprobieren:

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(Nur die Werte gepostet, die ich geändert habe)

Michaelk
quelle
1
Es verursacht Probleme im IE.
Tarik
Nun, das überrascht mich nicht sehr :) Denken Sie nicht, dass es eine einfache Cross-Browser-Lösung gibt, ohne das Markup zu ändern.
Michaelk
Ok, ich stimme jetzt für diese Lösung, seit ich den Rand hinzugefügt habe: -5px ist anscheinend keine Verletzung. Ich habe der Seite, die dies verwendet, eine vierte Eingabe hinzugefügt, die anscheinend tatsächlich funktioniert. jigsaw.w3.org/css-validator/…
Sandman
7

Eine Möglichkeit besteht darin, das INPUTin ein zu wickeln, das DIVdie Polsterung hat.

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>
user7116
quelle
8
Das Auffüllen eines Container-Div führt zu nicht identischen Ergebnissen beim Auffüllen eines Eingabefelds.
Felix Fung
Fügen Sie hinzu, was Felix Fung gesagt hat - Sie verlieren die Fähigkeit, mit der Maus im Auffüllbereich zu klicken und das Eingabefeld zu fokussieren - unter anderem auffälligere Probleme. Ich wollte nur auf dieses weniger bekannte / bekannte Problem hinweisen - es ärgert mich unendlich, wenn ich Webseiten verwende, die diesen Hack verwenden.
Eselk
5

Das oft Vergessene calckann hier zur Rettung kommen:

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

Da wir wissen, dass die Auffüllung die Breite des Elements erhöht, subtrahieren wir einfach die Auffüllung von der Gesamtbreite. Es wird von allen gängigen Browsern unterstützt, reagiert und erfordert keine chaotischen Wrapper-Divs.

XanderStrike
quelle
4

Ich hatte einige Probleme mit etwas Ähnlichem. Ich habe tds mit Eingängen von 100% und einer kleinen Polsterung. Was ich getan habe, war die Polsterung auf dem td wie folgt zu kompensieren:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

Auffüllen von 8px, um den Rand und das Auffüllen des Eingabe- / Textbereichs einzuschließen. Hoffe das hilft!

Keye
quelle
Diese Technik eignet sich hervorragend, um die Breite von Zellen, die gepolsterte Eingaben enthalten, mit Zellen abzugleichen, die dies nicht tun. Wenden Sie das Auffüllrecht einfach selektiv auf alle TD an, die eine Eingabe mit 100% Breite enthalten.
Seb Barre
1

Nehmen Sie vielleicht den Rand + Hintergrund vom inputund schließen Sie ihn stattdessen in einen divmit Rand + Hintergrund und Breite: 100% ein und setzen Sie einen Rand auf den input?

Bernstein
quelle
Das ist die Art von Hack, die ich derzeit für dieses Problem verwende, aber ich würde aus "Stilgründen" oder so weiter lieber einen Rand für die Eingabe verwenden. Aber ja, so mache ich es derzeit, es ist eine praktikable Lösung
Sandman
1

Eine Lösung, die ich gefunden habe, besteht darin, die Eingabe absolut mit einem relativ positionierten übergeordneten Tag zu positionieren.

<p class="full-width-input">
    <input type="text" class="text />
</p>

Die wenden den Stil an:

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

Das einzige, was Sie beachten müssen, ist, dass das Absatz-Tag eine Höheneinstellung benötigt, da seine absolut positionierten untergeordneten Elemente seine Höhe nicht erweitern. Dies vermeidet die Notwendigkeit des Einstellens, width: 100%indem es an der linken und rechten Seite des übergeordneten Elements gesperrt wird.

Gabz
quelle
0

Versuchen Sie, Prozentsätze für Ihre Polsterung zu verwenden:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

Wenn Sie sich Sorgen über Benutzer in alten Browsern machen, die den Box-Shadow nicht sehen können, geben Sie der Eingabe als Backup einfach eine subtile Hintergrundfarbe. Wenn Sie Pixel für diese Art von Dingen verwenden, besteht die Möglichkeit, dass Sie sie an anderer Stelle verwenden, was einige zusätzliche Herausforderungen mit sich bringen könnte. Lassen Sie mich wissen, wenn Sie auf sie stoßen.

stephenmurdoch
quelle
-3

Ich weiß nur, dass ich Werte wie diese 100% -10 zuweisen kann, um dies zu verhindern. Es gibt jedoch einige Kompatibilitätsprobleme.

Tarik
quelle