为什么我的清单项目符号与浮动元素重叠


166

我有一个(XHTML Strict)页面,在该页面上我将图像与常规文本段落一起浮动。一切顺利,除非使用列表而不是段落。列表的项目符号与浮动图像重叠。

更改列表或列表项的边距无济于事。页边距是从页面的左侧计算得出的,但浮动框将列表项推到其自身内部的右侧li。因此,仅当我将其设置得比图像宽时,边距才有用。

浮动图像旁边的列表也可以,但是我不知道列表何时浮动。我不想为了解决此问题而浮动内容中的每个列表。此外,当图像浮动列表的右侧而不是列表的左侧时,向左浮动会弄乱布局。

设置li { list-style-position: inside }的确会使项目符号与内容一起移动,但是也会导致换行开始时与项目符号对齐,而不是与上方的行对齐。

问题显然是由子弹在盒子外面渲染引起的,浮子将盒子的内容推到右边(不是盒子本身)。IE和FF就是这样处理情况的,据我所知,按照规范,这没有错。问题是,如何预防呢?

Answers:


280

我已经找到解决此问题的方法。施加ul { overflow: hidden; }ul该盒子本身是由浮子推开保证,而不是框的内容。

只有IE6才需要ul { zoom: 1; }在我们的条件注释中确保ul布局。


1
+1:很棒的CSS,我疯狂地搜寻了GOOD VERSATILE的解决方案,就这样。唯一的缺点是zoom属性不能验证CSS,但是我进行了测试,并且在IE7上不需要IE8,因此它可能仅适用于IE6。
Marco Demaio 2010年

14
为了使它真正发挥作用,我还必须应用:ul,ol { padding-left:40px; 左边距:0;} ol li,ul li {list-style-position:outside; padding-left:0;}这迫使跨浏览器呈现一致,并迫使IE6显示项目符号。子弹被隐藏了。ul {zoom:1; }在ie6的特定设置中仍然是必需的。
Mandrake

1
对MSIE中如此荒谬的BUG如此荒谬的简单解决方案。
SF。

10
这不是一个完美的解决方案。正如Blazemonger提到的打击一样,如果图像很小并且列表很长,则列表将不会围绕浮动图像流动。如果图像非常宽,则该列表从上到下将具有巨大的空白。
2014年

2
真好!不过,在溢出时阅读W3C文档时,我看不出这有什么意义:w3schools.com/cssref/pr_pos_overflow.asp
MSC

66

Glen E. Ivey的解决方案进行了改进:

ul {
    list-style: outside disc;
    margin-left: 1em;
}
ul li {
    position: relative;
    left: 1em;
    padding-right: 1em;    
}​

http://jsfiddle.net/mblase75/TJELt/

我更喜欢这种技术,因为它可以在列表需要围绕浮动图像流动时起作用,而该overflow: hidden技术则不需要。但是,还必须添加padding-right: 1emli以防止它们溢出容器。


我也更喜欢此修复程序,因为顶级修复程序打破了我的Twitter Bootstrap下拉列表,并且使我永远弄清楚上述方法才是罪魁祸首。
伊恩·霍尔

2
谢谢你 正在应用溢出:隐藏;UL阻止了单个订单项中的文本在浮动块周围正确显示。这个解决方案成功了!
jsdalton

1
对于该解决方案,我遇到了一个小问题,但很关键,我想建议您进行一些改进。我不确定为什么,但是当您将其添加position: relative;到订单项时,它会导致浮动内容出现堆叠问题。我发现(在Chrome和Firefox中)很难悬停并单击浮动内容中的链接。对我来说,解决方法是添加position: relative; z-index: 1;到float元素中,这似乎可以解决堆栈问题。
jsdalton 2013年

7
不幸的是,在IE 10上,项目符号与浮动元素重叠。
Munawwar 2014年

1
尽管ul {overflow: hidden;}在所有浏览器中都解决了该问题,但是上述解决方案是使用XHTML + CSS3到PDF转换器Prince XML来解决此问题的唯一可行方法。
Serge Stroobandt

