Alterar a cor dos marcadores de uma lista HTML sem usar span

88

Eu queria saber se existe uma maneira de alterar a cor nos marcadores de uma lista.

Eu tenho uma lista como esta:

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

Não é possível inserir nada nos li's, como 'span' og a 'p'. Posso alterar a cor dos marcadores, mas não o texto de uma maneira inteligente?

Kim Andersen
fonte

Respostas:

34

Se você pode usar uma imagem, você pode fazer isso. E sem uma imagem você não poderá mudar apenas a cor dos marcadores e não do texto.

Usando uma imagem

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

Vejo

list-style-image

Sem usar uma imagem

Então você tem que editar a marcação HTML e incluir um intervalo dentro da lista e colorir li e span com cores diferentes.

Rahul
fonte
1
Jep isso poderia funcionar. Mas, na verdade, decidi usar uma imagem de fundo e, em seguida, um tipo de estilo de lista: nenhum; Isso me deu a liberdade de posicionar os "marcadores" um pouco mais do que a imagem em estilo de lista. Mesmo assim, você obtém a resposta certa e 1+.
Kim Andersen
6
Também funciona com dados-uri svgs: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 de
Usando o método @JonSurrell, consegui um resultado muito agradável. É uma pena que não seja uma das respostas sugeridas. A solução é cross-browser para pós IE8 e facilmente modificável para criar formas personalizadas interessantes.
KoldBane
@KoldBane veja minha nova resposta :)
Jon Surrell
@DimitryK por favor, dê uma olhada na resposta completa que escrevi e envie seus comentários. Funciona bem em FF43.
Jon Surrell
186

Consegui isso sem adicionar marcação, mas usando li:before. Obviamente, isso tem todas as limitações do :before(sem suporte ao IE antigo), mas parece funcionar com o IE8, Firefox e Chrome após alguns testes muito limitados. O estilo de marcador também é limitado pelo que está em 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>

Marc
fonte
5
Além disso, aqui está como você pode fazer a mesma coisa para listas ordenadas: jsfiddle.net/uZRGN
Nightfirecat
3
Excelente. Com o uso tão amplo do IE8 +, acho que essa deve ser a resposta agora. (Observe que eu costumava font-size:1emobter um marcador de melhor proporção!)
EvilDr
Não gosto dessa abordagem, porque o que acontece quando alguém tenta renderizar um ul com list-style-type definido como none? Isso significa que você deve definir o escopo desses estilos em alguma classe, por exemplo, ul.greenDisc
ctb
19

Podemos combinar list-style-imagecom svgs, que podemos embutir em css ! Este método oferece um controle incrível sobre as "balas", que podem se tornar qualquer coisa.

Para obter um círculo vermelho, basta usar o seguinte 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>');
}

Mas isso é apenas o começo. Isso nos permite fazer qualquer coisa maluca que quisermos com essas balas. círculos ou retângulos são fáceis, mas qualquer coisa com que você possa desenhar svgpode ficar ali! Confira o exemplo bullseye abaixo:

Atributos de largura / altura

Alguns navegadores requerem widthe heightatributos para ser definida no<svg> , ou eles não apresentar nada. No momento em que este artigo foi escrito, as versões recentes do Firefox apresentavam esse problema. Eu defini ambos os atributos nos exemplos.

Codificações

Um comentário recente me lembrou de codificações para o data-uri. Isso foi um ponto doloroso para mim recentemente, e posso compartilhar um pouco das informações que pesquisei.

A especificação data-uri , que faz referência à especificação URI , diz que o svg deve ser codificado de acordo com a especificação URI . Isso significa que todos os tipos de caracteres devem ser codificados, por exemplo, <se torna %3C.

Algumas fontes sugerem a codificação base64, que deve corrigir os problemas de codificação; no entanto, aumentará desnecessariamente o tamanho do SVG, enquanto a codificação URI não. Eu recomendo a codificação URI.

Mais informações:

suporte do navegador: > ie8

truques de css em svgs

mdn em svgs

