Usando CSS para insertar texto

207

Soy relativamente nuevo en CSS y lo he usado para cambiar el estilo y el formato del texto.

Ahora me gustaría usarlo para insertar texto como se muestra a continuación:

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

Lo cual espero poder mostrar como:

Tarea de Joe: conciliar todas las entradas

Es decir, simplemente en virtud de ser de la clase "Propietario Joe", quiero que se muestre el texto Joe's Task:.

Podría hacerlo con un código como:

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

Pero eso parece terriblemente redundante para especificar tanto la clase como el texto.

¿Es posible hacer lo que estoy buscando?

EDITAR Una idea es intentar configurarlo como un ListItem <li>donde la "viñeta" es el texto "Tarea de Joe". Veo ejemplos de cómo configurar varios estilos de viñetas e incluso imágenes para viñetas. ¿Es posible usar un pequeño bloque de texto para la viñeta de lista?

abelenky
fuente
1
La idea <li> no es una buena práctica. Si realmente quieres esto, busca un lenguaje de plantillas en su lugar.
Gary
1
Suena como usar el CSS3: antes o: después de los pseudo-elementos, realmente solo moverás la redundancia a la tierra CSS (porque necesitarás agregar una declaración CSS para OwnerJoe, OwnerJane, etc.)
Matt Beckman
2
@ Matt Beckman: Eso está bien para mí. Puedo definir fácilmente bloques CSS para cada uno de mis usuarios. Repetirlo una y otra vez en el HTML parece excesivo en mi caso.
abelenky
1
Siento que un uso más práctico de esto para una audiencia más amplia sería como label.required:before {content: "* ";}agregar un asterisco delante de los campos obligatorios, tal vez.
Patrick

Respuestas:

317

Lo es, pero requiere un navegador compatible con CSS2 (todos los principales navegadores, IE8 +).

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

Pero preferiría usar Javascript para esto. Con jQuery:

$('.OwnerJoe').each(function() {
  $(this).before($('<span>').text("Joe's Task: "));
});
Marcel Jackwerth
fuente
44
Debería haber un espacio después del colon.
PAUSA del sistema
77
Las pruebas iniciales indican que la propiedad de contenido funciona bien. Felicidades por encontrar una respuesta cuando todos los demás dicen que no se puede hacer. :)
abelenky
8
Para cubrir IE anteriores, puede incluir condicionalmente code.google.com/p/ie7-js que permitirá que su CSS permanezca igual para todos los navegadores. Es una alternativa a jQuery que está más cerca de los estándares.
PAUSA del sistema
15
¿Por qué preferirías usar Javascript?
Rikki
Interesante: parece funcionar con uno o dos puntos, por ejemplo, .OwnerJoe:beforey.OwnerJoe::before
Sr. Kennedy
40

La respuesta usando jQuery que parece gustar a todos tiene una falla importante, que es que no es escalable (al menos como está escrito). Creo que Martin Hansen tiene la idea correcta, que es utilizar data-*atributos HTML5 . E incluso puedes usar el apóstrofe correctamente:

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

salida:

Joe's task - mop kitchen
Charles' task - vacuum hallway
Jeff
fuente
19
Un efecto secundario interesante para el uso de contenido css en contraposición a jQuery es que el texto suministrado por el atributo de contenido no es seleccionable, que puede ser o no ser deseable ....
Jeff
Si el texto es parte del diseño de la página y no del contenido, quizás el CSS sea el lugar adecuado para ello. Por ejemplo, si quisiera que su página en todas las páginas tuviera las palabras "Hola Mundo" en púrpura sobre un fondo verde lima, tendría sentido. Todo lo que se necesitaría para cambiar el encabezado de su página es editar un solo archivo CSS. Si tuviera el texto en HTML, sería necesario editarlo en cada una de las páginas de su sitio y tal vez también cambiaría sus aplicaciones web.
casgage
28

Consulte también la función attr () del atributo de contenido CSS. Produce un atributo dado del elemento como un nodo de texto. Úselo así:

<div class="Owner Joe" />

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

O incluso con los nuevos atributos de datos personalizados HTML5:

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

div:before {
  content: attr(data-employeename);
}
Martin Hansen
fuente
2
Esa es una idea mucho mejor: odio la idea de crear una clase CSS para mostrar contenido. Podría terminar generando css dinámicamente en base a una consulta sql. Reemplazaría el selector por div[data-employeename]:before.
Johnny5
6

Solo codifícalo así:

.OwnerJoe {
  //other things here
  &:before{
    content: "Joe's Task: ";
  }
}
BartSabayton
fuente
18
Esto no es CSS válido, sino sintaxis Sass.
Asfand Qazi