CSS停止图像下的文字换行


86

我有以下标记:

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <span>Text, text and more text</span>
</li>

我想要它,以便如果文本自动换行,就不会进入图像的“列”。我知道我可以用table(我一直在做)做到这一点,但是由于这个原因这是行不通的。

我已经尝试了以下方法,但均未成功:

li span {width: 100px; margin-left: 20px}
.fav_star {width: 20px}

我也试过了float: right

谢谢。

编辑:我希望它看起来像这样:

IMG   Text starts here and keeps going... and
      wrap starts here.

不是这样的:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.

1
您可以将代码放入jsfiddle吗?
Hardik

我认为您需要在此明确自己的意图。如果您不希望自动换行,则可以使用white-space: nowrap;in li span {...},但是我给您的印象是您正在尝试做其他事情
我的头疼

@MyHeadHurts歉意-对我来说似乎很清楚:)我想要两行。左侧20像素用于图像。其余用于文本。如果文字自动换行,我希望它从左侧开始20px换行的第二行(初始文字开始的位置)。
尼克

1
对于路人,您无需按照公认的答案处理宽度。这要简单得多:创建所谓的新格式上下文。请参阅乔·康林的答案。有关更多背景信息,请参见我的。
hqcasanova

1
@hqcasanova作为记录,Dan的答案在Joe发表他的答案的9个月之前被接受,而在您发表之前的16个月被接受。尽管感谢您添加替代方法,但我不会拒绝Dan的回答。
尼克

Answers:


35

由于这个问题引起了广泛的关注,并且这是公认的答案,因此我认为有必要添加以下免责声明:

该答案特定于OP的问题(示例中设置了宽度)。当它起作用时,它要求您在每个元素,图像和段落上都有一个宽度。除非您有此要求,否则我建议您使用Joe Conlin的解决方案,该解决方案将作为该问题的另一个答案发布。

span元素是一个内联元素,您不能在CSS中更改其宽度。

您可以将以下CSS添加到您的跨度中,以便可以更改其宽度。

display: block;

通常更有意义的另一种方法是将<p>元素用作的父元素<span>

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <p>
     <span>Text, text and more text</span>
  </p>
</li>

由于<p>是一个block元素,因此您可以使用CSS设置其宽度,而无需进行任何更改。

但是在两种情况下,由于现在都有一个block元素,因此需要浮动图像,以使文本不会全部落在图像下方。

li p{width: 100px; margin-left: 20px}
.fav_star {width: 20px;float:left}

PSfloat:left也可以戴上图像,而不是在图像float:right上,li p但在这种情况下,还需要text-align:left正确地重新对齐文本。

PSS如果您继续第一个不添加<p>元素的解决方案,那么CSS应该如下所示:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}

这真的很有帮助。我将更改为span一个p元素。然后,这两个似乎可以解决问题:li p {margin-left: 40px} .fav_star {float: left}。图像的宽度由图像本身设置,该p元素自动为a block,我不理会宽度。谢谢你
Nick

2
如果您要使用display:block,则最好也使用a,div因为这就是它的用途(或者p也建议您使用a )。无需对文本进行双重包装-如果您使用的是p,则可能会丢失span
Gareth 2012年

IMO,您不应该使用HTML来更改页面的设计。这是CSS的工作(当然,有例外,特别是当您需要跨浏览器兼容性时)。我相信使用适当的HTML并具有“良好的语义”更为重要。因此div,在这种情况下,我将不使用ap更为合理。丢失内容span对我来说微不足道,取决于您对内容的布局方式。
2012年

一个包裹<span>在一个<p>是巫术直出Hogwartz的!作品精美!
Janus

251

这个问题的简单答案似乎吸引了很多人:

<img src="url-to-image">
<p>Nullam id dolor id nibh ultricies vehicula ut id elit.</p>

    img {
        float: left;
    }
    p {
        overflow: hidden;
    }

参见示例:http : //jsfiddle.net/vandigroup/upKGe/132/


11
这是对这个问题的正确答案。此技术不需要为段落设置固定宽度。更简单,更轻松的解决方案。即使在IE8中也可以完美运行。
chocolata

4
好吧,实际上,如果包含文本的元素是a span(OP的情况),这将无法工作。一个display: block将需要的span。但是,保存这一点,我同意这是一个更为优雅的解决方案。如果有人想知道背后的魔力是什么overflow: hidden,请参阅下面的答案。
hqcasanova

7
这不是我期望的行为,但这真棒。
加文2014年

2
记录下来,这个答案是在我打勾的答案之后的8个月:)
尼克

2
哇。工作完美。我真不敢相信我以前从未知道过。
SFlagg

25

对于那些想要一些背景信息的人,这里有一篇简短的文章解释了为什么overflow: hidden起作用。它与所谓的块格式化上下文有关。这是W3C规范的一部分(即不是hack),基本上是具有块类型流的元素所占据的区域。

每次应用时,overflow: hidden都会创建一个新的块格式上下文。但这不是能够触发该行为的唯一属性。引用悉尼Web Apps Group的Fiona Chan的演讲

  • 浮动:左/右
  • 溢出:隐藏/自动/滚动
  • 显示:表格单元格和任何与表格相关的值/内联块
  • 位置:绝对/固定

1
万一链接消失了,您可以在文章中添加一些细节吗?

早上好,澳大利亚!感谢您的评论。
hqcasanova

这对于显示可能必须与图像或附近浮动侧栏竞争的代码块非常有用。
AlexMA 2014年

最初描述的技术效果很好,尽管正如其他人所说,这不是我期望的行为。但是,我看不到浮动或内联块工作不会溢出,并且与表相关的显示值和绝对或固定位置当然会带来其他布局后果,这在上下文中可能是可接受的,也可能是不可接受的。
enigment

3

如果你想在margin-left一个上工作span元素,你需要使它display: inline-blockdisplay:block为好。


大概也需要vertical-align: top;这个。
ThinkingStiff

2

设置display:flex文字对我有用。


这似乎是更现代的环境设置overflow:auto。我确信它在所有情况下都不会完全一样,但对我也一样。
马特·布朗

1

将div环绕在图像和跨度周围,然后将以下内容添加到CSS中,如下所示:

的HTML

        <li id="CN2787">
          <div><img class="fav_star" src="images/fav.png"></div>
          <div><span>Text, text and more text</span></div>
        </li>

的CSS

            #CN2787 > div { 
                display: inline-block;
                vertical-align: top;
            }

            #CN2787 > div:first-of-type {
                width: 35%;
            }

            #CN2787 > div:last-of-type {
                width: 65%;
            }

        #CN2787 {
            > div { 
                display: inline-block;
                vertical-align: top;
            }

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
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.