CSS: Madde işareti ile <li>


177

Bir merminin <li>bir <ol>veya içinde sağa ne kadar yatay alan ittiğini kontrol etmek istiyorum <ul>.

Yani, her zaman sahip olmak yerine

*  Some list text goes
   here.

Bunu değiştirebilmek istiyorum

*         Some list text goes
          here.

veya

*Some list text goes
 here.

Etrafa baktım, ancak tüm bloğu sola veya sağa kaydırmaya ilişkin talimatları bulabilirdim, örneğin, http://www.alistapart.com/articles/taminglists/


Yanıtlar:


161

İçeriğini spangöreceli olarak konumlandırılmış bir yere koyun , o zaman alanı leftözelliği ile kontrol edebilirsiniz 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>


Açıklığa kavuşturmak için, <span> etiketi bir sınıf atandığında anlamsal olabilir, örneğin <span class = "tel"> 123-456-7890 </span> dolaylı olarak semantiktir.
ingyhere

4
Adamın sorusunu gerçekten cevaplamak için +1;) (açıklık gerçek hayatta ideal olarak iyi uygulama futureproofing ve semantik için bir sınıfa sahip olsa da: gelecekte herhangi bir javascript veya yeni özellik geliştirme vb. Ekstra açıklıklar eklemek için iyi bir neden varsa içerik, şeyler dağınık olabilir)
user56reinstatemonica8

firefox düzgün görüntülenmiyor metin bu hile kullanarak mermi örtüşüyor
Jay Bhalodi

@ingyhere bu doğru değil, çünkü bu iddiayı kanıtlayan hiçbir şey bulamıyorum. Herhangi bir kaynak sağlayabilir misiniz?
WoIIe

@Holle Hmmm. Bu eski bir yorum ve endişe emin değilim - Eğer <SPAN>kullanabilirsiniz idveya classetiket olup olmadığını , W3C bir göz atın . Eğer soru anlamsal anlam taşıyıp taşıyamayacağı ise bu cevaba bakınız . Teknik olarak, <SPAN>etiket tek başına semantik olmayan bir satır içi öğedir, ancak bir şekilde yeniden kullanımında daha fazla esneklik sağlar. Günümüzde, inline-blocktanımlayıcıyı çok daha fazla biçimlendirme seçeneğine izin vermek için kullanabileceğine inanıyorum .
ingyhere

120

Burada diğer yanıtları özetlemek gerekirse - <li>madde işaretleri ve bir liste öğesindeki metin arasındaki boşluk üzerinde daha iyi kontrol istiyorsanız seçenekleriniz şunlardır:

(1) Arka plan resmi kullanın:

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

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

Avantajları:

  • Madde işareti için istediğiniz herhangi bir resmi kullanabilirsiniz
  • CSS'yi background-positionkullanarak görüntüyü metne göre hemen hemen istediğiniz yere, piksel, ems veya% kullanarak konumlandırmak için kullanabilirsiniz.

Dezavantajları:

  • Sayfanıza fazladan (küçük de olsa) bir resim dosyası ekleyerek sayfa ağırlığını artırır
  • Bir kullanıcı tarayıcısında metin boyutunu artırırsa, madde işareti orijinal boyutunda kalacaktır. Ayrıca, metin boyutu arttıkça konumdan daha da uzaklaşacaktır.
  • Yalnızca genişlik yüzdeleri kullanarak 'duyarlı' bir düzen geliştiriyorsanız, madde işaretini bir dizi ekran genişliği üzerinde tam olarak istediğiniz yere götürmek zor olabilir

2. <li>Etikette dolgu kullanın

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

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

Avantajları:

  • Görüntü yok = indirilecek 1 dosya daha az
  • Üzerindeki dolguyu ayarlayarak, madde işareti ile metin arasına istediğiniz <li>kadar fazla yatay boşluk ekleyebilirsiniz.
  • Kullanıcı metin boyutunu büyütürse, boşluk ve madde işareti boyutu orantılı olarak ölçeklenmelidir

Dezavantajları:

  • Madde işareti, tarayıcı varsayılanından metne daha yakın olamaz
  • CSS'nin yerleşik madde işareti türlerinin şekilleri ve boyutları ile sınırlıdır
  • Madde işareti metinle aynı renkte olmalıdır
  • Merminin dikey konumlandırması üzerinde kontrol yok

(3) Metni fazladan bir <span>öğeye sarın

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

