Utiliser CSS pour insérer du texte

207

Je suis relativement nouveau en CSS et je l'ai utilisé pour changer le style et la mise en forme du texte.

Je voudrais maintenant l'utiliser pour insérer du texte comme indiqué ci-dessous:

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

Ce que j'espère pouvoir montrer comme:

Tâche de Joe: réconcilier toutes les entrées

Autrement dit, simplement parce que je suis de la classe "Owner Joe", je veux que le texte Joe's Task:soit affiché.

Je pourrais le faire avec du code comme:

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

Mais cela semble terriblement redondant pour spécifier à la fois la classe et le texte.

Est-il possible de faire ce que je recherche?

EDIT Une idée est d'essayer de le configurer en tant que ListItem <li>où la "puce" est le texte "Joe's Task". Je vois des exemples de la façon de définir différents styles de puces et même des images pour les balles. Est-il possible d'utiliser un petit bloc de texte pour la liste-puce?

abelenky
la source
1
l'idée <li> n'est pas une bonne pratique. Si vous le voulez vraiment, cherchez plutôt un langage de template.
Gary
1
Cela ressemble à l'utilisation de CSS3: avant ou: après les pseudo-éléments, vous allez vraiment déplacer la redondance vers le terrain CSS (car vous devrez ajouter une instruction CSS pour OwnerJoe, OwnerJane, etc.)
Matt Beckman
2
@Matt Beckman: Ça me va. Je peux facilement définir des blocs CSS pour chacun de mes utilisateurs. Le répéter encore et encore dans le HTML semble excessif dans mon cas.
abelenky
1
Je pense qu'une utilisation plus pratique de cela pour un public plus large reviendrait label.required:before {content: "* ";}à ajouter un astérisque devant les champs obligatoires, peut-être.
Patrick

Réponses:

317

Il l'est, mais nécessite un navigateur compatible CSS2 (tous les principaux navigateurs, IE8 +).

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

Mais je recommanderais plutôt d'utiliser Javascript pour cela. Avec jQuery:

$('.OwnerJoe').each(function() {
  $(this).before($('<span>').text("Joe's Task: "));
});
Marcel Jackwerth
la source
4
Doit être un espace après les deux points.
système PAUSE
7
Les premiers tests indiquent que la propriété de contenu fonctionne bien. Félicitations d'avoir trouvé une réponse quand tout le monde dit que cela ne peut pas être fait. :)
abelenky
8
Pour couvrir les anciens IE, vous pouvez inclure conditionnellement code.google.com/p/ie7-js qui permettra à votre CSS de rester le même pour tous les navigateurs. C'est une alternative à jQuery plus proche des standards.
système PAUSE
15
Pourquoi recommanderiez-vous plutôt d'utiliser Javascript?
Rikki
Intéressant: semble fonctionner avec un ou deux deux points, par exemple .OwnerJoe:beforeet.OwnerJoe::before
M. Kennedy
40

La réponse en utilisant jQuery que tout le monde semble aimer a un défaut majeur, qui n'est pas évolutif (du moins tel qu'il est écrit). Je pense que Martin Hansen a la bonne idée, qui est d'utiliser des data-*attributs HTML5 . Et vous pouvez même utiliser correctement l'apostrophe:

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

production:

Joe's task - mop kitchen
Charles' task - vacuum hallway
Jeff
la source
19
Un effet secondaire intéressant de l'utilisation du contenu CSS par opposition à jQuery est que le texte fourni par l'attribut content n'est pas sélectionnable, ce qui peut ou non être souhaitable ....
Jeff
Si le texte fait partie de la mise en page et ne fait pas partie du contenu, le CSS est peut-être le bon endroit pour cela. Par exemple, si vous vouliez que l'en-tête de votre page sur toutes les pages soit composé des mots "Hello World" en violet sur fond vert lime, cela aurait du sens. Pour modifier le titre de votre page, il suffit de modifier un seul fichier CSS. Si vous aviez le texte en HTML, il faudrait modifier chaque page de votre site et peut-être aussi modifier vos applications Web.
bagages le
28

Consultez également la fonction attr () de l'attribut de contenu CSS. Il génère un attribut donné de l'élément en tant que nœud de texte. Utilisez-le comme ceci:

<div class="Owner Joe" />

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

Ou même avec les nouveaux attributs de données personnalisés HTML5:

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

div:before {
  content: attr(data-employeename);
}
Martin Hansen
la source
2
C'est une bien meilleure idée - je déteste l'idée de créer une classe CSS pour afficher le contenu. Il pourrait finir par générer dynamiquement des CSS sur la base d'une requête SQL. Je remplacerais le sélecteur par div[data-employeename]:before.
Johnny5
6

Il suffit de le coder comme ceci:

.OwnerJoe {
  //other things here
  &:before{
    content: "Joe's Task: ";
  }
}
BartSabayton
la source
18
Ce n'est pas du CSS valide, mais de la syntaxe Sass.
Asfand Qazi