儿童边界低于父母一方

时间:2014-08-24 14:44:20

标签: css inline padding parent

当我注意到一个我无法解释的例子时,我正在看一些列表的例子。这是我正在查看http://css.maxdesign.com.au/listamatic/horizontal05.htm的网站,这是来自它的代码:

<div id="navcontainer">
    <ul id="navlist">
        <li id="active"><a href="#" id="current">Item one</a></li>
        <li><a href="#">Item two</a></li>
        <li><a href="#">Item three</a></li>
        <li><a href="#">Item four</a></li>
        <li><a href="#">Item five</a></li>
    </ul>
</div>
#navlist {
    padding: 3px 0;
    margin-left: 0;
    border-bottom: 1px solid #778;
    font: bold 12px Verdana, sans-serif;
}
#navlist li {
    list-style: none;
    margin: 0;
    display: inline;
}
#navlist li a {
    padding: 3px 0.5em;
    margin-left: 3px;
    border: 1px solid #778;
    border-bottom: none;
    background: #DDE;
    text-decoration: none;
}
#navlist li a:link {
    color: #448;
}
#navlist li a:visited {
    color: #667;
}
#navlist li a:hover {
    color: #000;
    background: #AAE;
    border-color: #227;
}
#navlist li a#current {
    background: white;
    border-bottom: 1px solid white;
}

我没有得到的是将父#navlist元素的填充设置为3px,而仍然列表项直接放置到其边框,就像它的填充为0px一样。当我设置以下内容时:

#navlist {
    padding: 0;
}

列表项的边框位于#navlist元素的边框下方。那为什么不应该比#navlist边界高出1px?我找不到解释这种行为的规则?

2 个答案:

答案 0 :(得分:2)

垂直填充对内联元素的工作方式不同。考虑这个例子:

Padding Demo

青色区域表示父元素,而黄色区域表示带填充的块/内联元素。请注意,内联元素的顶部和底部填充不会影响父级的高度;如有必要,它会在父母之外呈现。

现在,这是Eric Meyer的标签导航栏示例的细分:

  • 有一个包含3px垂直填充的列表
  • 此列表包含一个14px高的行框,其中包含内联列表项
  • 列表项包含3px垂直填充的链接(此填充使选项卡按钮显得更宽,更高更好)

如上所述,垂直填充不会使线框向下移动,而是填充在有意添加 的3px填充上方划线。结果是像素完美标签菜单。

答案 1 :(得分:1)

认为就是这样:<li>元素和包含的<a>元素都是内联元素。因此,它们排列在<ul>容器的基线,该容器位于<ul>顶部下方的16个像素加3个填充像素内。 (我认为基线距离底部可能有2个像素,但很难说清楚。)<a>标签也是16像素高,因此它们恰好排列在{{16个像素上方。 1}}。因此,<ul>的顶部和底部填充的3个像素恰好在<a>的可用空间上排列。

基本上它归结为内联元素的工作方式。如果您将<ul>元素设为<a>而不是inline-block,则会看到填充不再重叠。 You can read the W3C material about it here.