リストアイテムの箇条書きがフローティング要素と重なるのはなぜですか


166

(XHTML Strict)ページがあり、テキストの通常の段落と一緒に画像をフロートさせます。段落の代わりにリストを使用する場合を除いて、すべてうまくいきます。リストの箇条書きは、浮動画像に重なっています。

リストまたはリストアイテムの余白を変更しても効果はありません。マージンはページの左側から計算されますが、フロートはリストアイテムをページの右側にプッシュしliます。したがって、マージンは、イメージよりも広くした場合にのみ役立ちます。

画像の横にあるリストをフローティングにすることもできますが、リストがフロートの横にあるときはわかりません。これを修正するためだけにコンテンツのすべてのリストをフロートしたくありません。また、画像をリストの左ではなくにフロートすると、左にフロートするとレイアウトがめちゃくちゃになります。

設定li { list-style-position: inside }により、箇条書きがコンテンツと一緒に移動しますが、上の行ではなく折り返される行が箇条書きに揃えられます。

この問題は明らかに、弾丸がボックスの外側にレンダリングされ、フロートがボックスのコンテンツを(ボックス自体ではなく)右に押しているために発生します。これがIEとFFがこの状況を処理する方法であり、私の知る限り、仕様によると問題ではありません。問題は、どうすればそれを防ぐことができるかということです。

回答:


280

この問題の解決策を見つけました。適用するul { overflow: hidden; }にはulボックス自体ではなく、ボックスの内容を、フロートによって押しのけされることを保証します。

IE6だけがのレイアウトul { zoom: 1; }を確認するために条件付きコメントを必要としulます。


1
+1:素晴らしいCSS、私は狂ったようにGOOD VERSATILEの解決策を探しました、そしてそれはSOにあります。唯一の小さな欠点は、ズームプロパティがCSSを検証しないことですが、テストした結果、IE7ではIE8は必要ないため、おそらくIE6のみです。
Marco Demaio、2010

