これが発生する理由は、span
要素がdisplay: inline
要素であり、ブラウザーがテキスト ノードの場合と同様に要素の周りにスペースを配置するためです。これにより、これらのコンポーネントによって消費されるスペースの量は、それらの幅にコンポーネント間のスペースの量を加えたものになります。
span
これを実証するために、HTML の要素間のスペースをすべて削除しました。
<div style="width: 200px; border: solid black 1px">
<textarea></textarea><span>SibOne</span><span>SibTwo</span>
</div>
注意が必要なもう 1 つの領域は、元のコードがテキストエリアのボックス モデルの他のコンポーネント (マージン、ボーダー、パディングなど) によって使用される幅の量を考慮していないことです。
// Get the amount of horizontal space used up by the textarea margin, border, and padding
var selfUnfactoredWidth = parseInt($self.css('margin-left'), 10)
+ parseInt($self.css('margin-right'), 10)
+ parseInt($self.css('border-left-width'), 10)
+ parseInt($self.css('border-right-width'), 10)
+ parseInt($self.css('padding-left'), 10)
+ parseInt($self.css('padding-right'), 10);
$self.css({
"max-width": $self.parent().innerWidth() - selfUnfactoredWidth - siblingsWidth
});
デモ
または、デフォルトのCSS ボックス モデルbox-sizing
を変更するために使用できます。
textarea {
resize: none;
border: solid black 1px;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
これを行うと、変更されたボックスモデルが処理するため、以前のボーダーとパディングの幅を省略することができます。
// Get the amount of horizontal space used up by the textarea margin, border, and padding
var selfUnfactoredWidth = parseInt($self.css('margin-left'), 10)
+ parseInt($self.css('margin-right'), 10);
$self.css({
"max-width": $self.parent().innerWidth() - selfUnfactoredWidth - siblingsWidth
});
デモ (使用box-sizing
)