Zmień kolor punktorów na liście HTML bez używania zakresu


88

Zastanawiałem się, czy istnieje sposób na zmianę koloru kul na liście.

Mam taką listę:

<ul>
   <li>House</li>
   <li>Car</li>
   <li>Garden</li>
</ul>

Nie mogę wstawić niczego do li, na przykład „span” lub „p”. Czy mogę więc zmienić kolor punktorów, ale nie tekst w sprytny sposób?

Odpowiedzi:


34

Jeśli możesz użyć obrazu, możesz to zrobić. A bez obrazu nie będziesz w stanie zmienić tylko koloru punktorów, a nie tekstu.

Korzystanie z obrazu

li { list-style-image: url(images/yourimage.jpg); }

Widzieć

obraz w stylu listy

Bez użycia obrazu

Następnie musisz edytować znaczniki HTML i dołączyć rozpiętość do listy i pokolorować li i span różnymi kolorami.


1
Jep, to może zadziałać. Ale tak naprawdę zdecydowałem się użyć obrazu tła, a następnie typu listy: none; Dało mi to swobodę umieszczania „kul” nieco bardziej niż obraz w stylu listy. Ale nadal masz 1+ i poprawną odpowiedź.
Kim Andersen,

6
Działa również z plikami data-uri svg:list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
Jon Surrell

Stosując metodę @JonSurrell udało mi się osiągnąć bardzo przyjemny efekt. Szkoda, że ​​nie jest to jedna z sugerowanych odpowiedzi. Rozwiązanie to działa w różnych przeglądarkach dla postu IE8 i można je łatwo modyfikować w celu tworzenia ciekawych niestandardowych kształtów.
KoldBane

@KoldBane zobacz moją nową odpowiedź :)
Jon Surrell

@DimitryK, spójrz na pełną odpowiedź, którą napisałem, i kieruj tam wszelkie komentarze. Działa dobrze w FF43.
Jon Surrell

187

Udało mi się to bez dodawania znaczników, ale zamiast tego użyłem li:before. To oczywiście ma wszystkie ograniczenia :before(brak starej obsługi IE), ale wydaje się, że działa z IE8, Firefox i Chrome po kilku bardzo ograniczonych testach. Styl punktora jest również ograniczony przez zawartość Unicode.

li {
  list-style: none;
}
li:before {
  /* For a round bullet */
  content: '\2022';
  /* For a square bullet */
  /*content:'\25A0';*/
  display: block;
  position: relative;
  max-width: 0;
  max-height: 0;
  left: -10px;
  top: 0;
  color: green;
  font-size: 20px;
}
<ul>
  <li>foo</li>
  <li>bar</li>
</ul>


5
Ponadto, oto jak możesz zrobić to samo dla uporządkowanych list: jsfiddle.net/uZRGN
Nightfirecat

3
Świetny. Przy tak szerokim zastosowaniu IE8 + myślę, że to powinna być teraz odpowiedź. (Zauważ, że font-size:1emotrzymywałem pocisk o lepszych proporcjach!)
EvilDr

Nie podoba mi się to podejście, ponieważ co się stanie, gdy ktoś spróbuje wyrenderować ul z typem listy ustawionym na none? Oznacza to, że musisz uwzględnić te style w jakiejś klasie, np. Ul.greenDisc
ctb

19

Możemy łączyć list-style-imagez svgs, które możemy wstawić w css ! Ta metoda zapewnia niesamowitą kontrolę nad „kulami”, które mogą stać się wszystkim.

Aby uzyskać czerwone kółko, użyj następującego css:

ul {
  list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="10" height="10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
}

Ale to dopiero początek. To pozwala nam robić dowolne szalone rzeczy z tymi kulami. okręgi lub prostokąty są łatwe, ale wszystko, co możesz narysować svg, możesz tam umieścić! Sprawdź poniższy przykład w dziesiątkę:

Atrybuty szerokości / wysokości

Niektóre przeglądarki wymagają ustawienia atrybutów widthi lub nic nie wyświetlają. W chwili pisania tego artykułu w najnowszych wersjach przeglądarki Firefox występuje ten problem. W przykładach ustawiłem oba atrybuty.height<svg>

