发生这种情况的原因是span元素是display: inline元素,浏览器会在它们周围放置空格,就像放置文本节点一样。这导致这些组件占用的空间量等于它们的宽度加上它们之间的空间量。
为了证明这一点,我删除span了 HTML 中元素之间的所有间距。
<div style="width: 200px; border: solid black 1px">
    <textarea></textarea><span>SibOne</span><span>SibTwo</span>
</div>
另一个需要注意的地方是原始代码没有考虑到文本区域框模型的其他组件(例如,边距、边框、填充)所用的宽度量。
// 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
});
演示
或者,您可以使用box-sizing修改默认CSS 框模型。
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)