Eu quero fazer listas "gramaticalmente corretas" usando CSS. Isto é o que eu tenho até agora:
As <li>
tags são exibidas horizontalmente com vírgulas após elas.
li { display: inline; list-style-type: none; }
li:after { content: ", "; }
Isso funciona, mas quero que o "último filho" tenha um ponto final em vez de vírgula. E, se possível, eu gostaria de colocar "e" antes do "último filho" também. As listas que estou criando são geradas dinamicamente, então não posso simplesmente dar uma aula aos "últimos filhos". Você não pode combinar pseudoelementos, mas esse é basicamente o efeito que eu quero alcançar.
li:last-child li:before { content: "and "; }
li:last-child li:after { content: "."; }
Como eu faço isso funcionar?
Respostas:
Isso funciona :) (espero que vários navegadores, o Firefox goste)
fonte
li:last-child:after
funciona masli:after:last-child
não funciona .:last-child
não pertence à especificação CSS3, portanto não é suportado pelo IE8 e versões anteriores.Eu gosto disso para itens de lista nos elementos <menu>. Considere a seguinte marcação:
Eu o denomino com o seguinte CSS:
Isso exibirá:
E isso é possível por causa do que Martin Atkins explicou em seu comentário
Observe que no CSS 2 você usaria
:after
, não::after
. Se você usa CSS 3, use::after
(duas semicolunas) porque::after
é um pseudoelemento (uma única semicoluna é para pseudo-classes).fonte
Um thread antigo, no entanto, alguém pode se beneficiar com isso:
Isso deve funcionar no CSS3 e no CSS2 [não testado].
fonte
Você pode combinar pseudo-elementos! Desculpe pessoal, eu descobri isso sozinho depois de postar a pergunta. Talvez seja menos usado por causa de problemas de compatibilidade.
li:last-child:before { content: "and "; }
li:last-child:after { content: "."; }
Isso funciona muito bem. CSS é meio incrível.
fonte
last-child
é um modificador noli
e, depois de selecionar todos osli
elementos que são os últimos filhos, você seleciona (e cria implicitamente) um novo elemento antes e depois de cada um.Apenas para mencionar, no CSS 3
deve ser usado assim
De https://developer.mozilla.org/de/docs/Web/CSS/::after :
Então deve ser:
fonte
::
sintaxe CSS3 de dois pontos duplos também suportam apenas a:
sintaxe, mas o IE 8 suporta apenas os dois pontos, portanto, por enquanto, é recomendável usar apenas os dois pontos para melhor suporte ao navegador.::
é o formato mais recente recuado para distinguir pseudo conteúdo de pseudo seletores. Se você não precisar do suporte do IE 8, sinta-se à vontade para usar o dois-pontos. Deste artigoAdicionando outra resposta a esta pergunta, porque eu precisava exatamente do que @derek estava pedindo e já havia me aprofundado um pouco antes de ver as respostas aqui. Especificamente, eu precisava de CSS que também pudesse explicar o caso com exatamente dois itens de lista, nos quais a vírgula NÃO é desejada. Como exemplo, algumas linhas de autoria que eu queria produzir teriam a seguinte aparência:
Um autor:
By Adam Smith.
Dois autores:
By Adam Smith and Jane Doe.
Três autores:
By Adam Smith, Jane Doe, and Frank Underwood.
As soluções já fornecidas aqui funcionam para um autor e para três ou mais autores, mas negligenciam o caso de dois autores - onde o estilo "Oxford Comma" (também conhecido como estilo "Harvard Comma" em algumas partes) não se aplica - ou seja, não deve haver vírgula antes da conjunção.
Depois de uma tarde de mexer, eu vim com o seguinte:
Ele exibe os bylines como os tenho acima.
No final, eu também tive que me livrar de qualquer espaço em branco entre
li
elementos, a fim de evitar um aborrecimento: a propriedade inline-block deixaria um espaço antes de cada vírgula. Provavelmente existe um truque decente alternativo para ele, mas esse não é o assunto desta pergunta, então deixarei isso para outra pessoa responder.Violino aqui: http://jsfiddle.net/5REP2/
fonte
Para ter algo como Um, dois e três, você deve adicionar mais um estilo css
Isso removeria a vírgula do segundo último elemento.
Código completo
fonte
Estou usando a mesma técnica em uma consulta de mídia que efetivamente transforma uma lista de marcadores em uma lista embutida em dispositivos menores, pois eles economizam espaço.
Então a mudança de:
para:
Item da lista 1; Item da lista 2; Item da lista 3.
fonte