Kodowania

Niedawny komentarz przypomniał mi o kodowaniu danych uri. To był dla mnie ostatnio problem i mogę podzielić się kilkoma informacjami, które zbadałem.

Specyfikacja data-uri , która odwołuje się do specyfikacji URI , mówi, że svg powinien być zakodowany zgodnie ze specyfikacją URI . Oznacza to, że należy zakodować wszystkie rodzaje znaków, np . <Staje się %3C.

Niektóre źródła sugerują kodowanie base64, które powinno rozwiązać problemy z kodowaniem, jednak niepotrzebnie zwiększy rozmiar SVG, podczas gdy kodowanie URI nie. Polecam kodowanie URI.

Więcej informacji:

obsługa przeglądarki: > ie8

sztuczki css na svgs

mdn na svgs


1
To najlepsza jak dotąd odpowiedź i działa nawet z konwerterami prezentacji, takimi jak Cleaver.
wylewny

1
Bardzo podoba mi się to podejście, ponieważ styl nie zepsuje nieregularnych zastosowań ul, tj. Gdy typ list-style-type jest ustawiony na none, a także dlatego, że nie zależy to od zawijania zawartości li w inne element. Jednak to nie działa dla mnie w IE11 lub Edge ...?
ctb

@ctb Nie testowałem konkretnie tych przeglądarek, ale czy przeczytałeś zastrzeżenie dotyczące kodowania? Możesz nie być w stanie skopiować / wkleić „ładnego” <svg>kodu, spróbuj najpierw uruchomić go przez koder uri.
Jon Surrell

1
@JonSurrell tak, działało, gdy zakodowałem kod svg. Dzięki, to było świetne.
ctb

1
Podoba mi się ta odpowiedź, ponieważ obsługuje również rozmiary względne, takie jak r = "1,5em"
plexoos

16

Opierając się na rozwiązaniu @ Marca - ponieważ znak punktora jest renderowany inaczej w różnych czcionkach i przeglądarkach, użyłem następującej techniki css3 z border-radius, aby utworzyć punktor, nad którym mam większą kontrolę:

li:before {
    content: '';
    background-color: #898989;
    display: inline-block;
    position: relative;
    height: 12px;
    width: 12px;
    border-radius: 6px;
    -webkit-border-radius: 6px;
    -moz-border-radius: 6px;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    margin-right: 4px;
    top: 2px;
}

1
@ddilsaver masz rację, ustawiałem kolor tła w innej regule, która była specyficzna dla każdego elementu zamówienia (klient chciał mieć inny kolor na każdym z nich). zaktualizowałem.
jessica,

2
Bardzo fajne rozwiązanie. Proponuję zmienić border-radius na 50%, aby był nieco bardziej elastyczny w przypadku zmiany wysokości / szerokości.
Tim

11

Wiem, że to naprawdę stare pytanie, ale bawiłem się nim i wymyśliłem sposób, którego nie widziałem opublikowanego. Nadaj liście kolor, a następnie nadpisz kolor tekstu za pomocą ::first-lineselektora. Nie jestem ekspertem, więc może jest coś nie tak z tym podejściem, którego mi brakuje, ale wydaje się, że działa.

li {
  color: blue;
}

li::first-line {
  color: black;
}
<ul>
  <li>House</li>
  <li>Car</li>
  <li>Garden</li>
</ul>


ładne proste rozwiązanie dla list
jednowierszowych

6

Opierając się zarówno na rozwiązaniach @Marc, jak i @jessica - oto rozwiązanie, którego używam:

li { 
   position:relative;
}
li:before {
      content:'';
      display: block;
      position: absolute;
      width: 6px;
      height:6px;
      border-radius:6px;
      left: -20px;
      top: .5em;
      background-color: #000;
}

Używam emdo rozmiarów czcionek, więc jeśli ustawisz topwartość na .5em, zawsze będzie ona umieszczona w środkowym punkcie pierwszego wiersza tekstu. Użyłem, left:-20pxponieważ jest to domyślna pozycja punktorów w przeglądarkach: rodzic padding/2


