CSS:箇条書きと<li>の間のスペースを制御する


177

またはで、弾丸がどれだけの水平方向のスペースを<li>右に押すかを制御したいと思います。<ol><ul>

つまり、常に持っている代わりに

*  Some list text goes
   here.

それを変えられるようにしたい

*         Some list text goes
          here.

または

*Some list text goes
 here.

見回したが、ブロック全体を左または右にシフトするための指示しか見つかりませんでした。たとえば、http://www.alistapart.com/articles/taminglists/


回答:


161

span相対的に配置されているにコンテンツを配置すると、のleftプロパティによってスペースを制御できますspan

li span {
  position: relative;
  left: -10px;
}
<ul>
  <li><span>item 1</span></li>
  <li><span>item 2</span></li>
  <li><span>item 3</span></li>
</ul>


明確にするために、クラスが割り当てられている場合、<span>タグはセマンティックにすることができます。たとえば、<span class = "tel"> 123-456-7890 </ span>は暗黙的にセマンティックです。
ingyhere 2012年

4
+1は実際に男の質問に答えるためです;)(スパンは理想的には実際の生活の中でとにかく優れたプラクティスの将来性とセマンティクスのためのクラスを持つ必要があります:将来、JavaScriptまたは新機能の開発などがスパンを追加するのに十分な理由がある場合あなたのコンテンツに、物事が乱雑になる可能性があります)
user56reinstatemonica8

Firefoxでは適切に表示されないテキストがこのトリックを使用して箇条書きと重なっています
Jay Bhalodi

@ingyhere私はこの主張を証明するものを見つけることができないので、これは真実ではないでしょう。ソースを提供できますか?
WoIIe、

@ウォルフム。それは古いコメントであり、私は懸念については確信がありません- それがタグ<SPAN>を利用できるかどうかについては、W3Cを見てください。問題が意味的な意味を伝えることができるかどうかである場合は、この回答を参照してください。技術的には、タグ自体は非セマンティックインライン要素ですが、何らかの方法で再利用の柔軟性が高まります。今日では、記述子を使用して、より多くの範囲のフォーマットオプションを許可できると思います。idclass<SPAN>inline-block
ingyhere

120

ここで他の回答を要約すると、箇条書きと<li>リストアイテムのテキストの間のスペースをより細かく制御したい場合、オプションは次のとおりです。

(1)背景画像を使用する:

<style type="text/css">
li {
    list-style-type:none;
    background-image:url(bullet.png);
}
</style>

<ul>
    <li>Some text</li>
</ul>

利点:

  • 弾丸に好きな画像を使用できます
  • CSS background-positionを使用して、ピクセル、ems、または%を使用して、テキストに対して画像を配置することができます。

短所:

  • ページに余分な(ただし小さい)画像ファイルを追加し、ページの重みを増やします
  • ユーザーがブラウザのテキストサイズを大きくすると、箇条書きは元のサイズのままになります。また、テキストサイズが大きくなると、位置がずれる可能性があります。
  • 幅のパーセンテージのみを使用して「レスポンシブ」レイアウトを開発している場合、画面の幅の範囲全体で、必要な場所に箇条書きを正確に取得することが難しい場合があります。

2. <li>タグにパディングを使用する

<style type="text/css">
ul {padding-left:1em}
li {padding-left:1em}
</style>

<ul>
    <li>Some text</li>
</ul>

利点:

  • 画像なし=ダウンロードするファイルが1つ少ない
  • のパディングを調整することで、箇条書きとテキストの間に必要なだけの水平スペースを<li>追加できます。
  • ユーザーがテキストサイズを大きくすると、間隔と箇条書きのサイズが比例して拡大するはずです。

短所:

  • 箇条書きをブラウザのデフォルトよりテキストに近づけることはできません
  • CSSの組み込みの弾丸タイプの形状とサイズに限定
  • 箇条書きはテキストと同じ色にする必要があります
  • 弾丸の垂直方向の配置を制御できない

(3)テキストを追加の<span>要素で囲む

<style type="text/css">
li {
    padding-left:1em;
    color:#f00; /* red bullet */
}
li span {
    display:block;
    margin-left:-0.5em;
    color:#000; /* black text */
}
</style>

<ul>
    <li><span>Some text</span></li>
</ul>

利点:

  • 画像なし=ダウンロードするファイルが1つ少ない
  • オプション(2)よりも箇条書きの位置をより詳細に制御できます–箇条書きをテキストに近づけることができます(ただし、私の最善の努力にもかかわらずpadding-top<span>。他の誰かがただし、これの回避策...)
  • 弾丸はテキストとは異なる色にすることができます
  • ユーザーがテキストサイズを大きくする場合、箇条書きは比例して拡大する必要があります(pxでなくemsでパディングとマージンを設定した場合)