Avantajları:

  • Görüntü yok = indirilecek 1 dosya daha az
  • Sen seçeneği ile daha merminin pozisyonu üzerinde daha fazla kontrol elde (2) - benim en iyi çabalarına rağmen bunu ekleyerek dikey konumunu değiştiremezsiniz görünse de (metne yakın taşıyabilirsiniz padding-topiçin<span> başkası olabilir. bunun için bir çözüm olsa da ...)
  • Madde işareti metinden farklı bir renk olabilir
  • Kullanıcı metin boyutunu büyütürse, madde işareti orantılı olarak ölçeklendirilmelidir (ems'de dolgu ve kenar boşluğunu px değil olarak ayarlamanız gerekir)

Dezavantajları:

  • Ekstra bir unsemantic eleman gerektirir (bu muhtemelen SO'da gerçek hayatta olduğundan daha fazla arkadaşınızı kaybedecektir;) ancak kodlarını mümkün olduğunca yalın ve verimli olmak isteyenler için can sıkıcıdır ve sunum ile içeriğin ayrılmasını ihlal eder. HTML / CSS'nin sunması gerekiyor)
  • Merminin boyutu ve şekli üzerinde kontrol yok

İşte CSS4'teki bazı yeni liste tarzı özellikleri umuyoruz, böylece resimlere başvurmadan veya exta işaretlemeden daha akıllı mermiler oluşturabiliriz :)


4
Mükemmel cevap. # 2'nin çalışması için liste stili konumunuzu koruduğunuzdan emin olun outside.
Tom Auger

Span öğesi benim için düzeltmedir. Bu cevabı sadece negatif mutlak konumlamaya negatif marjı tercih ettiğim için + 1'ledim - iyi bir sebep olmadan.
FlipMcF

Satırları saran bir metniniz varsa display: block;, kaydırılan metnin de hizalanması için span öğesine eklemem gerektiğini buldum (ayrıca açıklıklar yerine çapa etiketleri kullandım)
Kevin M

Sadece bu da olmayan her şey için arka plan resimleri kullanmak neredeyse her zaman çok kötü bir fikirdir. Kaydedilemez, yazdırılmaz ve ekran okuyucuları tarafından belirtilmezler. <span> kullanmak bunu çözmenin en zarif yoludur. dolgu, mermilerin konumunu değiştirdiği için çalışmaz.
Bachsau

3
Bunun için ASLA arka plan resmi kullanmam. : Before öğesini her zaman şu içerikle birlikte kullanabilirsiniz: "•"; daha sonra kontrol etmek için öğeden önce dolgu ve mutlak konumu kullanırsınız.
Yann Chabot

37

Bunu yapmalı. Mermilerinizi dışarıya ayarladığınızdan emin olun. IE7'de aşağı doğru bırakabiliyorsanız, CSS sözde öğelerini de kullanabilirsiniz. Bu tür şey için sözde öğeler kullanmanızı gerçekten tavsiye etmiyorum ama mesafeyi kontrol etmek için çalışıyor.

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
Bu cevabın kabul edilmediğine inanamıyorum. % 100 CSS, gereksiz <span> öğesi eklemiyor ve sonunda neden iç / dış seçenek olduğunu anlamamı sağladı! (ve bahsedilen yinelenen sorunun kabul edilen cevabı ...)
MindTailor

1
Elemanları kullanmak list-style-position: outsideve doldurmak LI, mermi noktaları arasındaki mesafeyi artırmanıza izin verir, ancak yine de tarayıcı tarafından belirlenen ofsetin ötesinde başka bir şekilde çalışmaz. Bu JS Bin'e bakın .
Mesagoma

4
Zeyilname: Modern tarayıcılarda (IE9 +, FF, Chrome, vb.), Madde işareti noktası ve içerik arasındaki tarayıcı tarafından zorlanan mesafeyi olumsuz yönde etkilemek için veya text-indentüzerinde negatif kullanın . Yani, mesafeyi artırmak için yukarıda gösterildiği gibi artırın ve madde işareti ile içerik arasındaki mesafeyi istediğiniz gibi azaltmak için azaltın. <UL><LI><LI>padding-lefttext-indent
Mesagoma

1
Ne yazık ki , yukarıda belirtilen tüm masaüstü tarayıcıları için, bir <LI>sargının içeriği ikinci bir satıra sarılırsa, bu sonraki satırlar, ilk satır için geri almayı başardığımız kenar boşluğu / dolgu / girintisine göre yeniden girintili hale gelir text-indent. İç Çekme
Mesagoma

başka bir seçenek ise: before sözde öğelerini kullanmak ve içeriği istediğiniz gibi ayarlamaktır. oradan sözde elemanları istenen şekilde konumlandırın.
Kevin

14

Eski soru, ama: önce sözde eleman burada iyi çalışıyor.

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

Gerçekten iyi çalışıyor ve çok fazla kural veya html gerektirmiyor.

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

Şerefe!


3
Güzel ve basit bir cevap. Ben bu ayar margin-left: -5px(veya herhangi bir değer) mermi ve <li>öğe arasındaki boşluğu azaltacağını
eklerdim

2
Not: Bu asılı girintileri desteklemez
Eric

Müthiş cevap, bu en az miktarda iş ile mükemmel çalıştı! Teşekkürler!
KyleFarris

12

İçin list-style-type: inline :

DSMann8'in yanıtıyla neredeyse aynı, ancak daha az css kodu.

Sadece ihtiyacın var

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

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

Şerefe


Bu da işe yarıyor list-style-position: inside, bu harika!
Matt Dodge

11

Sen kullanabilirsiniz padding-leftliste öğeleri özellik ( değil listedeki kendisinde!).


5
Lütfen bunun yalnızca list-style-positionvarsayılan olarak ayarlanmışsa işe yaradığını unutmayın outside.
Ağustos

Bu en azından normal kullanım için kabul edilen cevap olmalıdır. Bir <span>elemanı sadece tasarım amacıyla kullanmaktan kaçınır .
eukras

7

Li'de metin girintisini kullanmak en iyi sonucu verir.

metin girintisi: -x px; mermiyi li'ye ve tam tersine hareket ettirecektir.

Span üzerinde span kullanıldığında, IE için eski sürümlerde negatif sol düzgün çalışmayabilir. Not: olabildiğince çok pozisyon vermekten kaçının.


Bu Chrome'da garip davranıyor. -5px'de az yer kaplar;
Ian Warburton

7

İşte css sayacı ve sözde öğeleri kullanan başka bir çözüm. Ekstra html biçimlendirme veya css sınıfları gerektirmediği için daha zarif buluyorum:

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
}

