我有下面的CSS和HTML片段正在呈现。

文本区域 { 边框:1px实体#999999; 宽度:100%; 保证金:5 px 0; 填充:3 px; } <div style="display: block;" id="rulesformitem" class="formitem"> <label for="rules" id="ruleslabel">规则:</label> <textarea cols="2" rows="10" id="rules"> < / div >

问题是文本区域最终比父区域宽8px(边界为2px +填充为6px)。是否有一种方法继续使用边框和填充,但限制文本区域的总大小为父的宽度?


当前回答

对于使用Bootstrap的人,textarea。表单控制也会导致文本区域大小问题。Chrome和Firefox似乎使用不同的高度与以下引导CSS:

textarea.form-conrtol{
    height:auto;
}

其他回答

问题在于box-sizing属性。 默认情况下,box-sizing属性的初始值是content-box。 所以你在引擎盖下面有这样的东西:

textarea {
  border:1px solid #999999;
  width:100%;
  margin:5px 0;
  padding:3px;
  box-sizing: content-box;
}

box-sizing:内容框;意味着实际元素的宽度等于元素内容框的宽度。 所以当你添加padding(在这个例子中padding-right和padding-left ->,因为我们在讨论width)和border(在这个例子中border-right和border-left ->,因为我们在讨论width),这些值被添加到最终的width中。所以你的元素会比你想要的宽。

设置为box-sizing: border-box;。宽度的计算方法如下:

horizontal border + horizontal padding + width of content box = width

在这种情况下,当你添加水平边框和水平填充时,元素的最终宽度不会改变,事实上,内容框将缩小以满足方程。

我在这里遇到了另一个解决方案,它非常简单:在textarea的容器中添加padding-right。这保留了文本区域的边距、边框和填充,从而避免了Beck指出的chrome和safari在文本区域周围放置焦点高亮的问题。

容器的padding-right应该是文本区域两侧的有效边距、边框和填充之和,再加上容器可能需要的任何填充。对于原题中的情况

textarea{
    border:1px solid #999999;
    width:100%;
    margin:5px 0;
    padding:3px;
}
.textareacontainer{
    padding-right: 8px; /* 1 + 3 + 3 + 1 */
}

<div class=“textareacontainer”> <textarea></textarea> </div>

不,CSS不能这样做。这就是微软最初引入另一种可能更实用的盒子模型的原因。最终获胜的盒子模型使得混合百分比和单位不切实际。

我不认为这是可以与你表达填充和边界宽度的百分比的父。

许多CSS格式问题的答案似乎是“添加另一个<div>!”

所以,在这种精神,你有没有尝试添加一个包装div的边界/填充应用,然后把100%宽度的文本区域里面?比如(未经测试):

文本区域 { 宽度:100%; } .textwrapper { 边框:1px实体#999999; 保证金:5 px 0; 填充:3 px; } <div style="display: block;" id="rulesformitem" class="formitem"> <label for="rules" id="ruleslabel">规则:</label> <div class=" texttwrapper "><textarea cols="2" rows="10" id="rules"/></div> < / div >

那么负边际呢?

textarea {
    border:1px solid #999999;
    width:100%;
    margin:5px -4px; /* 4px = border+padding on one side */
    padding:3px;
}