14
これを実際に機能させるために、私も適用する必要がありました:ul、ol {overflow:hidden; padding-left:40px; margin-left:0; } ol li、ul li {list-style-position:outside; 左詰め:0; これにより、ブラウザー間で一貫したレンダリングが強制され、IE6に箇条書きが表示されました。それ以外の場合、弾丸は隠されていました。ul {ズーム:1; ie6固有の設定でも、}が必要でした。
Mandrake

1
MSIEのこのようなばかげたバグに対するばかばかしいほど単純なソリューション。
SF。

10
それは完璧な解決策ではありません。Blazemongerが打撃を述べたように、画像が小さく、リストが非常に長い場合、リストは浮動画像の周囲を流れません。画像が非常に広い場合、リストには上から最後まで大きなマージンがあります。
ヤン14

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: 1emしてli、コンテナがオーバーフローしないようにする必要もあります。


私もこの修正を好んでいます。一番上の修正がTwitter Bootstrapのドロップダウンを壊し、上記の方法が原因であると永久に理解しました。
Ian Hoar 2012

2
これをありがとう。オーバーフローの適用:非表示。コンテナULを使用すると、個々のラインアイテムのテキストがフロートブロックの周りを適切に実行できなくなりました。この解決策でうまくいきました!
jsdalton 2013年

1
この解決策で軽微ではありますが重大な問題が発生しました。改善点を追加することをお勧めします。理由はわかりませんがposition: relative;、ラインアイテムに追加すると、フロートされたコンテンツにスタック問題が発生します。(ChromeとFirefoxで)フローティングコンテンツのリンクにカーソルを合わせてクリックするのが難しいことがわかりました。私の修正はposition: relative; z-index: 1;、フロート要素に追加することでした。これにより、スタックの問題が解決したようです。
jsdalton 2013年

7
残念ながら、IE 10では、弾丸はフローティング要素と重なっています。
Munawwar 2014

1
一方、ul {overflow: hidden;}すべてのブラウザでこの問題を解決し、上記の溶液は、この問題の唯一の作業の救済策だった王子XML、PDFコンバータへのXHTML + CSS3。
Serge Stroobandt、2015

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:insideを試してください。


3
list-style-position:inside素晴らしい解決策ですが、折り返される行は、上の行ではなく箇条書きに揃えられます。
Marco Demaio、

オーバーフロー:非表示。私の左フロート画像では機能しませんが、list-style-position:insideは機能しました!感謝
menardmam 2012

これは、IEでコンテンツをラップする唯一のソリューションでした。ありがとう!
jordan314 2015年

これは、コンテンツが箇条書きと箇条書きのコンテンツの間にある場合に最適なソリューションです。
TylersSN 2016

これが選ばれた答えであるべきです。
Sleek Geek

18

http://archivist.incutio.com/viewlist/css-discuss/106382スタイル「リー」要素を持つ:私は私のために働いた提案が見つかりました:

position: relative;
left: 1em;

「1em」を、フロートが存在しない場合にリストアイテムが持つであろう左のパディング/マージンの幅に置き換えます。これは、フロートの下部がリストの中央にある場合でも、私のアプリケーションでうまく機能します。箇条書きは、(ローカルの)左マージンのすぐ右に戻ります。


2
素晴らしいソリューション、魅力のように機能します!フロート要素の隣にないリストにリスト項目番号を表示できなかったため、IE7で手を汚さなければなりませんでしたが。
maryisdead

@maryisdead IE7のソリューションは何ですか?
TJ。

IE7では、リストアイテムに余白を追加する必要がありました。このフィドルjsfiddle.net/maryisdead/wu6ew/5を参照して、2つのIE7ハックに注意してください。これを先に追加しないでごめんなさい。
maryisdead 2012年

18

なぜoverflow: hidden機能するのか

ソリューションは次のように簡単です。

ul {overflow: hidden;}

overflow:以外のを含むブロックボックスは、そのコンテンツのvisible 新しいブロックフォーマットコンテキスト確立します。W3Cの推奨事項:http : //www.w3.org/TR/CSS2/visuren.html#block-formatting

変装している私のウェブサイトのボタンは<li>このように作られています。ブラウザのビューポート(ウィンドウ)を小さくして、インデントの動作確認します

例として私のウェブサイト

関連する回答

例付きの記事


1
これが機能する理由を説明していただきありがとう
ございます(

17

少なくとも私のためoverflow: auto;にあなたのul作品に追加することによって。

更新

何が起こっているのかを視覚化するために、jsfiddleを更新しました。ulフローティングの横にある場合img、のコンテンツはulフロートによってプッシュされますが、実際のコンテナはプッシュされません。-box overflow: auto全体を追加ulすると、コンテンツだけでなくフロートによってプッシュされます。


13

あなたは割り当てることができますposition: relative; left: 10px;li。(さらにmargin-right: 10px;、を指定することもできます。そうしないと、右側が広くなりすぎる可能性があります。)

または、他のユーザーが提案しているように- を使用floatしたい場合ulは、ulにclear: left続く要素でを使用して、残りがulの右に浮かないようにすることができます。


クリス、その立場に感謝:親族は働いた。ulの後に要素をクリアすることから生じる問題は、要素が左のフロートdivもクリアすることです。
superUntitled


7

免責事項

浮動要素の横にあるリストは問題を引き起こします。私の意見では、この種のフローティングの問題を回避する最良の方法は、コンテンツと交差するフローティング画像を回避することです。また、レスポンシブデザインをサポートする必要がある場合にも役立ちます。

段落の中央に画像を配置するシンプルなデザインは非常に魅力的に見え、派手になりすぎるよりもはるかに簡単にサポートできます。また、から一歩離れてい<figure>ます。

しかし、私は本当に浮遊画像が欲しいです!

[OK]を、あなたがしているそうだとすれば狂っこの道を継続するための永続的なことに、使用することができますカップルの技法があります。

最も簡単なのは、リストを使用する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番目のオプションが好きですが、テキストは実際には長いテキスト(2行)の箇条書きで始まります:-(
Arany

4

ULタグで次のことを試してください。これにより、画像を覆う弾丸が処理され、によって引き起こされる左揃えを台無しにする必要はありませんlist-position: inside

overflow: hidden; 
padding-left: 2em; 

これをBlazemongerのソリューション(上記の#2)で使用する必要がありました。BLazemongerだけでは、IE 9-11とOperaでは機能しませんでした。これにより、すべてのブラウザで動作します。カミエルの(#1)ソリューションは、弾丸を隠してしまったため機能しませんでした。Bootstrap3と競合している可能性があります。
Leraa

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

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、2017年

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

そのための+1を与えました...この質問に関連付けられたリンクを見て、<p>が<ul>の右側に浮いていると仮定しました。良いキャッチ。
Reece


0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

margin-left:autoは、要素自体を右揃えにします。必要な要素の高さと幅を設定します-私の場合、これはdiv内の背景画像です





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