短所:

  • 余分な非セマンティック要素が必要です(これにより、実際の生活よりもSOの方が友を失う可能性があります;)しかし、コードを可能な限り無駄のない効率的なものにしたい人にとっては煩わしく、プレゼンテーションとコンテンツの分離に違反します。そのHTML / CSSは提供することになっています)
  • 弾丸のサイズと形を制御できない

ここでは、CSS4の新しいリストスタイルの機能を期待しています。これにより、画像やエクスタマークアップに頼らずに、よりスマートな箇条書きを作成できます。


4
すばらしい答えです。#2が機能するためには、リストスタイルの位置をに維持してくださいoutside
トム・オージェ

スパン要素は私のための修正です。私はこの答えを+1しましたが、それは私が負の絶対位置よりも負のマージンを優先したからです-理由はありません。
FlipMcF 2013

行をラップするテキストがある場合、ラップされたテキストも整列するdisplay: block;ようにspan要素に追加する必要があることがわかりました(また、スパンの代わりにアンカータグを使用してしまいました)
Kevin M

それ以外の目的で背景画像を使用することは、ほとんどの場合非常に悪い考えです。保存できず、印刷もされず、スクリーンリーダーからの言及もありません。これを解決するには、<span>を使用するのが最もエレガントな方法です。彼らはまた、弾丸の位置を変更するので、パディングは機能しません。
Bachsau 2016年

3
私はこれに背景画像を決して使用しません。常に:before要素をコンテンツで使用できます: "•"; 次に、要素の前にパディングと絶対位置を使用して要素を制御します。
Yann Chabot

37

これでうまくいくはずです。弾丸は必ず外側に向けてください。IE7にそれらをドロップできる場合は、CSS疑似要素を使用することもできます。この種のことには疑似要素を使用することはお勧めしませんが、距離を制御するために機能します。

ul {
  list-style: circle outside;
  width: 100px;
}

li {
  padding-left: 40px;
}

.pseudo,
.pseudo ul {
  list-style: none;
}

.pseudo li {
  position: relative;
}

/* use ISO 10646 for content http://la.remifa.so/unicode/named-entities.html */
.pseudo li:before {
  content: '\2192';
  position: absolute;
  left: 0;
}
<ul>
  <li>Any Browser really</li>
  <li>List item
    <ul>
      <li>List item</li>
      <li>List item</li>
    </ul>
  </li>
</ul>

<ul class="pseudo">
  <li>IE8+ only</li>
  <li>List item
    <ul>
      <li>List item with two lines of text for the example.</li>
      <li>List item</li>
    </ul>
  </li>
</ul>


5
この答えが受け入れられないとは信じられません。それは100%CSSであり、余分な<span>要素を追加せず、内部/外部オプションがある理由を最終的に理解しました!(そして、それは言及された重複した質問の受け入れられた答えです...)
MindTailor

1
要素を使用list-style-position: outsideしてパディングするとLI、箇条書きポイント間の距離を広げることができますが、ブラウザが指定したオフセットを超えて他の方法では機能しません。このJS Binを参照してください。
Mesagoma 2013

4
補遺:最新のブラウザ(IE9 +、FF、Chromeなど)ではtext-indent<UL>またはで負の値を使用して<LI>、ブラウザの箇条書きと<LI>コンテンツの間の距離を無効にします。つまり、padding-left上記のように距離を増やすには距離を増やし、text-indent必要に応じて箇条書きとコンテンツの間の距離を減らすには減らします。
Mesagoma 2013

1
悲しいかな、上記のすべてのデスクトップブラウザで、<LI>ラップの内容が2行目に折り返されると、そのような後続の行は、最初の行でを介して元に戻すことができたmargin / padding / indentに基づいて再インデントされますtext-indentため息
メサゴマ2013

別のオプションは、:before疑似要素を使用して、コンテンツを好きなように設定することです。そこから、必要に応じて疑似要素を配置します。
ケビン

14

古い質問ですが、:before疑似要素はここでうまく機能します。

<style>
    li:before {
        content: "";
        display: inline-block;
        height: 1rem;  // or px or em or whatever
        width: .5rem;  // or whatever space you want
    }
</style>

それは本当にうまく機能し、多くの追加のルールやhtmlを必要としません。

<ul>
    <li>Some content</li>
    <li>Some other content</li>
</ul>

乾杯!


3
素敵でシンプルな答え。私はその設定追加することになりmargin-left: -5px、弾丸との間のスペース減少します(または任意の値)を<li>要素
binaryfunt

2
注:ぶら下げインデントはサポートされていません
Eric

すばらしい回答です。これは、最小限の作業で完全に機能しました。ありがとう!
KyleFarris

12

以下のためのlist-style-タイプ:インライン

これはDSMann8の回答とほとんど同じですが、CSSコードが少なくなっています。

あなたはただする必要があります

<style>
    li:before {
        content: "";
        padding-left: 10px;
    }
</style>

<ul>
    <li>Some content</li>
</ul>

乾杯