Aralıklı liste öğelerimin yalnızca ilk satırını etkileyecek şekilde (liste öğesi birden fazla satır uzunluğundaysa) kırılmaz boşluklar kullanıyorum. Bunun yerine burada dolgu kullanabilirsiniz.


7

Eski soru ama yine de alakalı. Negatif kullanmanızı tavsiye ederim text-indent. list-style-positionolmalıdıroutside .

Artıları:

  • Mermi otomatik olarak düzgün bir şekilde yerleştirilmiş
  • Yazı tipi boyutunu değiştirmek madde işareti konumunu bozmaz
  • Ek öğe yok (no :: sözde öğe de)
  • CSS'de değişiklik yapmadan hem RTL hem de LTR için çalışır.

Eksileri:

  • Deneyin
  • için
  • bulmak
  • bir :)

2
Bu yöntemi kullanmayı denedim ama satır sonları varsa girinti benim için çalışmıyor. Metin girintisi yalnızca ilk satıra girintili olur.
Matt

6

Sırasız bir liste ul etiketi ile başlar. Her bir liste öğesi, Liste öğeleri varsayılan olarak madde işaretleri (küçük siyah daireler) ile işaretlenir:

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

Çıktı:

<!DOCTYPE html>
<html>
<body>

<h2>Normal List </h2>

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

</body>
</html>

Text-indent özelliği, bir metin bloğundaki ilk satırın girintisini belirtir.
Not: Negatif değerlere izin verilir. Değer negatifse ilk satır sola girintili olacaktır.

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

Cevabınız için teşekkürler, lütfen başkalarının anlayışını kolaylaştırmak için çözümlerinize açıklama eklemeyi deneyin.
hakimiyet

bu en iyi cevaptır ve kabul edilmelidir. minimum CSS!
KawaiKx

5

Görünüşe göre (bir şekilde) <li> etiketindeki dolguyu kullanarak aralığı kontrol edebilirsiniz.

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

Yakalama, son örneğiniz gibi rahatça ezmenize izin vermiyor gibi görünüyor.

Bunun için liste stili türünü kapatmayı ve & bull;

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

5

Yalnızca madde işareti noktası ile metin arasındaki mesafeyi azaltmak istiyorsanız çok daha temiz bir çözüm var gibi görünüyor:

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

4

Dikey ve yatay konumlandırma üzerinde tam kontrol sağlayan alternatif bir arka plan görüntüsü alternatifi de kullanabilirsiniz.

Bu sorunun cevabına bakınız



0

Sen kullanabilirsiniz ul li:beforeve bir arka plan görüntüsü ve atamak position: relativeve position:absolutekarşı live li:beforesırasıyla. Bu şekilde bir görüntü oluşturabilir ve görüntüyü li'ye göre istediğiniz yere konumlandırabilirsiniz.


0

Etiket padding-left:1em; text-indent:-1emiçin kullanın <li>.
Ardından list-style-position: insideiçin <ul>etiketi.

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

0

Aşağıdaki çözüm, metni madde işaretine yaklaştırmak istediğinizde ve birden fazla metin satırınız olsa bile iyi çalışır .

margin-right metni madde işaretine yaklaştırmanızı sağlar

text-indent birden çok metin satırının doğru şekilde hizalanmasını sağlar

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>

resim açıklamasını buraya girin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.