注意:这篇文章背后的动机仅仅是为了更好地理解 CSS。CSS 对我来说仍然主要是巫术(尽管研究了几个小时和几个小时),我当然不会再寻找更多的巫术(即更多的“解决方法”或“黑客”)。我正在寻找对CSS的洞察力。
我找到了两种将 adiv
在其容器中居中的方法。(在这篇文章中,我将其称为div
居中#inner-div
。)
第一种方法是基于给出#inner-div
规范margin:0px auto;
;第二个是给出#inner-div
规范display:inline-block
。
AFAICT,该margin:0px auto
方法还需要显式设置 的宽度div
,如本jsFiddle 所示;CSS的关键是
#inner-div {
margin:0px auto;
width:100px;
}
(要查看如果width
省略上述规范会发生什么,请参阅此jsFiddle。)
类似地,AFAICT,也需要display:inline-block
1) 将规范提供text-align:centered
给包含 的元素#inner-div
,以及 2) 防止所需的无关底边距(例如,通过将规范提供给AFAICT 和任何其他后代来实现)或)。请参阅此jsFiddle,尤其是以下 CSS 位:display:inline-block
#inner-div
vertical-align:top
#inner-div
display:inline
display:inline-block
#outer-div {
text-align:center;
}
#inner-div {
display:inline-block;
vertical-align:top;
}
我发现这两种方法都有问题。第二种方法显然是有问题的,因为它display:inline-block
给出了受影响div
的类似文本的语义,导致意外的行为(如上面提到的看似无缘无故的底部边距)。
另一方面,第一种方法需要指定#inner-div
' 的宽度。这排除了由 的内容的宽度隐式#inner-div
指定此宽度的可能性。我不喜欢这样:我经常需要居中divs
,我很难确定其宽度,即使在运行时也是如此(例如,这个宽度可能取决于字体度量,或者流程在 内的工作方式#inner-div
等) . 毕竟,正如本文中给出的 jsFiddle 所示,浏览器已经根据其内容计算'height
的 为什么浏览器也不能计算的宽度?#inner-div
#inner-div
#inner-div
在我看来,任何合理的布局系统都允许对浏览器说:“div
根据其内容的宽度计算 this 的宽度,并将其置于其容器中”。
我的问题有两个部分:
- 我正在寻找一个消息灵通的确认,即 CSS确实没有提供任何方法来指导浏览器计算 a 的宽度
div
(基于其内容),然后div
在其包含元素中居中表示;和 - 如果最后一个问题的答案是“是”,这仅仅是因为 CSS 的创建者设计不佳,还是 CSS 有充分的理由不支持这种自然(至少对我而言)功能?
注意:这些都是难题;尤其是第二个,不仅需要对 CSS 标准有一定的了解,还需要对 CSS 本身的设计有所了解:要求很高!