提问人:Fabrício Matté 提问时间:7/4/2014 更新时间:7/4/2014 访问量:1008
列表项标记位置不一致,具体取决于子项的显示属性
Inconsistent list item marker positioning depending on child's display property
问:
考虑此标记:
<ul>
<li>
<div id="container">
<button>toggle display</button>
<div>text</div>
<div>text</div>
</div>
</li>
</ul>
假设元素的计算 CSS 值为 ,列表项标记(项目符号)呈现在内容的第一行旁边(在 的左侧)。#container
display
block
•
<button>
现在,如果将 的 CSS 属性更改为 ,则列表项标记将呈现在最后一行文本旁边。请参阅此测试用例。(在 Chrome 35 和 Firefox 30 中测试)。#container
display
inline-block
在这两种情况下,是否可以在同一位置呈现项目标记?(最好在与容器一起呈现的地方)display: block
经过一番摆弄后,项目标记位置似乎受到元素的影响。例如,元素中的设置会使标记呈现在元素左上角附近,但由于该属性不适用于元素,因此标记位置仍然存在差异。inline-block
vertical-align
vertical-align: top
#container
inline-block
vertical-align
block
有没有一种解决方案可以使子弹在完全相同的位置呈现,而与 的属性无关?#container
display
我更喜欢仅 CSS 的解决方案,但编辑标记也是可以接受的。
答:
这是肮脏的方法:
li {
list-style-type: none;
}
li::before {
content: "\25CF";
margin-left: -20px;
position: absolute; # thanks to DRD
}
评论
<ol>
body {height: 10000px;}
li
:before
li
margin-left
left: -20px
:before
body
position: relative
li
首先,我不明白为什么子弹会归零在内联块内的最后一个块上。但是,如果您将内联块中的块更改为 ,那么这似乎可以解决问题:http://jsfiddle.net/3BYKp/1/。table
#container > div {
display: table;
}
评论
一个可能的解决方案是用一个元素包装:#container
inline-block
.container-outer {
display: inline-block;
width: 100%;
vertical-align: top;
}
这样,子弹相对于这个新的外部元件定位,其显示不会改变,从而达到所需的一致性。inline-block
唯一的缺点是项目符号与元素的顶部对齐(由于显示和 ),而不是与元素一样的第一行内容,但这几乎不明显。inline-block
vertical-align: top
block
根据 http://www.w3.org/TR/CSS21/visudet.html:
“内联表”的基线是表第一行的基线。
“内联块”的基线是其在正常流中最后一个行框的基线,除非它没有流入线框,或者其“溢出”属性具有“可见”以外的计算值,在这种情况下,基线是下边距边。
另请参阅以下两个演示:
http://www.brunildo.org/test/inline-block.html
http://www.brunildo.org/test/inline-block2.html
它似乎具有相同的基线。所以使用而不是可以解决这个问题。block
inline-table
inline-table
inline-block
评论
:before
@counter
<ol>
display:inline-block
display:inline-table
看起来还不错?inline-table
inline-block
inline-table
;)