使用行高对框和基线进行稳健的垂直对齐?
Robust vertical alignment of both box and baseline using line-height?
当在一行中的元素上设置相同的 line-height、height 和 box-sizing: border-box 时,我希望它们正确垂直对齐(在基线和框处)。
运气不好:对于 input/span and/or with-border/without-border 的某些组合,对齐似乎总是偏离一个像素。
见下文或http://jsfiddle.net/xcgyh22q/9/
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 22px;
line-height: 22px;
border: none;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
}
input {
background-color: #A6A6A6;
}
.border {
border: 1px solid black;
}
.vmiddle {
vertical-align: middle;
}
p {
margin: 5px;
}
<h4>Two spans</h4>
One span has border - fail...
<p><span>_asd_</span><span class="border">_asd_</span></p>
One span has border - fail...
<p><span class="border">_asd_</span><span>_asd_</span></p>
Both spans have border - success
<p><span class="border">_asd_</span><span class="border">_asd_</span></p>
<h4>One input, one span - not the same</h4>
No borders - success
<p><input type="text" value="_asd_"/><span>_asd_</span></p>
span has border - fail...
<p><input type="text" value="_asd_"/><span class="border">_asd_</span></p>
input has border - success ...
<p><input type="text" value="_asd_" class="border"/><span>_asd_</span></p>
Both elements have border - fail :(
<p><input type="text" value="_asd_" class="border"/><span class="border">_asd_</span></p>
vertical-align: middle messes up baseline alignment
<p><input type="text" value="_asd_" class="border vmiddle"/><span class="border vmiddle">_asd_</span></p>
(在 chrome 中测试 - 在其他浏览器中似乎有所不同)
我是不是遗漏了一些明显的东西,或者没有好的通用解决方案?我不想使用填充,因为它有自己的一系列挑战。
似乎像素 above/below 基线的分布因元素类型和元素是否有边框而异。我可以理解混合边界的情况,但输入与跨度的行为方式不同,这真的很烦人。 (见 span-input,都带边框)
你的盒子太少了
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 24px; /* Note this correction */
line-height: 22px;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
border: 1px solid black;
vertical-align: middle;
}
input {
background-color: #A6A6A6;
}
<h4>One input, one span - the same ;-)</h4>
vertical-align: middle messes up baseline alignment
<p>
<input value="_asd_" type="text">
<span>_asd_</span>
</p>
好的,
我认为这段代码可以解决您的问题。我只是简单地使用了与背景颜色相同的边框。
谢谢,再见,
贾科莫
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 24px; /* First correction */
line-height: 22px;
border: none;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
}
input {
background-color: #A6A6A6;
}
.border {
border: 1px solid black;
}
.border2 {
border: 1px solid gray; /* Second correction */
}
.vmiddle {
vertical-align: middle;
}
p {
margin: 5px;
}
<h4>Two spans</h4>
One span has border - fail...
<p><span class="border2">_asd_</span><span class="border">_asd_</span></p>
One span has border - fail...
<p><span class="border">_asd_</span><span class="border2">_asd_</span></p>
Both spans have border - success
<p><span class="border">_asd_</span><span class="border">_asd_</span></p>
<h4>One input, one span - not the same</h4>
No borders - success
<p><input type="text" value="_asd_"/><span class="border2">_asd_</span></p>
span has border - fail...
<p><input type="text" value="_asd_"/><span class="border">_asd_</span></p>
input has border - success ...
<p><input type="text" value="_asd_" class="border"/><span class="border2">_asd_</span></p>
Both elements have border - fail :(
<p><input type="text" value="_asd_" class="border"/><span class="border">_asd_</span></p>
vertical-align: middle messes up baseline alignment
<p><input type="text" value="_asd_" class="border vmiddle"/><span class="border vmiddle">_asd_</span></p>
当在一行中的元素上设置相同的 line-height、height 和 box-sizing: border-box 时,我希望它们正确垂直对齐(在基线和框处)。
运气不好:对于 input/span and/or with-border/without-border 的某些组合,对齐似乎总是偏离一个像素。
见下文或http://jsfiddle.net/xcgyh22q/9/
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 22px;
line-height: 22px;
border: none;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
}
input {
background-color: #A6A6A6;
}
.border {
border: 1px solid black;
}
.vmiddle {
vertical-align: middle;
}
p {
margin: 5px;
}
<h4>Two spans</h4>
One span has border - fail...
<p><span>_asd_</span><span class="border">_asd_</span></p>
One span has border - fail...
<p><span class="border">_asd_</span><span>_asd_</span></p>
Both spans have border - success
<p><span class="border">_asd_</span><span class="border">_asd_</span></p>
<h4>One input, one span - not the same</h4>
No borders - success
<p><input type="text" value="_asd_"/><span>_asd_</span></p>
span has border - fail...
<p><input type="text" value="_asd_"/><span class="border">_asd_</span></p>
input has border - success ...
<p><input type="text" value="_asd_" class="border"/><span>_asd_</span></p>
Both elements have border - fail :(
<p><input type="text" value="_asd_" class="border"/><span class="border">_asd_</span></p>
vertical-align: middle messes up baseline alignment
<p><input type="text" value="_asd_" class="border vmiddle"/><span class="border vmiddle">_asd_</span></p>
(在 chrome 中测试 - 在其他浏览器中似乎有所不同)
我是不是遗漏了一些明显的东西,或者没有好的通用解决方案?我不想使用填充,因为它有自己的一系列挑战。
似乎像素 above/below 基线的分布因元素类型和元素是否有边框而异。我可以理解混合边界的情况,但输入与跨度的行为方式不同,这真的很烦人。 (见 span-input,都带边框)
你的盒子太少了
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 24px; /* Note this correction */
line-height: 22px;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
border: 1px solid black;
vertical-align: middle;
}
input {
background-color: #A6A6A6;
}
<h4>One input, one span - the same ;-)</h4>
vertical-align: middle messes up baseline alignment
<p>
<input value="_asd_" type="text">
<span>_asd_</span>
</p>
好的,
我认为这段代码可以解决您的问题。我只是简单地使用了与背景颜色相同的边框。
谢谢,再见,
贾科莫
input, span {
display: inline-block;
box-sizing: border-box;
padding: 0;
height: 24px; /* First correction */
line-height: 22px;
border: none;
background-color: gray;
font-family: Arial, sans-serif;
font-weight: normal;
font-size: 14px;
width: 40px;
}
input {
background-color: #A6A6A6;
}
.border {
border: 1px solid black;
}
.border2 {
border: 1px solid gray; /* Second correction */
}
.vmiddle {
vertical-align: middle;
}
p {
margin: 5px;
}
<h4>Two spans</h4>
One span has border - fail...
<p><span class="border2">_asd_</span><span class="border">_asd_</span></p>
One span has border - fail...
<p><span class="border">_asd_</span><span class="border2">_asd_</span></p>
Both spans have border - success
<p><span class="border">_asd_</span><span class="border">_asd_</span></p>
<h4>One input, one span - not the same</h4>
No borders - success
<p><input type="text" value="_asd_"/><span class="border2">_asd_</span></p>
span has border - fail...
<p><input type="text" value="_asd_"/><span class="border">_asd_</span></p>
input has border - success ...
<p><input type="text" value="_asd_" class="border"/><span class="border2">_asd_</span></p>
Both elements have border - fail :(
<p><input type="text" value="_asd_" class="border"/><span class="border">_asd_</span></p>
vertical-align: middle messes up baseline alignment
<p><input type="text" value="_asd_" class="border vmiddle"/><span class="border vmiddle">_asd_</span></p>