Verwenden von CSS zum Einfügen von Text

207

Ich bin relativ neu in CSS und habe es verwendet, um den Stil und die Formatierung von Text zu ändern.

Ich möchte es jetzt verwenden, um Text wie unten gezeigt einzufügen:

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

Was ich hoffentlich zeigen konnte als:

Joes Aufgabe: Alle Einträge abgleichen

Das heißt, einfach weil ich der Klasse "Besitzer Joe" angehöre, möchte ich, dass der Text Joe's Task:angezeigt wird.

Ich könnte es mit Code machen wie:

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

Aber das scheint schrecklich überflüssig, sowohl die Klasse als auch den Text anzugeben.

Kann ich tun, wonach ich suche?

BEARBEITEN Eine Idee ist, zu versuchen, es als ListItem einzurichten, <li>wobei das "Aufzählungszeichen" der Text "Joes Aufgabe" ist. Ich sehe Beispiele, wie verschiedene Aufzählungsstile und sogar Bilder für Aufzählungszeichen festgelegt werden. Ist es möglich, einen kleinen Textblock für das List-Bullet zu verwenden?

abelenky
quelle
1
Die Idee ist keine gute Praxis. Wenn Sie dies wirklich möchten, schauen Sie stattdessen in eine Vorlagensprache.
Gary
1
Klingt nach der Verwendung von CSS3: vor oder nach Pseudoelementen verschieben Sie die Redundanz wirklich nur in das CSS-Land (weil Sie eine CSS-Anweisung für OwnerJoe, OwnerJane usw. hinzufügen müssen)
Matt Beckman
2
@ Matt Beckman: Das ist gut für mich. Ich kann problemlos CSS-Blöcke für jeden meiner Benutzer definieren. In meinem Fall scheint es übertrieben, es im HTML immer wieder zu wiederholen.
Abelenky
1
Ich bin der Meinung, dass eine praktischere Verwendung für ein breiteres Publikum darin besteht label.required:before {content: "* ";}, möglicherweise ein Sternchen vor den erforderlichen Feldern einzufügen.
Patrick

Antworten:

317

Es ist, erfordert aber einen CSS2-fähigen Browser (alle gängigen Browser, IE8 +).

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

Aber ich würde eher empfehlen, dafür Javascript zu verwenden. Mit jQuery:

$('.OwnerJoe').each(function() {
  $(this).before($('<span>').text("Joe's Task: "));
});
Marcel Jackwerth
quelle
4
Sollte ein Leerzeichen nach dem Doppelpunkt sein.
System PAUSE
7
Erste Tests zeigen, dass die Content-Eigenschaft gut funktioniert. Herzlichen Glückwunsch zum Finden einer Antwort, wenn alle anderen sagen, dass dies nicht möglich ist. :)
abelenky
8
Um ältere IE abzudecken, können Sie bedingt code.google.com/p/ie7-js einschließen , damit Ihr CSS für alle Browser gleich bleibt. Es ist eine Alternative zu jQuery, die näher an Standards liegt.
System PAUSE
14
Warum empfehlen Sie lieber Javascript?
Rikki
Interessant: scheint mit ein oder zwei Doppelpunkten zu arbeiten, zB .OwnerJoe:beforeund.OwnerJoe::before
Mr. Kennedy
40

Die Antwort mit jQuery, die jeder zu mögen scheint, hat einen großen Fehler, nämlich, dass sie nicht skalierbar ist (zumindest nicht so, wie sie geschrieben steht). Ich denke, Martin Hansen hat die richtige Idee, nämlich HTML5- data-*Attribute zu verwenden. Und Sie können den Apostroph sogar richtig verwenden:

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

Ausgabe:

Joe's task - mop kitchen
Charles' task - vacuum hallway
Jeff
quelle
19
Ein interessanter Nebeneffekt bei der Verwendung von CSS-Inhalten im Gegensatz zu jQuery ist, dass der vom Inhaltsattribut bereitgestellte Text nicht auswählbar ist, was wünschenswert sein kann oder nicht ....
Jeff
Wenn der Text Teil des Seitenlayouts und nicht Teil des Inhalts ist, ist das CSS möglicherweise der richtige Ort dafür. Wenn Sie beispielsweise möchten, dass Ihre Seitenüberschrift über alle Seiten hinweg die Wörter "Hello World" in Lila auf einem hellgrünen Hintergrund enthält, ist dies sinnvoll. Um Ihre Seitenüberschrift zu ändern, müssen Sie lediglich eine einzelne CSS-Datei bearbeiten. Wenn Sie den Text in HTML hätten, würde jede einzelne Seite Ihrer Website bearbeitet und möglicherweise auch Ihre Webanwendungen geändert.
Gepäck
28

Überprüfen Sie auch die attr () - Funktion des CSS-Inhaltsattributs. Es gibt ein bestimmtes Attribut des Elements als Textknoten aus. Verwenden Sie es so:

<div class="Owner Joe" />

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

Oder sogar mit den neuen benutzerdefinierten HTML5-Datenattributen:

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

div:before {
  content: attr(data-employeename);
}
Martin Hansen
quelle
2
Das ist eine viel bessere Idee - ich hasse die Idee, eine CSS-Klasse zum Anzeigen von Inhalten zu erstellen. Es könnte dazu führen, dass CSS dynamisch basierend auf einer SQL-Abfrage generiert wird. Ich würde den Selektor durch ersetzen div[data-employeename]:before.
Johnny5
6

Codieren Sie es einfach so:

.OwnerJoe {
  //other things here
  &:before{
    content: "Joe's Task: ";
  }
}
BartSabayton
quelle
18
Dies ist kein gültiges CSS, sondern eine Sass-Syntax.
Asfand Qazi