2

Bardzo podobała mi się również odpowiedź Marca - potrzebowałem zestawu różnych kolorów UL i oczywiście byłoby łatwiej po prostu użyć klasy. Oto, czego użyłem do pomarańczy, na przykład:

ul.orange {
    list-style: none;
    padding: 0px;
}
ul.orange > li:before {
    content: '\25CF ';
    font-size: 15px;
    color: #F00;
    margin-right: 10px;
    padding: 0px;
    line-height: 15px;
}

Poza tym odkryłem, że kod szesnastkowy, którego użyłem dla „content:” był inny niż kod Marca (ten szesnastkowy okrąg wydawał się być nieco za wysoko). Ten, którego użyłem, wydaje się leżeć idealnie pośrodku. Znalazłem też kilka innych kształtów (kwadraty, trójkąty, koła, itp) prawo tutaj


1

Dla mnie najlepszą opcją jest użycie pseudoelementów CSS, więc przy discstylowaniu punktorów wyglądałoby to tak:

ul {
  list-style-type: none;
}

li {
  position: relative;
}

li:before {
  content: '';
  display: block;
  position: absolute;
  width: 5px; /* adjust to suit your needs */
  height: 5px; /* adjust to suit your needs */
  border-radius: 50%;
  left: -15px; /* adjust to suit your needs */
  top: 0.5em;
  background: #f00; /* adjust to suit your needs */
}
<ul>
  <li>first</li>
  <li>second</li>
  <li>third</li>
</ul>

Uwagi:

  • widthi heightpowinny mieć równe wartości, aby wskaźniki były zaokrąglone
  • możesz ustawić border-radiusna zero, jeśli chcesz mieć squarepunktory listy

Aby uzyskać więcej stylów punktorów, możesz użyć innych kształtów css https://css-tricks.com/examples/ShapesOfCSS/ (wybierz tę, która nie wymaga pseudoelementów do działania, na przykład trójkąty)


1

::znacznik

Możesz użyć ::markerpseudoelementu CSS, aby zaznaczyć pole znacznika elementu listy (np. Punktory lub cyfry).

ul li::marker {
  color: red;
}

Uwaga: w momencie publikowania tej odpowiedzi jest to technologia eksperymentalna i została wdrożona tylko w przeglądarkach Firefox i Safari (do tej pory).


Przetestowane i działa w obecnych przeglądarkach Firefox i Safari. Zobacz wsparcie dla innych przeglądarek https://caniuse.com
daniels

0

Opierając się na odpowiedzi @ ddilsaver. Chciałem móc użyć sprite'a do pocisku. To wydaje się działać:

li {
  list-style: none;
  position: relative;
}

li:before {
  content:'';
  display: block;
  position: absolute;
  width: 20px;
  height: 20px;
  left: -30px;
  top: 5px;
  background-image: url(i20.png); 
  background-position: 0px -40px; /* or whatever offset you want */
}

0

Wypróbowałem to dzisiaj i wpisałem to:
musiałem wyświetlić kolorowe znaczniki na moich listach (zarówno punktory, jak i cyfry). Natknąłem się na tę wskazówkę i napisałem w moim arkuszu stylów z mutualizacją właściwości:

ul,
ol {
  list-style: none;
  padding: 0;
  margin: 0 0 0 15px;
}
ul {}
ol {
  counter-reset: li;
}
li {
  padding-left: 1em; 
}
ul li {}
ul li::before,
ol li::before {
  color: #91be3c;
  display: inline-block;
  width: 1em;
}
ul li::before {
  content: "\25CF";
  margin: 0 0.1em 0 -1.1em;
}
ol li {
  counter-increment: li;
}
ol li::before {
  content: counter(li);
  margin: 0 0 0 -1em;
}

Wybrałem inną postać do wyświetlania kuli, obserwując ją tutaj . Musiałem odpowiednio dostosować margines, być może wartości nie będą miały zastosowania z wybraną czcionką (liczby używają czcionki internetowej).



0

Wersja wbudowana, działa z klasycznym programem Outlook:

<ul style="list-style:square;">
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
</ul>

JSFiddle .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.