36

这是“ display”属性发挥作用的地方。在下面设置CSS,以使列表与浮动内容一起使用。

显示:表;与浮动内容一起工作(填补空白),但不隐藏内容。就像桌子一样:-)

.img {
  float: left;
}

.table {
  display: table;
}
<img class="img" src="https://via.placeholder.com/350x350" alt="">
<ul>
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>
<ul class="table">
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>

编辑:记住要添加一个类来隔离您希望这样做的列表。例如“ ul.in-content”或更笼统的“ .content ul”


29

尝试list-style-position:内部更改项目符号的布局。


3
list-style-position:inside这将是一个很好的解决方案,但会使换行的线开始与子弹对齐,而不是与上方的线对齐。
Marco Demaio 2010年

溢出:隐藏;不为我的左浮动图像工作,但list-style-position:inside做到了!谢谢
menardmam 2012年

对于我来说,这是唯一仍将内容包装在IE中的解决方案。谢谢!
jordan314

当内容在您的项目符号和项目符号内容之间浮动时,这是一个很好的解决方案。
TylersSN

这应该是选择的答案。
时尚极客

18

http://archivist.incutio.com/viewlist/css-discuss/106382,我发现了一个对我有用的建议:使用以下样式设置“ li”元素:

position: relative;
left: 1em;

如果没有浮点数,则用列表项应具有的左侧填充/边距宽度替换“ 1em”。这在我的应用程序中效果很好,甚至可以处理浮点数底部出现在列表中间的情况-项目符号移回到恰好在(本地)左边距处。


2
神奇的解决方案,就像魅力!尽管我不得不动手使用IE7,因为IE7无法在不在浮动元素旁边的列表中显示列表项编号。
maryisdead 2011年

@maryisdead您对IE7的解决方案是什么?
TJ。

IE7需要在列表项上保留额外的边距。看到这个小提琴jsfiddle.net/maryisdead/wu6ew/5并记下两个IE7黑客。抱歉,您未在此之前添加此内容。
maryisdead 2012年

18

为什么overflow: hidden工作

解决方案很简单:

ul {overflow: hidden;}

带有overflow:除以外的块框为其内容visible 建立新的块格式化上下文。W3C建议:http : //www.w3.org/TR/CSS2/visuren.html#block-formatting

上的按钮我的网站它们,<li>伪装,都犯了这样的。让你的浏览器更小,视口(窗口)看到缩进在行动

以我的网站为例

相关答案

带有示例的文章


1
感谢您解释为什么这样做(在公认的解决方案中未提及)
schellmax

17

至少为我增加overflow: auto;了您的ul作品。

更新资料

我已经更新了jsfiddle以可视化正在发生的事情。当在float ul旁边时img,的内容ul将由float推入,而不是实际的容器。通过添加overflow: auto整个ul-box,将由浮点而不是仅内容推入。


13

您可以分配position: relative; left: 10px;li。(您可能还想给它一个margin-right: 10px;,否则它的右侧可能会变得太宽。)

或者,如果你想使用floatul-其他人的建议-你也许可以从使用浮动UL权停止休息clear: left下面的UL的元素。


谢谢克里斯,那个位置:亲戚工作。在ul之后清除该元素会产生的问题是该元素还将清除左侧浮动的div。
superUntitled 2010年


7

免责声明

浮动元素旁边的列表会引起问题。我认为,防止此类浮动问题的最佳方法是避免浮动图像与内容相交。当您必须支持响应式设计时,它也会有所帮助。

在段落之间居中放置图像的简单设计看起来非常吸引人,并且比试图太花哨更容易支持。距距离也仅有一步之遥<figure>

但是我真的想要浮动的图像!

好的,因此,如果您疯狂地坚持不懈地继续沿着这条道路前进,则可以使用两种技术。