これも機能しlist-style-position: insideます。
Matt Dodge

11

padding-left(リスト自体ではなく)リスト項目で属性を使用できます。


5
これlist-style-positionがデフォルトに設定されている場合にのみ機能することに注意してくださいoutside
2015年

これは、少なくとも通常の使用では、受け入れられる答えであるはずです。<span>設計目的でのみ要素を使用することは避けます。
ユークラス

7

liでテキストインデントを使用するのが最適です。

text-indent:-x px; 弾丸をliに近づけ、逆も同様です。

スパンで相対を使用すると、IEの古いバージョンでは負の左が正しく機能しない場合があります。PS-できるだけ多くのポジションを与えないでください。


これはChromeでは奇妙な動作をします。-5pxで小さなスペースにスナップします。
Ian Warburton 2017年

7

これは、cssカウンターと疑似要素を使用した別のソリューションです。追加のhtmlマークアップやcssクラスを使用する必要がないので、よりエレガントだと思います。

ol,
ul {
    list-style-position: inside;
}

li {
    list-style-type: none;
}

ol {
    counter-reset: ol; //reset the counter for every new ol
}

ul li:before {
        content: '\2022 \00a0 \00a0 \00a0'; //bullet unicode followed by 3 non breakable spaces
}

ol li:before {
        counter-increment: ol;
        content: counter(ol) '.\00a0 \00a0 \00a0'; //css counter followed by a dot and 3 non breakable spaces
}

分割できないスペースを使用して、スペースがリスト要素の最初の行にのみ影響するようにします(リスト要素が複数行の場合)。代わりにここでパディングを使用できます。


7

古い質問ですが、まだ関連があります。ネガティブの使用をお勧めしtext-indentます。 list-style-positionでなければなりませんoutside

長所:

  • 弾丸は適切に自動的に配置されます
  • フォントサイズを変更しても箇条書きの位置が崩れない
  • 余分な要素はありません(:: pseudo-elementsもありません)
  • CSSを変更することなく、RTLとLTRの両方で機能します。

短所:

  • 試す
  • 見つける
  • 1 :)

2
この方法を試しましたが、改行があるとインデントが機能しません。テキストのインデントは最初の行だけをインデントします。
マット

6

順不同リストはulタグで始まります。各リストアイテムは、デフォルトで始まります。リストアイテムには、デフォルトで黒丸(小さな黒い円)が付けられます。

    <!DOCTYPE html>
    <html>
       <body>
          <h2>Normal List </h2>
          <ul>
             <li>Coffee</li>
             <li>Tea</li>
             <li>Milk</li>
          </ul>
       </body>
    </html>

出力:

<!DOCTYPE html>
<html>
<body>

<h2>Normal List </h2>

<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

</body>
</html>

text-indentプロパティは、テキストブロックの最初の行のインデントを指定します。
注:負の値を使用できます。値が負の場合、最初の行は左にインデントされます。

<ul style='text-indent: -7px;'>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

回答をありがとうございます。ただし、他の人が理解しやすいように、ソリューションに注釈を付けてください。
cdomination

これが最良の答えであり、受け入れられるべきです。最小限のCSS!
KawaiKx 2017年

5

<li>タグのパディングを使用して、(ある程度)間隔を制御できるようです。

<style type="text/css">
    li { padding-left: 10px; }
</style>

キャッチは、それがあなたの最後の例のようにすっかり引っ張ることができないように見えることです。

そのためには、list-style-typeをオフにして&bull;を使用してみてください。

<ul style="list-style-type: none;">
    <li>&bull;Some list text goes here.</li>
</ul>

5

箇条書きとテキストの間隔を狭くしたいだけなら、もっとすっきりした解決策があるようです。

li:before {
    content: "";
    margin-left: -0.5rem;
}



0

ul li:beforeとの背景画像を使用position: relativeposition:absoluteて、lili:beforeにそれぞれとを割り当てることができます。このようにして、イメージを作成し、liを基準にして好きな場所に配置できます。


0

タグに使用padding-left:1em; text-indent:-1em<li>ます。
その後、list-style-position: inside<ul>タグ。

<ul style='list-style-position: inside;'>
  <li style='padding-left: 1em; text-indent: -1em;'>Item 1</li>
</ul>

0

次の解決策は、テキストを箇条書きに近づけたい場合や、複数行のテキストがある場合でも適切に機能します。

margin-right テキストを箇条書きに近づけることができます

text-indent 複数行のテキストが正しく整列することを保証します

li:before {
  content: "";
  margin-right: -5px; /* Adjust this to move text closer to the bullet */
}

li {
  text-indent: 5px; /* Aligns second line of text */
}
<ul>
  <li> Item 1 ... </li>
  <li> Item 2 ... this item has tons and tons of text that causes a second line! Notice how even the second line is lined up with the first!</li>
  <li> Item 3 ... </li>
</ul>

ここに画像の説明を入力してください


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