Jon Surrell
fonte
1
Esta é a melhor resposta até agora, e funciona até com conversores de apresentação como o Cleaver.
gaborous
1
Eu realmente gosto dessa abordagem, porque o estilo não bagunça usos irregulares de ul, ou seja, quando list-style-type é definido como none, e também porque não depende de envolver o conteúdo do li em algum outro elemento. No entanto, não está funcionando para mim no IE11 ou Edge ...?
ctb 01 de
@ctb Não testei esses navegadores especificamente, mas você leu a advertência sobre codificação? Você pode não conseguir copiar / colar o <svg>código "bonito" , tente executá-lo primeiro por meio de um codificador de uri.
Jon Surrell
1
@JonSurrell sim, funcionou uma vez que codifiquei o código SVG. Thx, isso foi ótimo.
ctb
1
Gosto desta resposta porque também suporta tamanhos relativos, como r = "1.5em"
plexoos
16

Construindo a solução de @Marc - como o caractere de marcador é renderizado de maneira diferente com diferentes fontes e navegadores, usei a seguinte técnica css3 com border-radius para fazer um marcador sobre o qual tenho mais controle:

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;
}
Jessica
fonte
1
@ddilsaver você está certo, eu estava definindo a cor de fundo em outra regra que era específica para cada item de linha (o cliente queria uma cor diferente em cada um). eu atualizei.
jessica
2
Solução muito boa. Eu sugeriria mudar o raio da borda para 50% para torná-lo um pouco mais flexível caso a altura / largura mude.
Tim
10

Eu sei que esta é uma questão muito, muito antiga, mas eu estava brincando com isso e descobri uma maneira que não vi postada. Dê uma cor à lista e, em seguida, substitua a cor do texto usando o ::first-lineseletor. Não sou nenhum especialista, então talvez haja algo de errado com essa abordagem que estou perdendo, mas parece funcionar.

li {
  color: blue;
}

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

Lasse Jørgensen
fonte
boa solução simples para listas de linha única
planetClaire
6

Construindo soluções @Marc e @jessica - Esta é a solução que eu uso:

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

Eu uso empara tamanhos de fonte, então se você definir seu topvalor como sendo, .5emele sempre será colocado no meio da sua primeira linha de texto. Usei left:-20pxporque essa é a posição padrão dos marcadores nos navegadores: pai padding/2

ddilsaver
fonte
2

Eu realmente gostei da resposta de Marc também - eu precisava de um conjunto de ULs de cores diferentes e, obviamente, seria mais fácil usar apenas uma classe. Aqui está o que usei para laranja, por exemplo:

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

Além disso, descobri que o código hexadecimal que usei para "conteúdo:" era diferente do de Marc (aquele círculo hexadecimal parecia um pouco alto). O que usei parece se encaixar perfeitamente no meio. Também encontrei várias outras formas (quadrados, triângulos, círculos, etc.) aqui

Beverly Lodge
fonte
1

Para mim, a melhor opção é usar pseudoelementos CSS, portanto, para o discestilo de marcador seria assim:

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>

Notas:

  • width e height deve ter valores iguais para manter os ponteiros arredondados
  • você pode definir border-radiuscomo zero se quiser ter squaremarcadores de lista

Para mais estilos de marcadores, você pode usar outras formas css https://css-tricks.com/examples/ShapesOfCSS/ (escolha esta opção que não requer pseudo elementos para funcionar, por exemplo, triângulos)

Marceli
fonte
1

::marcador

Você pode usar o ::markerpseudoelemento CSS para selecionar a caixa do marcador de um item da lista (ou seja, marcadores ou números).

ul li::marker {
  color: red;
}

Observação: no momento em que postamos esta resposta, esta é considerada uma tecnologia experimental e só foi implementada no Firefox e Safari (até agora).

Grant Miller
fonte
Testado e funciona no Firefox e Safari atuais. Consulte o suporte para outros navegadores https://caniuse.com
daniels
0

Com base na resposta de @ddilsaver. Eu queria ser capaz de usar um sprite para a bala. Isso parece funcionar:

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 */
}
James Whittred
fonte
0

Eu tentei isso hoje e digitei o seguinte:
Eu precisava exibir marcadores de cores em minhas listas (marcadores e números). Descobri esta dica e escrevi na minha folha de estilo com a mutualização das propriedades:

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

Escolhi um personagem diferente para exibir uma bala, observando aqui . Eu precisei ajustar a margem de forma adequada, talvez os valores não se apliquem com a fonte que você escolheu (os números usam sua webfont).

Marte
fonte
0

Tente usar isto:

ul {
  color: red;
}
user3051730
fonte
0

Versão inline, funciona para Outlook Desktop:

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

Daniel ferreira
fonte