画像の下でのテキストの折り返しを停止するCSS


87

私は次のマークアップを持っています:

<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 2012

ここであなたの意図についてもう少し明確にする必要があると思います。テキストを折り返したくない場合white-space: nowrap;li span {...}、で使用できますが、他のことをしようとしているような印象を受けます
My Head Hurts

@MyHeadHurtsお詫び-私には明らかなようでした:)行に2つの列が必要です。左の20pxは画像用です。残りはテキスト用です。テキストが折り返される場合は、折り返しの2行目を左から20px(最初のテキストが始まった場所の下)から開始します。
ニック

1
通行人の場合、受け入れられた回答が示唆するように幅を扱う必要はありません。それははるかに簡単です:新しいフォーマットコンテキストと呼ばれるものを作成します。ジョーコンリンの答えを参照してください。さらなる背景については、私のものを参照してください。
hqcasanova 2013年

1
@hqcasanova記録として、ダンの回答は、ジョーが投稿する9か月前と、あなたの回答の16か月前に受け入れられました。選択肢を追加してくれてありがとうが、私はダンの答えを受け入れるつもりはありません。
ニック

回答:


35

この質問は多くの意見を集めており、これは受け入れられた答えだったので、次の免責事項を追加する必要があると感じました。

この回答は、OPの質問(例で設定された幅を持っていた)に固有のものでした。それが機能している間、それはあなたが要素、画像と段落のそれぞれに幅を持っていることを要求します。それがあなたの要件でない限り、私はこの質問に対する別の答えとして投稿されているジョー・コンリンの解決策を使用することをお勧めします。

ザ・ 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を使用して幅を設定できます。

ただし、どちらの場合も、ブロック要素があるため、テキストがすべて画像の下に表示されないように、画像をフロートさせる必要があります。

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

PSは、代わりのfloat:left画像に、あなたも置くことができるfloat:rightli pが、その場合、あなたはまた、必要となるtext-align:leftテキストを正確に再調整します。

PSS<p>要素を追加しないという最初の解決策を進めた場合、CSSは次のようになります。

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

これは本当に役に立ちます。を要素に変更しspanましたp。次に、これら2つだけでうまくいくようですli p {margin-left: 40px} .fav_star {float: left}。画像の幅は画像自体によって設定され、p要素は自動的にaにblockなり、幅はそのままにしました。これをありがとう。
ニック

2
使用するdisplay:block場合は、divそれが目的であるため、同様に使用するpこともできます(または、あなたが提案するようにを使用します)。テキストを二重に折り返す必要はありません。を使用しているp場合は、を失う可能性がありspanます。
ガレス2012

IMO、ページのデザインを変更するためにHTMLを使用しないでください。これはCSSの仕事です(もちろん、特にブラウザー間の互換性が必要な場合は例外です)。適切なHTMLを使用し、「優れたセマンティクス」を持つことがより重要であると私は信じています。したがってdiv、この場合は、pを使用しない方が理にかなっています。を失うことspanは私にはちょっと些細なことであり、あなたがあなたのコンテンツをどのようにレイアウトしているかに依存します。
ダン

ラッピング<span>では<p>Hogwartzのまっすぐ魔法です!美しく動作します!
Janus

252

多くの人を捕らえているように見えるこの問題に対する非常に簡単な答え:

<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
実際、テキストを含む要素がspan(OPの場合)の場合、これは機能しません。にはAdisplay: blockが必要ですspan。しかし、それを除けば、私はそれがはるかにエレガントな解決策であることに同意します。誰かが背後overflow: hiddenにある魔法が何であるか疑問に思っている場合は、以下の私の答えを参照してください。
hqcasanova 2013年

7
それは私が期待する振る舞いではありませんが、これは素晴らしいです。
Gavin 2014年

2
記録のために、この答えは私がチェックしたものの8か月後に来ました:)
ニック

2
ワオ。完璧に動作しました。これまで知らなかったなんて信じられません。
SFlagg 2015

25

背景情報が必要な人のために、なぜ機能するのかを説明する短い記事がありoverflow: hiddenます。これは、いわゆるブロックフォーマットコンテキストと関係があります。これはW3Cの仕様の一部であり(つまり、ハックではありません)、基本的にはブロックタイプのフローを持つ要素が占める領域です。

適用されるたびにoverflow: hidden新しいブロックフォーマットコンテキストが作成されます。しかし、その動作をトリガーできるのはそれだけではありません。Sydney Web AppsGroupのFionaChanによるプレゼンテーションの引用:

  • フロート:左/右
  • オーバーフロー:非表示/自動/スクロール
  • 表示:テーブルセルおよびテーブル関連の値/インラインブロック
  • 位置:絶対/固定

1
リンクが切れた場合に備えて、その記事の詳細を回答に追加できますか?

おはようオーストラリア!コメントありがとうございます。
hqcasanova 2013年

これは、近くの画像やフローティングサイドバーと競合する可能性のあるコードブロックを表示するのに最適です。
AlexMA 2014

最初に説明した手法はうまく機能しますが、他の人が言っているように、それは私が期待する動作ではありません。ただし、フロートまたはインラインブロックがオーバーフローなしで機能することはわかりません。もちろん、テーブル関連の表示値と絶対位置または固定位置は、コンテキストで受け入れられる場合と受け入れられない場合がある他のレイアウト結果をもたらします。
enigment 2017

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%;
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.