2009-10-04 18 views
48

Poszukuję sposobu na stylizację nieuporządkowanej listy w XHTML przy użyciu CSS tak, że jest on renderowany w linii, a elementy listy są oddzielone przecinkami.Jak stylizować nieuporządkowane listy w CSS jako tekst rozdzielany przecinkami

Na przykład poniższa lista powinna być wyświetlana jako apple, orange, banana (uwaga na brakujący przecinek na końcu listy).

<ul id="taglist"> 
    <li>apple</li> 
    <li>orange</li> 
    <li>banana</li> 
</ul> 

Obecnie używam następujący kod CSS do stylizacji tej listy, która prawie robi to, co chcę, ale renderuje listę jako apple, orange, banana, (Uwaga przecinek wleczonego po banana).

#taglist { 
    display: inline; 
    list-style: none; 
} 

#taglist li { 
    display: inline; 
} 

#taglist li:after { 
    content: ", "; 
} 

Czy istnieje sposób rozwiązania tego problemu za pomocą czystego CSS?

+2

Podoba mi się, dokąd zmierzasz. Im bardziej możesz zachować nienaruszoną strukturę danych, którą reprezentuje twój dokument, tym bardziej wykorzystujesz moc CSS. Jak zawsze jednak musisz zdawać sobie sprawę z tego, że starsze przeglądarki nie zrozumieją właściwości 'content'. – Jakob

+0

Znalazłem rozwiązanie bez dodatkowych reguł i wsparcia IE8 –

Odpowiedz

54

Aby usunąć przecinek z tyłu, należy użyć pseudo-klasę :last-child, tak:

#taglist li:last-child:after { 
    content: ""; 
} 
+0

Jest to z pewnością najłatwiejszy sposób, ale "ostatnie dziecko" jest jeszcze mniej dobrze zaimplementowane niż "pierwsze dziecko", choć zależy to od sposobu korzystania z witryny i może być zrekompensowane dla JS/jQuery, warunkowe komentarze do IE itp. (referencja: http://www.quirksmode.org/css/contents.html) –

+3

Nie mam danych na ten temat, ale miałem wrażenie, że przeglądarki nie implementuj "first-child" i "last-child" nie implementuj "przed", "po" i "treści" na początek. – Jakob

+0

Awesome. Wielkie dzięki. To rozwiązanie działa dobrze na Mac OS X w Safari 4.0.3 i FireFox 3.5.2. – SwedishChef

6

To zależy od implementacji przeglądarki, ale to powinno działać. Mimo że opiera się na first-child, co może ograniczać jego użycie, ale zasadniczo umieszcza przecinek przed tagiem pozycja, a nie po nim. Nie jestem pewien, w jaki sposób wpłyną na to, ale jeśli użyjesz `display: inline; przy marginesach i dopełnieniu ustawionym na zero, powinno być w porządku.

#taglist li:before {content: ", ";} 
#taglist first-child {content: ""; } /* empty string */ 

Zmieniano: odpowiedzieć w komentarzach korekt oferowanych przez Jakob.

następujące prace (strona demo tutaj: http://davidrhysthomas.co.uk/so/liststyles.html:

#taglist {width: 50%; 
     margin: 1em auto; 
     padding: 0; 
     } 

li  {display: inline; 
     margin: 0; 
     padding: 0; 
     } 

li:before {content: ", "; 
     } 

#taglist li:first-child:before 
     {content: ""; 
     } 

Chociaż przecinkami są dziwnie floating-in-the-middle-of-nigdzie, i, szczerze mówiąc, wolę zaakceptowane odpowiedź tak. ale tak na mnie nie pozostawiając potwornie złamane odpowiedź leżące wokół, pomyślałem, że powinienem go naprawić.

Dzięki Jakob.

+1

Właściwie to wygrało ' t działa. 'first-child' jest pseudoklasą, więc musi podążać za elementem (' li' w tym przypadku), a aby otrzymać pożądany wynik, musi być poprzedzone ': before', tak jak poniżej:' #taglist li: first-child: before {content: ""} '. – Jakob

+0

@Jakob Zrobiłem to samo z tylko jedną regułą z '+' selector =) –

0

nie ma css czysty sposób to zrobić to jest kompatybilne z różnymi przeglądarkami (dzięki do Microsoft) ggest po prostu robisz to z logiką po stronie serwera.

Prawdopodobnie można zbliżyć się przy użyciu klasy last na ostatnim li i używając obrazów tła dla wszystkich lisów, ale ostatnio, ale nie będzie w stanie zrobić: ostatnie dziecko i zawartość: w IE.

+1

rozwiązanie stało się kompatybilne z różnymi przeglądarkami począwszy od IE8, jeśli użyjesz selektora '+' zamiast ': last-child' i' before 'zamiast': po ' –

1

ten sposób, że faceci w A List Apart polecić w swoim artykule „Taming Lists„:

#taglist ul li:after { 
    content: ","; 
} 

#taglist ul li.last:after { 
    content: ""; 
} 

Wymaga to posiadania ostatnią pozycję na liście oznaczony z class wartość atrybutu «last»:

<ul id="taglist"> 
    <li>apple</li> 
    <li>orange</li> 
    <li class="last">banana</li> 
</ul> 
19

Wymień jeden reguła

#taglist li:after { 
    content: ", "; 
} 

z tylko jeszcze jeden

#taglist li + li:before { 
    content: ", "; 
} 

Plusy:

  • Jedna zasada zrobić całą pracę.
  • żadne zasady odwołać poprzednią regułę,
  • IE8 Wsparcie
+0

To jest całkiem sprytne, ale o ile mogę powiedzieć, wymaga dodatkowej logiki lub zmodyfikowanego kodu HTML, aby usunąć spacje, które pojawiają się przed każdym elementem listy, ponieważ istnieje biały znak między węzłami' li'. – Jakob

+0

@Jakob OH yeas. Wstyd mi. Istnieje tylko jeden wymóg, aby pozycja "float: left" dla elementów listy. –

+6

Sprytnie, ale nie podoba mi się to. Zachowuje się to słabo, jeśli twoja linia się zawala. –

Powiązane problemy