2012-01-22 11 views
8

いくつかのフォーム要素でかなり正確なスタイリングをしようとしています。この問題は私に多くの悲しみを引き起こしています。<input>には不思議なボトムパッドが付いています

Iフィールドのサイズは、純粋にテキストによって決定されるように、入力フィールドは、任意のより数ピクセルパディングを有する終わる(display: blockで)<input>からpaddingmarginborderoutlineを除去しようとします他のブロックレベルの要素はまったく同じ方法でスタイルされています。ここでは例です: http://jsfiddle.net/nottrobin/b9zfa/

<input class="normalised testSubject" value="hello" /> 
<div class="normalised testSubject">hello</div> 

はレンダリング:その例で

Rendering

<input>19pxの計算高さを取得しながら、<div>16pxの計算高さを取得します。

Chrome 16、Firefox 9、およびOpera 11では同じ動作をするので、明らかにエンジンに依存しません。

手作業で高さを追加することで問題を解決できますが、設計をresponsiveのままにしておきたいので、これをしたくありません。

ここで何が起こっているのか理解できたら助けてくれるのですが、どのようにして<input>がそれに続くブロックレベルの要素と同じ高さになるかを確実に確認できますか?

+3

'.normalised' CSSから' line-height:1em'を削除して同じ高さにします。これは 'div'を' input'フィールドと同じ高さにします。この修正された[フィドル](http://jsfiddle.net/uday99/b9zfa/4/) – uday

+0

@Daveを参照してください:私はそれを確認したクロム17。 –

+0

@ EnvanMulawskiありがとう。 :) – uday

答えて

13

<input>のフォントサイズは、最小でline-heightです。両方の要素をより大きな値に設定すると、line-heightも削除されます。しかし、それでもあなたは最小値よりも小さな高さを持つことができません。そのための修正点は、first-line疑似要素を使用し、display: inline-block;に設定しています。

デモ:http://jsfiddle.net/ThinkingStiff/B7cmQ/

enter image description here

CSS:

.normalised:first-line { 
    display: inline-block;  
} 

しかし<input>が異なっ<div>よりも機能している理由を説明しません。 -webkit-appearance: none;でもそれを修正しませんでした。その内容をinlineとして扱う入力には、いくつかの目に見えないブードーがあるようです。 inlineの要素はフォントサイズに基づいて最小値を持つline-heightです。これはここで見ている動作です。だから、first-lineがそれを修正したのです。それは<input>の "子"要素をスタイリングしているようです。

line-heightinline個の要素に表示されているデモです。 <div>要素の称号はline-height: 7px;です。 <span>は、その計算値が7px;を示していても、視覚的にはそれを尊重していません。

デモ:http://jsfiddle.net/ThinkingStiff/zhReb/

出力:

enter image description here

HTML:

<div id="container"> 
    <div id="div-large">div <br />large</div> 
</div> 
<div id="container"> 
    <div id="div-medium">div <br />med</div> 
</div> 
<div id="container"> 
    <div id="div-small">div <br />small</div> 
</div> 
<div id="container"> 
    <span id="span-large">span <br />large</span> 
</div> 
<div id="container"> 
    <span id="span-medium">span <br />med</span> 
</div> 
<div id="container"> 
    <span id="span-small">span <br />small</span> 
</div> 

はCSS:

#container { 
    background-color: lightblue; 
    display: inline-block; 
    height: 200px; 
    vertical-align: top; 
} 

#div-large { 
    line-height: 50px; 
} 

#div-medium { 
    line-height: 20px; 
} 

#div-small { 
    line-height: 7px; 
} 

#span-large { 
    line-height: 50px; 
    vertical-align: top; 
} 

#span-medium { 
    line-height: 20px; 
    vertical-align: top; 
} 

#span-small { 
    line-height: 7px; 
    vertical-align: top; 
} 
+0

素敵な説明、ありがとうございました。私は完全にあなたの最初の子供のソリューションのクロスブラウザをテストしていないが、それはかなり有望に見えます。この動作がHTML5の "プレースホルダ"をサポートするブラウザにのみ存在するのではないかと思いますか?レンダリングエンジンはフォームフィールド内に要素を作成して、何らかの形でコンテンツを操作するのに役立ちます。とにかく、これが答えです。どうもありがとう。 –

+0

@RobinWinslow IE7 +と他のすべてのブラウザ:http://www.quirksmode.org/css/contents.html#t17 – ThinkingStiff

+0

私の意図したものではありません。私は、 ':first-line''を' inner-block'にするという修正が、クロスブラウザで動作することを意味していました。しかし、それはおそらくそうです。 –

0

あなたはまったく同じフォント(サイズを含む)を使用していますか?

inputbox-sizing: border-boxを追加してみてください。

私はこの問題を自分で持っていたことがありませんが、私はどこかIE9でテストとしてそれをのみを使用しました...

+0

フォーム要素はデフォルトでは 'border-box'ですが、他の要素の' content-box'と一貫性を持たせるようにリセットしています。 – BoltClock

1

line-heightを削除する問題を解決するようです。

See fiddle。 FF thoでのみテストされています。

+0

無効な値を渡して行の高さを効果的に削除したため、 'line-height:medium'はありません。なぜラインハイトを取り除くのか、それは私が理解しようとしていることです。 –

+0

ああ、そういう点に感謝しています。答えを編集しました。 – mreq

+0

line-heightを削除する代わりに 'line-height:normal'を指定してください。 –

0

私はKNこんにちは私はこの質問に数ヶ月遅れていますが、私はGoogle検索でそれを見つけ出し、Firefoxの<input>要素に関していくつかの他の答えを明確にするのに役立つものを追加したかったのです。

Firefoxのデフォルトのフォームのスタイリングは、いくつかの厄介なCSSが含まれています

input { 
    ... 
    line-height: normal !important; 
    ... 
} 

これはFirefoxで任意のフォーム入力のline-heightプロパティをオーバーライドすることが効果的にできなくなります。この問題は長年にわたり存在していましたが、FF devsが規則から!importantを削除するのは簡単ではないように思えますが、そうすることでいくつかのアンダーフード実装の問題があります。また、明らかに、このルールの振る舞いについてに依存するいくつかのウェブサイト(YouTubeを含む)があります。

詳細については、Mozilla bug #349259を参照してください。また、456bereastreet.comには、良いブログ記事があり、もう1つ(古い)は、meyerweb.comのEric Meyerです。

関連する問題