2009-09-04 9 views
93

Ok, so wissen wir, dass das Festlegen der Auffüllung auf ein Objekt seine Breite ändert, auch wenn es explizit festgelegt ist. Während man die Logik dahinter argumentieren kann, verursacht es einige Probleme mit einigen Elementen.Padding innerhalb von Eingängen bricht Breite 100%

In den meisten Fällen fügen Sie einfach ein untergeordnetes Element hinzu und fügen anstelle dieses auf 100% hinzu, aber für Formulareingaben ist das kein möglicher Schritt.

einen Blick auf diese: http://sandman.net/test/formcss.html

Der zweite Eingang seiner Polsterung 5px, die ich sehr viel lieber auf die Standardeinstellung gesetzt hat. Aber das lässt die Eingabe in alle Richtungen um 10px wachsen, einschließlich 10px zur 100% Breite.

Problem hier ist, dass ich ein Kindelement innerhalb der Eingabe nicht hinzufügen kann, damit ich es nicht beheben kann. Die Frage ist also:

Gibt es eine Möglichkeit, Padding innerhalb der Eingabe hinzuzufügen, während immer noch die Breite 100%? Es muss 100% sein, da die Formulare in Eltern mit unterschiedlicher Breite dargestellt werden, so dass ich die Breite des Elternteils vorher nicht kenne.

+3

Siehe http://stackoverflow.com/questions/628500/can-i-stop-100-width-text-boxes-from-exteen-beyond-their-containers/628912#628912 für wie Sie das CSS3 'verwenden box-sizing' Attribut –

+11

Ich muss nur sagen, danke, dass du deine Beispielseite die ganze Zeit aufgespart hast. Macht mich verrückt, wenn jemand eine URL in der Frage postet und es ist unten, nachdem die Antwort beantwortet wird oder sie nicht etwas wie jsfiddle verwenden. –

+0

In Bezug auf die Verwendung von Box-Sizing-Attribut; Mein Problem war das gleiche Problem, aber mit der Höhe - Einstellung der Höhe auf 100% bedeutet, Höhe + Rahmen + Polsterung = Container Höhe. Um die Eingabe zu erhalten, um die tatsächliche Höhe des Containers zu haben, musste ich einfach Box-Sizing verwenden: content-box. – Skychan

Antwort

7

Ich weiß nicht, wie Cross-Browser-kompatibel ist (es funktioniert in Firefox und Safari), aber man konnte diese Lösung versuchen:

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

(Nur die Werte geschrieben, die ich geändert)

+1

Es verursacht Problem in IE. – Tarik

+1

Ich würde lieber Standard-Code für so eine "einfache" Sache verwenden ... – Sandman

+0

Nun, das überrascht mich nicht viel :) Denken Sie nicht, dass es eine einfache Cross-Browser-Lösung ohne Änderung der Markup ist. – michaelk

-1

Nur was ich weiß, um dies zu verhindern, ist, Werte wie diese 100% -10 zuzuweisen. Aber es hat einige Kompatibilitätsprobleme tho.

1

Vielleicht nehmen Sie den Rand + Hintergrund von der input, und schließen Sie es stattdessen in eine div mit Rahmen + Hintergrund und Breite: 100%, und setzen Sie einen Rand auf die input?

+0

Das ist die Art von Hack ich verwende derzeit für dieses Problem, aber ich würde lieber Grenze für die Eingabe für "Stil Gründe" oder was nicht. Aber ja, das ist, was ich gerade mache, so ist es eine praktikable Lösung – Sandman

7

Eine Option besteht darin, die INPUT in eine DIV zu verpacken, die das Padding 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> 
+8

Auffüllen eines Container-Div erzeugt nicht identische Ergebnisse zum Hinzufügen von Padding zu einem Eingabefeld. –

+0

Hinzufügen zu dem, was Felix Fung gesagt hat - Sie verlieren die Fähigkeit, mit der Maus im Auffüllbereich zu klicken und das Eingabefeld zu fokussieren - unter anderen auffälligen Problemen. Ich wollte nur auf dieses weniger bekannte/bekannte Problem hinweisen - Es nervt mich bei der Verwendung von Webseiten, die diesen Hack verwenden, bis zu einem Ende. – eselk

4

Ich habe mit so etwas wie dies einige Fragen. Ich habe tds mit Eingaben von 100% und einer kleinen Polsterung. Was ich tat, war für die Polsterung am td kompensiert wie folgt:

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

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

Polsterung von 8px an die Grenze und Polsterung der Ein-/TextArea- umfassen. Hoffe, das hilft!

+0

Diese Technik eignet sich hervorragend zum Anordnen der Breite von Zellen, die gepolsterte Eingänge mit Zellen enthalten, die nicht gepolt sind. Sie können das Padding-Recht selektiv auf jedes TD anwenden, das eine Eingabe mit 100% Breite enthält. –

1

Eine Lösung, die ich gefunden habe, ist die absolute Positionierung der Eingabe mit einem relativ positionierten Eltern-Tag.

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

Die den Stil anwenden:

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 zu beachten ist, dass der Absatz-Tag eine Höhe muss Einstellung als absolut positioniert Kinder nicht seine Höhe erweitern. Auf diese Weise müssen Sie width: 100% nicht festlegen, indem Sie sie an der linken und rechten Seite des übergeordneten Elements sperren.

+1

getestet .. es funktioniert nicht ... Könnten Sie bitte eine Demo veröffentlichen? – mrdaliri

211

CSS3 verwenden können Sie die Eigenschaft Box-Sizing ändern verwenden, wie der Browser die mit dem Eingang 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+ */ 
    } 

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

+3

+1 und wenn mein Chef schließlich entschieden hat, dass wir Unterstützung für IE7 fallen lassen können, muss es überhaupt nicht viel benutzt werden .. er ist super old-school. – eselk

+0

@ Víctor Dieppa Garriga Vielen Dank, es ist eine großartige Lösung. – sinanakyazici

+1

Unterstützung ist wie folgt: Chrome (beliebig): Box-Sizing Opera 8.5+: Box-Sizing Firefox (beliebig): -moz-Box-Sizing Safari 3: -Webkit-Box-Sizing (in 5.1-Versionen) IE8 +: Box-Sizing. Auch empfehle ich dies für die angenommene Antwort, es ist eine elegantere Lösung. – Baconbeastnz

0

Versuchen Prozentsätze für die Polsterung mit:

.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 über Benutzer auf alten Browsern besorgt sind, die die nicht sehen können box-shadow, gib der Eingabe einfach eine subtile Hintergrundfarbe als Backup. Wenn du Pixel für diese Art von Dingen verwendest, sind die Chancen groß, dass du sie an anderer Stelle verwendest, was ein paar zusätzliche Herausforderungen darstellen könnte, lass es mich wissen, wenn du ihnen begegnest.

2

der oft vergessenen calc kann hier zur Rettung kommen:

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

Da wir die Polsterung wissen auf die Breite des Elements hinzufügen, werden wir einfach die Polsterung von der Gesamtbreite abzuziehen. Es wird von allen gängigen Browsern unterstützt, ist reaktionsschnell und benötigt keine unordentlichen Wrapperdivs.