Usando CSS para inserir texto

207

Sou relativamente novo em CSS e o usei para alterar o estilo e a formatação do texto.

Agora eu gostaria de usá-lo para inserir texto, como mostrado abaixo:

<span class="OwnerJoe">reconcile all entries</span>

Que eu espero poder mostrar como:

Tarefa de Joe: reconciliar todas as entradas

Ou seja, simplesmente por pertencer à classe "Proprietário Joe", quero que o texto Joe's Task:seja exibido.

Eu poderia fazê-lo com código como:

<span class="OwnerJoe">Joe's Task:</span> reconcile all entries.

Mas isso parece muito redundante para especificar a classe e o texto.

É possível fazer o que estou procurando?

EDIT Uma idéia é tentar configurá-lo como um Item de Lista <li>onde o "marcador" é o texto "Tarefa de Joe". Vejo exemplos de como definir vários estilos de marcadores e até imagens para marcadores. É possível usar um pequeno bloco de texto para o marcador de lista?

abelenky
fonte
1
a ideia <li> não é uma boa prática. Se você realmente deseja isso, procure uma linguagem de modelo.
Gary
1
Parece usar o pseudoelementos CSS3: before ou: after, você realmente moverá a redundância para o CSS land (porque você precisará adicionar uma instrução CSS para OwnerJoe, OwnerJane etc.)
Matt Beckman
2
@ Matt Beckman: Isso está bem comigo. Posso definir facilmente blocos CSS para cada um dos meus usuários. Repetir várias vezes no HTML parece excessivo no meu caso.
precisa saber é o seguinte
1
Acho que um uso mais prático disso para um público mais amplo seria como label.required:before {content: "* ";}adicionar um asterisco na frente dos campos obrigatórios, talvez.
22613 Patrick Patrick

Respostas:

317

É, mas requer um navegador compatível com CSS2 (todos os principais navegadores, IE8 +).

.OwnerJoe:before {
  content: "Joe's Task:";
}

Mas eu prefiro usar o Javascript para isso. Com jQuery:

$('.OwnerJoe').each(function() {
  $(this).before($('<span>').text("Joe's Task: "));
});
Marcel Jackwerth
fonte
4
Deve ser um espaço após o cólon.
system PAUSE
7
Testes iniciais indicam que a propriedade de conteúdo funciona bem. Parabéns por encontrar uma resposta quando todo mundo diz que não pode ser feito. :)
abelenky
8
Para cobrir o IE mais antigo, você pode incluir condicionalmente code.google.com/p/ie7-js, o que permitirá que seu CSS permaneça o mesmo para todos os navegadores. É uma alternativa ao jQuery que está mais próxima dos padrões.
system PAUSE
15
Por que você prefere recomendar o Javascript?
Rikki
Interessante: parece funcionar com um ou dois dois pontos, por exemplo, .OwnerJoe:beforee.OwnerJoe::before
Mr. Kennedy
40

A resposta usando jQuery da qual todos parecem gostar tem uma falha importante, que é não ser escalável (pelo menos como está escrita). Eu acho que Martin Hansen tem a idéia certa, que é usar data-*atributos HTML5 . E você pode até usar o apóstrofo corretamente:

html:

<div class="task" data-task-owner="Joe">mop kitchen</div>
<div class="task" data-task-owner="Charles" data-apos="1">vacuum hallway</div>

css:

div.task:before { content: attr(data-task-owner)"'s task - " ; }
div.task[data-apos]:before { content: attr(data-task-owner)"' task - " ; }

resultado:

Joe's task - mop kitchen
Charles' task - vacuum hallway
Jeff
fonte
19
Um efeito colateral interessante para usar o conteúdo css ao invés de jQuery é que o texto fornecido pelo atributo conteúdo não é selecionável, que pode ou não ser desejável ....
Jeff
Se o texto faz parte do layout da página e não faz parte do conteúdo, talvez o CSS seja o lugar certo para ele. Por exemplo, se você quisesse que o cabeçalho de sua página em todas as páginas tivesse as palavras "Hello World" em roxo em um fundo verde limão, faria sentido. Basta mudar o cabeçalho da página para editar um único arquivo CSS. Se você tivesse o texto em HTML, seria necessário editar uma página em cada página do seu site e talvez também alterar os seus aplicativos da web.
casgage 03/02
28

Verifique também a função attr () do atributo de conteúdo CSS. Ele gera um determinado atributo do elemento como um nó de texto. Use-o assim:

<div class="Owner Joe" />

div:before {
  content: attr(class);
}

Ou mesmo com os novos atributos de dados personalizados em HTML5:

<div data-employeename="Owner Joe" />

div:before {
  content: attr(data-employeename);
}
Martin Hansen
fonte
2
Essa é uma ideia muito melhor - eu odeio a ideia de criar uma classe css para exibir conteúdo. Pode acabar gerando css dinamicamente com base em uma consulta sql. Eu substituiria o seletor por div[data-employeename]:before.
precisa saber é o seguinte
6

Apenas codifique-o assim:

.OwnerJoe {
  //other things here
  &:before{
    content: "Joe's Task: ";
  }
}
BartSabayton
fonte
18
Este CSS não é válido, mas a sintaxe do Sass.
Asfand Qazi