我正在尝试制作一个相当复杂的图像和信息网格(几乎像Pinterest一样)。具体来说,我正在尝试将一组<ul>s
一个接一个地内联到位。我有它的工作,但一个方面是导致问题,所以我试图询问这个小块,以避免整个问题的复杂性。
为了水平对齐图像及其信息,我们使用内联<li>s
内部的其他内联块级元素。除了<li>s
几乎没有高度外,一切都能正常工作。
HTML和CSS是in JSFiddle here如果您想要除了以下内容之外还要使用它:
HTML:
<div>
<ul class="Container">
<li>
<span class="Item">
<a href="#"><img src="http://jsfiddle.net/img/logo.png"/></a>
<span class="Info">
<a href="#">Title One</a>
<span class="Details">One Point One</span>
</span>
</span>
</li>
<li>
<span class="Item">
<a href="#"><img src="http://jsfiddle.net/img/logo.png"/></a>
<span class="Info">
<a href="#">Title Two</a>
<span class="Details">Two Point One</span>
</span>
</span>
</li>
</ul>
CSS:
.Container {
list-style-type:none;
}
.Container li {
background-color:grey;
display:inline;
text-align:center;
}
.Container li .Item {
border:solid 2px #ccc;
display:inline-block;
min-height:50px;
vertical-align:top;
width:170px;
}
.Container li .Item .Info {
display:inline-block;
}
.Container li .Item .Info a {
display:inline-block;
width:160px;
}
如果你在jsfiddle链接中查看结果,你会发现灰色背景只包含整个<li>
的一小条。我知道将<li>
更改为display:inline-block
可以解决此问题,但由于其他原因这是不可行的。
首先,我只是想看看是否有人理解为什么内联<li>
元素没有任何高度。我在规范中找不到任何解释这个的东西。我知道我不能为内联元素添加高度,但是为什么会发生这种情况可以让我修复的任何解释都会很棒。
其次,如果您使用IE的开发者模式检查元素,您将看到虽然背景颜色位于正确的位置,但<li>'s
边界框的实际位置位于容器的底部,根据悬停在元素上。我可以解决这个问题,如果它在每个浏览器中位于顶部,但显然会有所不同。
注意:在这种情况下,我并不真正关心旧浏览器,但我不使用HTML5或JavaScript定位。
感谢。
答案 0 :(得分:6)
内联元素没有设置height
的选项。内联元素是一行上的元素,因此继承了行的高度。块元素是占据整个宽度的元素,可以分配宽度,高度和其他使其更容易样式的东西。
有关规格的详细说明,请参阅: http://www.w3.org/TR/CSS2/visuren.html#inline-formatting
inline-block
会使元素显示为内嵌,但您可以为其指定height
和width
,并随内容扩展。我没有经常使用inline-block
,因为它在IE中有错误的行为,但那些日子现在已经过时了:
http://www.quirksmode.org/css/display.html
使用<li>
使inline-block
解决了这个问题,但您说这不适合您。为什么不?另一个解决方案是制作那些li的块元素,并使它们向左浮动。如果您遇到重叠内容的问题,请使用整个ul上的overflow属性来确保ul正在推送其他内容。
ul.Container {
list-style-type: none;
overflow: hidden; /* so height expands with the floated content */
}
ul.Container li {
display: block;
float: left;
... more styling ...
}
这是解决你的难题的东西吗?
答案 1 :(得分:3)
CSS 2.1规范的相关位是section 10.6.1 Inline, non-replaced elements的section 10.6 Calculating heights and margins。它说:
'height'属性不适用。内容区域的高度 应该基于字体,但是这个规范没有指定 怎么样。 UA可以例如使用em-box或最大上升器和 字体的下降。 (后者将确保带有部分的字形 在em-box之上或之下仍然属于内容区域,但是 导致不同字体的不同大小的盒子;前者会 确保作者可以控制相对于的背景样式 'line-height',但导致字形在其内容之外绘画 面积。)
<li>
元素采用内联样式,其内容是单个内联块对象,不能跨越行,因此<li>
的内容区域只有一行高。因此<li>
的内容区域的高度为1 x f(字体的高度)。有关字体高度增加使灰色区域变大的演示,请参阅http://jsfiddle.net/dh8nU/1/。
该部分继续说:
内联未更换框的垂直填充,边框和边距 从内容区域的顶部和底部开始,无关 使用'line-height'。但是,只有'线高'才被使用 计算线框的高度。 [我的重点]
当您在内联元素中放置较大的内联块元素时,线框的高度会增加以包含内联块元素,但是根据上面的文本,这不会增加包含内联元素的高度。 / p>