为什么空按钮不与里面有文本的按钮垂直对齐?

Vit*_*.us 6 html css layout button

我有一个带按钮的工具栏,有些里面有文字,有些没有。出于某种原因,我不太明白,它们没有垂直对齐。

为什么?以及如何解决它?

截屏

#tools{
   border: 1px solid black; 
}

#tools button{
    border-width: 2px;
	border-style: outset;
	border-color: #ccc;
    
	height: 24px;
	width: 24px;
    
	font-size: 9pt;
}
#tools button:active{
	border-style: inset;
}

button.Bl{
    font-weight: bold;
}
button.Bo{
    font-style: italic;
}
button.B4{
    background-color: #A00;
    text-shadow: 0.15em 0.15em #2A0000;
}
button.Bc{
    background-color: #F55;
    text-shadow: 0.15em 0.15em #3F1515;
}
Run Code Online (Sandbox Code Playgroud)
<div id="tools">
    <button class="B4 pallete" title="§4 Dark Red"></button>
    <button class="Bc pallete" title="§c Red"></button>
    <button class="Bl pallete" title="§r Bold">B</button>
    <button class="Bo pallete" title="§r Italic">I</button>
</div>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/hjo41wm2/

Mar*_*det 6

内联元素的垂直对齐 - 为什么它的工作方式如此。

假设我们有以下 HTML(类似于上面的):

<div id="tools">
    <button class="ExA pallete" title="Example Auto">E</button>
    <button class="Ex0 pallete" title="Example Zero">E</button>
    <button class="B4 pallete" title="§4 Dark Red"></button>
    <button class="Bc pallete" title="§c Red"></button>
    <button class="Bl pallete" title="§r Bold">B</button>
    <button class="Bo pallete" title="§r Italic">I</button>
</div>
Run Code Online (Sandbox Code Playgroud)

我又添加了两个按钮来说明一些概念。

让我们看看以下 CSS 规则:

#tools{ border: 1px solid black; }

button{
    border-width: 2px;
    border-style: outset;
    border-color: #ccc;

    height: 48px;
    width: 48px;

    font-size: 24pt;
    vertical-align: baseline;
}
button:active{
    border-style: inset;
}

button.Bl { font-weight: bold; }
button.Bo { font-style: italic; }
button.B4{
    background-color: #A00;
    text-shadow: 0.15em 0.15em #2A0000;
}
button.Bc{
    background-color: #F55;
    text-shadow: 0.15em 0.15em #3F1515;
    height: auto;
}
button.ExA {}
button.Ex0 {
    height: auto;
    font-size: 0;
}
Run Code Online (Sandbox Code Playgroud)

这里我们有六个内联元素,都是按钮,组成一个行框,如下图:

在此处输入图片说明

浏览器将为每个行内元素计算一个高度,然后使用垂直对齐属性(默认为基线)将它们相互对齐。

在前两个框和后两个框的情况下,有一个具有指定字体大小的字符内容,在本例中为 24pt(0pt 除外,我将稍后解释)。

在这种情况下,第 1 个、第 5 个和第 6 个框的行为符合预期,三个字母垂直对齐到一个公共基线。

第三个和第四个按钮没有字符,因此内联框的高度计算为零(行高仅适用于文本)。在第三个按钮中,按钮具有固定高度,因此浏览器将元素垂直对齐到基线,这样高度的一半在基线之上,一半在基线之下。如果height: auto为第 4 个按钮设置,这将更加明显,它将元素缩小到零高度(边框除外),我们看到 0+margin 元素与公共基线对齐。

要确认行为,请考虑第二个按钮,它有一个字符和height: autofont-size: 0。在这种情况下,零字体大小强制行内框高度缩小为零,高度缩小为零(和边框宽度)。

因此,没有文本的按钮等同于以零字体高度显示文本的按钮。

所有这些行为都包含在 CSS 规范中:

http://www.w3.org/TR/CSS2/visudet.html#line-height

您需要仔细阅读这些部分以梳理出其中的含义。

见演示:http : //jsfiddle.net/audetwebdesign/0jm8th00/