最简单的方法是使列表使用overflow: hiddenoverflow: scroll,以使列表实质上被收缩包装,从而将填充物拉回到有用的位置:

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

但是,该技术存在一些问题。如果列表很长,实际上并不会环绕图像,这几乎破坏了float在图像上使用的全部目的。

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

但是我真的很想包装清单!

好的,因此,如果您甚至更疯狂,更持久,并且绝对必须沿着这条道路走下去,那么还有另一种技术可以用来包装列表项和维护项目符号。

与其填充<ul>并尝试使其与项目符号表现良好(这似乎从来都不希望这样做),<ul>不如将这些项目符号从那里拿走并交给<li>s。项目符号是危险的,<ul>正义者没有足够的责任来正确处理它们。

img {
  float: left;
}
.wrapping-list {
  padding: 0;
  list-style-position: inside;
}
.wrapping-list li {
  overflow: hidden;
  padding-left: 25px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

这种包装行为会使复杂的内容变得奇怪,因此我不建议默认添加它。将其设置为可以选择加入的内容而不是必须覆盖的内容要容易得多。


我喜欢第二个选项,但文本实际上以较长文本(2行)的项目符号开头:-(
Arany

4

在您的UL标签上尝试以下操作。这应该照顾到覆盖图像的项目符号,并且您不必弄乱由引起的左对齐list-position: inside

overflow: hidden; 
padding-left: 2em; 

我必须将此与Blazemonger的解决方案一起使用(上面的#2)。仅BLazemonger不能在IE 9-11和Opera中工作。这样,它就可以在所有浏览器中使用。Kamiel(#1)的解决方案对我不起作用,因为它隐藏了我的子弹。可能与Bootstrap3冲突。
莱拉2015年

3

自己为此奋斗。我管理的最好的事情如下:

ul {
    list-style-position: inside;
    padding-left: 1em;
    text-indent: -1em;
}

文本实际上没有缩进,但项目符号显示。


2

编辑以根据OP的评论进行更新

好,然后将其分解为2个div嵌套在一起

ul  {background: blue; position:static;}
.therest {position:relative; width:100%}
.indent {float:left; }

<div class="therest">
<p>
Est tincidunt doming iis nobis nibh. Ullamcorper eorum elit lius me delenit. 
</p>
<hr />
<h3>Lorem</h3>
<div class="indent">
<ul>
<li>list element</li>
<li>list element</li>
<li>list element</li>
</ul> 
<div>
the rest now under the UL
</div>

尝试将ul li CSS更改为

ul {float:left; 背景:蓝色;}


谢谢,那行得通,但是,现在下面的段落浮在右边。
superUntitled 2010年

2

在几个项目中解决了这个有趣的问题,并研究了发生原因之后,我终于相信我找到了两者:一个可行且“响应式”的解决方案。

这是魔术,现场示例:http : //jsfiddle.net/superKalo/phabbtnx/

ul {
    list-style: none;
    position: relative;
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    left: 35px;
}
li {
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    text-indent: -19px; /* adjust as much as needed */
}
li:before {
    content: '•\00a0\00a0\00a0';
    color: #000; /* bonus: you can customize the bullet color */
}

我添加display: flex;li,以便当我更改:before零件的字体大小时,项目符号点垂直居中。
Arany

1

在LMS内部工作而无需访问文档负责人,发现将其margin-right: 20px作为图像的内联样式更容易使用。这归功于我这个网站


0

试试这个:

li{
    margin-left:5px;
}

如果您想让它们左移,只需输入-## px值即可。


0

或者您可以这样做:

 #content ul {
        background:none repeat scroll 0 0 #AACCDD;
        float:left;
        margin-right:10px;
        padding:10px;

然后从li删除所有样式


1
浮动ul确实可以解决问题,但是,还会出现另一个问题... ul之后出现的所有段落元素都会浮动到ul的右侧。
superUntitled 2010年

给您+1 ...我在这里通过查看与此问题相关的链接来假设<p>将浮动在<ul>的右边。接得好。
里斯






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.