为什么带文字的按钮会被按下?
这里有一些因素在起作用。文本和行内元素默认垂直对齐到基线。基线是一个由元素的line-height
决定的值,没有line-height
的元素将确定一个“合理”的值[1]。在空元素的情况下,这个值将为0。但当你添加文本时,元素就会获得一个line-height
并向下移动相应的距离。[2]
一个简单的解决方案是通过应用vertical-align: top
来强制使输入框以相同的对齐方式呈现,无论是否有文本。
为什么按钮之间会有空格?
行内元素(以及像您的输入框一样的inline-block
元素)将自然地侧-by-side对齐,但它们的行为类似于文本[3]。就像如果你在HTML中的两个字母之间放置一个换行符一样,行内元素之间的换行符将在它们之间添加一个空格。
假设你把所有的输入框都放在一行上(没有空格),那么它就可以解决你的问题:
<input type="button" value="these" /><input type="button" value="are" /><input type="button" value="touching" />
<br><br>
<input type="button" value="these" />
<input type="button" value="are" />
<input type="button" value="not" />
虽然我不建议使用这种方法 - 这只是为了演示目的。
所以什么是解决方案呢?
好吧,你有几个选择。选择你认为最适合你的那个。
解决方案1:将输入内容包装在一个容器中,并对其应用“font-size:0”。空格仍然存在,但“font-size:0”确保它们不可见。
input {
background-color: #e7e7e7;
border: solid;
border-width: 1px;
text-align: center;
height: 50px;
width: 50px;
padding: 0px;
margin: 0px;
vertical-align: top;
font-size: 12px;
}
.container {
font-size: 0;
}
<div class="container">
<input type="button" value="foo">
<input type="button" value="">
<input type="button" value="">
<br/>
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<br/>
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
</div>
解决方案 2:绕过inline
元素的琐碎问题,使用display: block
和float
。
input {
background-color: #e7e7e7;
border: solid;
border-width: 1px;
text-align: center;
height: 50px;
width: 50px;
padding: 0px;
margin: 0px;
font-size: 12px;
float: left;
display: block;
}
.row {display: block;}
.row::after {
display: block;
content: '';
clear: both;
}
<div class="row">
<input type="button" value="foo">
<input type="button" value="">
<input type="button" value="">
</div>
<div class="row">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
</div>
<div class="row">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
</div>
解决方案3:使用更现代的方法,比如flexbox。
input {
background-color: #e7e7e7;
border: solid;
border-width: 1px;
text-align: center;
height: 50px;
width: 50px;
padding: 0px;
margin: 0px;
vertical-align: top;
font-size: 12px;
}
.container {
display: flex;
flex-wrap: wrap;
width: 150px;
}
<div class="container">
<input type="button" value="foo">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
<input type="button" value="">
</div>
参考资料
1: "normal: 告诉浏览器将计算值设置为“合理”的值"
2: "对于内联非替换元素,用于对齐的框是高度为'line-height'的框。
3: "内联级别元素生成内联级别框,这些框参与内联格式上下文。"