Wie kann ich Text durch CSS ersetzen?

319

Wie kann ich Text mit einer Methode wie der folgenden durch CSS ersetzen:

.pvw-title img[src*="IKON.img"] { visibility:hidden; }

Anstelle von ( img[src*="IKON.img"] ) muss ich stattdessen etwas verwenden, das Text ersetzen kann.

Ich muss es benutzen [ ], um es zum Laufen zu bringen.

<div class="pvw-title">Facts</div>

Ich muss " Fakten " ersetzen .

MokiTa
quelle
Um ehrlich zu sein, ist es möglicherweise am besten, dafür Javascript zu verwenden.
Sir
Für die Verwendung von Javascript muss das DOM geladen sein, daher gibt es eine FOUC. Ich möchte dies tun, um Text durch Inhalt zu ersetzen, der aus der Abfragezeichenfolge extrahiert wurde, während eine FOUC vermieden wird, ohne dass der HTML-Server serverseitig generiert werden muss (wodurch der HTML-Code aggressiv zwischengespeichert und von einem CDN bereitgestellt werden kann).
nemequ
31
Die Frage ist, wie es mit CSS geht. Ich bin mit einem CMS , dass nur erlaubt mir , die CSS zu ändern, weshalb ich kam dieser Seite , während für die Antwort googeln, und nicht ein anderer. Deshalb beantworten wir die gestellte Frage, anstatt zu fragen, warum die Situation des Fragestellers nicht anders ist.
felwithe

Antworten:

289

Oder vielleicht könnten Sie 'Fakten' <span>wie folgt umschließen:

<div class="pvw-title"><span>Facts</span></div>

Dann benutze:

.pvw-title span {
  display: none;
}
.pvw-title:after {
  content: 'whatever it is you want to add';
}
Matthew Cachia
quelle
52
Schön, aber das ist eine Änderung an HTML und nicht nur an CSS.
Mikemaccana
22
Manchmal ist es Ihre einzige Option
Locrizak
4
span {display: none; } sollte auch das Pseudoelement ausblenden. Sie sollten Sichtbarkeit verwenden: stattdessen versteckt
xryl669
2
Anzeige: keine; und Sichtbarkeit: versteckt; beide verstecken das Pseudoelement
Facundo Colombier
10
@Mathew versteckt die Spanne, fügt aber das Pseudoelement zum div hinzu, sodass das
Pseudoelement
247

Obligatorisch : Dies ist ein Hack: CSS ist nicht der richtige Ort, um dies zu tun, aber in einigen Situationen - z. B. wenn Sie eine Drittanbieter-Bibliothek in einem Iframe haben, der nur von CSS angepasst werden kann - ist diese Art von Hack die einzige Option .

Sie können Text über CSS ersetzen. Ersetzen wir eine grüne Schaltfläche durch "Hallo" durch eine rote Schaltfläche mit der Aufschrift "Auf Wiedersehen" mithilfe von CSS.

Vor:

Geben Sie hier die Bildbeschreibung ein

Nach:

Geben Sie hier die Bildbeschreibung ein

Eine Live-Demo finden Sie unter http://jsfiddle.net/ZBj2m/274/ :

Hier ist unser grüner Knopf:

<button>Hello</button>

button {
  background-color: green;
  color: black;
  padding: 5px;
}

Lassen Sie uns nun das ursprüngliche Element ausblenden, aber anschließend ein weiteres Blockelement hinzufügen:

button {
  visibility: hidden;
}
button:after {
  content:'goodbye'; 
  visibility: visible;
  display: block;
  position: absolute;
  background-color: red;
  padding: 5px;
  top: 2px;
}

Hinweis:

  • Wir müssen dies ausdrücklich als Blockelement markieren, 'after'-Elemente sind standardmäßig inline
  • Wir müssen das ursprüngliche Element kompensieren, indem wir die Position des Pseudoelements anpassen.
  • Wir müssen das ursprüngliche Element ausblenden und das Pseudoelement mit anzeigen visibility. Hinweis display: nonezum Originalelement funktioniert nicht.
Mikemaccana
quelle
2
Dies funktioniert nicht in zB 10, eine Idee, wie man es ändert, um dies zu tun?
Solmead
49
display: none;funktioniert nicht, weil es ::afterwirklich "in diesem Element, aber am Ende" bedeutet, falls jemand neugierig war.
Ry-
4
Leider funktioniert die "modifizierte" Schaltfläche nicht mehr wie eine Schaltfläche. Es ist ein gutes Beispiel, nur dass es nicht für eine Schaltfläche gilt.
Xryl669
1
Anzeige: keine; und Sichtbarkeit: versteckt; beide verstecken das Pseudoelement
Facundo Colombier
Wie kommt es, dass ich dabei das Element ersetze, der Text jedoch nur aus Großbuchstaben besteht und nicht in Kleinbuchstaben geändert werden kann?
Jpaji Rajnish
156

Wenn Sie bereit sind, Pseudoelemente zu verwenden und sie Inhalte einfügen zu lassen, können Sie Folgendes tun. Es setzt keine Kenntnis des ursprünglichen Elements voraus und erfordert kein zusätzliches Markup.

.element {
  text-indent: -9999px;
  line-height: 0; /* Collapse the original line */
}

.element::after {
  content: "New text";
  text-indent: 0;
  display: block;
  line-height: initial; /* New content takes up original line height */
}

JSFiddle-Beispiel

James van Dyke
quelle
1
Diese Antwort funktioniert an Stellen, an denen einige der anderen Antworten keine Textknoten innerhalb eines <th>Elements enthalten.
Chris Kerekes
5
Das funktioniert gut. In meinem Fall line-height: 0und color: transparentauf dem Hauptelement und das Zurücksetzen dieser Werte auf dem Pseudo erledigen Sie den Job (kein Fummeln mit text-indent)
dontGoPlastic
1
Sollte es nicht line-height: normalstatt sein initial?
Benjamin
1
Der Grund für die Verwendung von Text-Einzug ist, dass das Element bei längerem Originaltext die Größe des alten Textes beibehält und nicht auf die Größe des neuen Textes schrumpft (vorausgesetzt, Sie möchten dies)
Chris Janssen
Der Texteinzug: -9999px; funktioniert im IE. In der Erwägung, dass die Sichtbarkeit: verborgen ist; Methode funktioniert nicht im IE.
Tom Stermitz
56

Basierend auf Mikemaccanas Antwort funktionierte dies für mich

button {
  position: absolute;
  visibility: hidden;
}

button:before {
  content: "goodbye";
  visibility: visible;
}

§ Absolute Positionierung

Ein Element, das absolut positioniert ist, wird aus dem Fluss genommen und nimmt daher beim Platzieren anderer Elemente keinen Platz ein.

Steven Penny
quelle
2
Für mich war diese Antwort anderen überlegen, da sie mit einem Textersatz innerhalb derselben Zeile funktioniert, dh keinen Zeilenumbruch im Text erzwingt (für meine spezielle Kombination aus HTML und CSS).
pgr
29

Dies ist einfach, kurz und effektiv. Es ist kein zusätzlicher HTML-Code erforderlich.

.pvw-title { color: transparent; }

.pvw-title:after {
        content: "New Text To Replace Old";
        color: black; /* set color to original text color */
        margin-left: -30px;
        /* margin-left equals length of text we're replacing */
    }

Ich musste dies tun, um anderen Linktext als Home für WooCommerce- Brotkrumen zu ersetzen

Sass / Less

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"] {
    color: transparent;
    &:after {
        content: "Store";
        color: grey;
        margin-left: -30px;
    }
}

CSS

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"] {
    color: transparent;
}

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"]&:after {
    content: "Store";
    color: @child-color-grey;
    margin-left: -30px;
}
hawkeye126
quelle
21

Sie können nicht, na ja, Sie können.

.pvw-title:after {
  content: "Test";
}

Dadurch wird der Inhalt nach dem aktuellen Inhalt des Elements eingefügt. Es ersetzt es nicht wirklich, aber Sie können ein leeres div auswählen und CSS verwenden, um den gesamten Inhalt hinzuzufügen.

Aber während Sie mehr oder weniger können, sollten Sie nicht. Der tatsächliche Inhalt sollte in das Dokument aufgenommen werden. Die Eigenschaft content ist hauptsächlich für kleine Markups gedacht, z. B. Anführungszeichen um Text, der in Anführungszeichen gesetzt werden soll.

GolezTrol
quelle
Ich bin mir sehr sicher, dass ich einen Code verwendet habe, um Text durch eine solche Methode zu ersetzen. '<Div class = "pvw-title"> Fakten </ div> <div class = "pvw-title"> Fakten </ div> 'Ich kann nicht verwenden: nach, weil ich mehr als eine Div-Klasse mit dem gleichen Namen habe :(
MokiTa
Wie weit kompatibel ist das für Browser? Und ich vermute, dass Javascript langfristig eine bessere Wahl für diese Art von Flexibilität sein wird.
Sir
Moderne Browser unterstützen dies. Ich bin mir bei älteren IE-Versionen nicht sicher, aber ich denke, das kann auf quirksmode.com nachgeschlagen werden. -edit- Es kann: quirksmode.org/css/user-interface/content.html
GolezTrol
14

Versuchen Sie es mit :beforeund:after . Einer fügt Text ein, nachdem HTML gerendert wurde, und der andere fügt Text ein, bevor HTML gerendert wurde. Wenn Sie Text ersetzen möchten, lassen Sie den Inhalt der Schaltfläche leer.

In diesem Beispiel wird der Schaltflächentext entsprechend der Größe der Bildschirmbreite festgelegt.

<meta name="viewport" content="width=device-width, initial-scale=1">

<style>
  button:before {
    content: 'small screen';
  }
  @media screen and (min-width: 480px) {
    button:before {
      content: 'big screen';
    }
  }
</style>
<body>
  <button type="button">xxx</button>
  <button type="button"></button>
</body>

Schaltflächentext:

  1. Mit :before

    großer Bildschirmxxx

    großer Bildschirm

  2. Mit :after

    xxxbig Bildschirm

    großer Bildschirm

Live-Liebe
quelle
11

Wenn Sie nur verschiedene Texte oder Bilder angezeigt werden sollen, halten das Tag leer und Ihre Inhalte in mehreren Datenattribute schreiben so <span data-text1="Hello" data-text2="Bye"></span>. Zeigen Sie sie mit einer der Pseudoklassen an:before {content: attr(data-text1)}

Jetzt haben Sie verschiedene Möglichkeiten, zwischen ihnen zu wechseln. Ich habe sie in Kombination mit Medienabfragen für einen reaktionsschnellen Entwurfsansatz verwendet, um die Namen meiner Navigation in Symbole zu ändern.

jsfiddle Demonstration und Beispiele

Es mag die Frage nicht perfekt beantworten, aber es hat meine Bedürfnisse und vielleicht auch andere befriedigt.

Robbendebiene
quelle
10

Ich hatte besseres Glück, das font-size: 0äußere Element und das font-sizedes :afterSelektors auf alles einzustellen, was ich brauchte.

Jerome
quelle
1
Das funktioniert gut. Hier ist eine Demo .
Arthur
9

Dies funktionierte bei mir mit Inline-Text. Es wurde in Firefox, Safari, Chrome und Opera getestet.

<p>Lorem ipsum dolor sit amet, consectetur <span>Some Text</span> adipiscing elit.</p>

span {
    visibility: hidden;
    word-spacing: -999px;
    letter-spacing: -999px;
}

span:after {
    content: "goodbye";
    visibility: visible;
    word-spacing: normal;
    letter-spacing: normal;
}
Noel Williams
quelle
2
Funktioniert nicht für mich in mindestens IE 9 bis 11, da es die "Sichtbarkeit: sichtbar" auf dem: after-Element ignoriert
thenickdude
8

Ich benutze diesen Trick:

.pvw-title {
    text-indent: -999px;
}
.pvw-title:after {
    text-indent: 0px;
    float: left;
    content: 'My New Content';
}

Ich habe dies sogar verwendet, um die Internationalisierung von Seiten durch einfaches Ändern einer Basisklasse zu handhaben ...

.translate-es .welcome {
    text-indent: -999px;
}
.translate-es .welcome:after {
    text-indent: 0px;
    float: left;
    content: '¡Bienvenidos!';
}
Pete OK
quelle
3
Dies ist problematisch für Benutzer mit Bildschirmleseprogrammen. Wenn Sie die Disaply / Sichtbarkeit des Elements nicht ändern und keine Arienhinweise angeben, wird Ihr "unsichtbarer" Text möglicherweise weiterhin von einem Bildschirmleser gelesen.
Auffälliger Compiler
8

Textersetzung durch Pseudoelemente und CSS-Sichtbarkeit

HTML

<p class="replaced">Original Text</p>

CSS

.replaced {
    visibility: hidden;
    position: relative;
}

.replaced:after {
    visibility: visible;
    position: absolute;
    top: 0;
    left: 0;
    content: "This text replaces the original.";
}
Ahsan Aftab
quelle
3

Bei Verwendung eines Pseudoelements erfordert diese Methode keine Kenntnis des ursprünglichen Elements und kein zusätzliches Markup.

#someElement{
    color: transparent; /* You may need to change this color */
    position: relative;
}
#someElement:after { /* Or use :before if that tickles your fancy */
    content: "New text";
    color: initial;
    position: absolute;
    top: 0;
    left: 0;
}
Vin
quelle
2

Dies implementiert ein Kontrollkästchen als Schaltfläche, die je nach aktiviertem Status entweder Ja oder Nein anzeigt. Es zeigt also eine Möglichkeit, Text mithilfe von CSS zu ersetzen, ohne Code schreiben zu müssen.

Es verhält sich immer noch wie ein Kontrollkästchen, wenn ein POST-Wert zurückgegeben wird (oder nicht zurückgegeben wird), aber aus Sicht der Anzeige sieht es aus wie eine Umschalttaste.

Die Farben mögen nicht Ihren Wünschen entsprechen, sie dienen nur dazu, einen Punkt zu veranschaulichen.

Der HTML-Code lautet:

<input type="checkbox" class="yesno" id="testcb" /><label for="testcb"><span></span></label>

... und das CSS ist:

/* --------------------------------- */
/* Make the checkbox non-displayable */
/* --------------------------------- */
input[type="checkbox"].yesno {
    display:none;
}
/* --------------------------------- */
/* Set the associated label <span>   */
/* the way you want it to look.      */
/* --------------------------------- */
input[type="checkbox"].yesno+label span {
    display:inline-block;
    width:80px;
    height:30px;
    text-align:center;
    vertical-align:middle;
    color:#800000;
    background-color:white;
    border-style:solid;
    border-width:1px;
    border-color:black;
    cursor:pointer;
}
/* --------------------------------- */
/* By default the content after the  */
/* the label <span> is "No"          */
/* --------------------------------- */
input[type="checkbox"].yesno+label span:after {
    content:"No";
}
/* --------------------------------- */
/* When the box is checked the       */
/* content after the label <span>    */
/* is "Yes" (which replaces any      */
/* existing content).                */
/* When the box becomes unchecked the*/
/* content reverts to the way it was.*/
/* --------------------------------- */
input[type="checkbox"].yesno:checked+label span:after {
    content:"Yes";
}
/* --------------------------------- */
/* When the box is checked the       */
/* label <span> looks like this      */
/* (which replaces any existing)     */
/* When the box becomes unchecked the*/
/* layout reverts to the way it was. */
/* --------------------------------- */
input[type="checkbox"].yesno:checked+label span {
    color:green;
    background-color:#C8C8C8;
}

Ich habe es nur unter Firefox versucht, aber es ist Standard-CSS, daher sollte es woanders funktionieren.

Steve Douglas
quelle
2

Im Gegensatz zu dem, was ich in jeder anderen Antwort sehe, müssen Sie keine Pseudoelemente verwenden, um den Inhalt eines Tags durch ein Bild zu ersetzen

<div class="pvw-title">Facts</div>

    div.pvw-title { /* No :after or :before required */
        content: url("your URL here");
    }
Estecka
quelle
2
Ab CSS2 gilt contentnur für :beforeund :after. CSS3 erstreckt sie sich auf alles, aber das erzeugte Inhalte Modul befindet sich noch im Entwurfsstatus, so dass jeder Einsatz ist sehr wahrscheinlich sein browserabhängig.
mrec
1
Was ist ein "Balise" ? Nicht " 1. (Europäisches Zugsicherungssystem) Ein elektronisches Leuchtfeuer oder ein Transponder zwischen den Schienen einer Schiene " , nehme ich an. (Bitte bearbeiten Sie Ihre Frage , nicht hier in den Kommentaren.)
Peter Mortensen
1

Dies ist ohne Tricks nicht wirklich möglich. Hier ist eine Möglichkeit, den Text durch ein Textbild zu ersetzen.

.pvw-title{
    text-indent: -9999px;
    background-image: url(text_image.png)
}

Diese Art von Dingen wird normalerweise mit JavaScript ausgeführt. So geht das mit jQuery:

$('.pvw-title').text('new text');
Nathan Manousos
quelle
3
Ich kann auch kein Javascript verwenden: /
MokiTa
1
Dies ist die einzige Möglichkeit, von der ich denke, dass sie funktionieren könnte: .pvw-title span [style * = "color: # 000, font-size: 14px;"] {sichtbarkeit: versteckt; } .pvw-title span [style * = "Farbe: # 000; Schriftgröße: 14px;"]: nach {Sichtbarkeit: sichtbar; Farbe: # 000; Schriftgröße: 14px; Inhalt: "Test"; } aber da beide den gleichen Stil verwenden, kann ich es nicht tun ..: /
MokiTa
Warum sollten Sie es basierend auf der Farbe / Schriftart auswählen?
Nathan Manousos
Ich würde es basierend auf dem gesamten Stil auswählen, damit ich diesen bestimmten Titel und nicht beide bearbeiten kann, da beide den gleichen "div" -Namen haben.
MokiTa
1

Ich hatte ein Problem, bei dem ich den Linktext ersetzen musste, aber ich konnte weder JavaScript verwenden noch den Text eines Hyperlinks direkt ändern, da dieser aus XML kompiliert wurde. Außerdem konnte ich keine Pseudoelemente verwenden, oder sie schienen nicht zu funktionieren, als ich sie ausprobiert hatte.

Grundsätzlich habe ich den gewünschten Text in eine Spanne eingefügt und das Ankertag darunter gelegt und beide in ein Div gewickelt. Ich habe das Ankertag im Grunde genommen über CSS nach oben verschoben und dann die Schriftart transparent gemacht. Wenn Sie jetzt über die Spanne fahren, "verhält" es sich wie ein Link. Eine wirklich hackige Art, dies zu tun, aber so können Sie einen Link mit einem anderen Text haben ...

Dies ist eine Frage, wie ich dieses Problem umgangen habe

Mein HTML

<div class="field">
    <span>This is your link text</span><br/>
    <a href="//www.google.com" target="_blank">This is your actual link</a>
</div>

Mein CSS

 div.field a {
     color: transparent;
     position: absolute;
     top:1%;
 }
 div.field span {
     display: inline-block;
 }

Das CSS muss sich je nach Ihren Anforderungen ändern. Dies ist jedoch eine allgemeine Methode, um das zu tun, was Sie verlangen.

AllmächtigWarum
quelle
1
@AlmightWarum vermute ich, dass dies abgelehnt wurde, weil diese Lösung das Ändern des Markups erfordert, und ich vermute, wenn das OP das Markup ändern könnte, würde er / sie den Text einfach direkt ändern. Mit anderen Worten, das OP benötigte eine
reine
1

Ich habe eine Lösung wie diese gefunden, bei der das Wort "Dunkel" auf einer kleineren Bildschirmbreite auf "D" gekürzt wird. Grundsätzlich machen Sie einfach die Schriftgröße des ursprünglichen Inhalts 0 und haben die verkürzte Form als Pseudoelement.

In diesem Beispiel erfolgt die Änderung stattdessen beim Schweben:

span {
  font-size: 12px;
}

span:after {
  display: none;
  font-size: 12px;
  content: 'D';
  color: red;
}

span:hover {
  font-size: 0px;
}

span:hover:after {
  display: inline;
}
<span>Dark</span>

StefanBob
quelle
1

Nach acht Jahren stand ich vor der gleichen Herausforderung, als ich versuchte, den Stylish zu verwenden Browser-Erweiterung etwas auf einer Website zu ändern (nicht auf meiner). Und dieses Mal habe ich es geschafft, indem ich den Quellcode mit "inspect element" betrachtet und den darauf basierenden CSS-Code erstellt habe.

So sah es vorher aus:

<table>
  <tbody>
    <tr>
      <td role="gridcell">
        <span title="In progress" style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;">In progress</span>
      </td>
    </tr>
  </tbody>
</table>

Dies ist das gleiche Stück HTML und CSS, mit dem ich den Stil geändert habe:

td span[style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;"] {
  width: 100px!important;
}
<table>
  <tbody>
    <tr>
      <td role="gridcell">
        <span title="In progress" style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;">In progress</span>
      </td>
    </tr>
  </tbody>
</table>

Sie können den obigen Code ausführen und sehen, dass er funktioniert (in Chrome getestet).


Dies ist einfach das, was ich damals wollte, als ich diese Frage stellte.

Ich habe eine Art Community-Blog / Myspace verwendet ähnliches Material verwendet und das einzige, was Sie beim Stylen Ihres Profils hatten, war der CSS-Editor. Deshalb wollte ich es basierend auf dem Stil auswählen.

Ich habe die Antwort hier gefunden:

MokiTa
quelle
0

Um dies zu erreichen, müssen Sie dem CSS-Inhalt eine Zeilenhöhe hinzufügen. Dadurch wird der Block über dem ausgeblendeten angezeigt, sodass der geänderte Text nicht ausgeblendet wird.

Beispiel mit Verwendung vor :

.pvw-title span {
  display: none;
}

.pvw-title:before {
  content: 'Whatever it is you want to add';
  line-height: 1.5em
}
Tal Talmon
quelle
0

Nun, wie viele sagten, ist dies ein Hack. Ich möchte jedoch einen aktuelleren Hack hinzufügen, der den Vorteil von flexboxund nutzt rem, dh

  • Sie möchten diesen zu ändernden Text nicht manuell positionieren, deshalb möchten Sie einen Vorteil daraus ziehen flexbox
  • Sie möchten paddingund / oder marginden Text nicht explizit verwenden px, was für unterschiedliche Bildschirmgrößen auf unterschiedlichen Geräten und Browsern möglicherweise unterschiedliche Ausgaben ergibt

Hier ist die Lösung, kurz gesagt, flexboxstellt sicher, dass es automatisch perfekt positioniert ist undrem eine standardisiertere (und automatisiertere) Alternative für Pixel darstellt.

CodeSandbox mit Code unten und Ausgabe in Form eines Screenshots, bitte lesen Sie einen noteunter dem Code!

h1 {
  background-color: green;
  color: black;
  text-align: center;
  visibility: hidden;
}
h1:after {
  background-color: silver;
  color: yellow;
  content: "This is my great text AFTER";
  display: flex;
  justify-content: center;
  margin-top: -2.3rem;
  visibility: visible;
}
h1:before {
  color: blue;
  content: "However, this is a longer text to show this example BEFORE";
  display: flex;
  justify-content: center;
  margin-bottom: -2.3rem;
  visibility: visible;
}

Hinweis: Für verschiedene Tags, für die Sie möglicherweise unterschiedliche Werte benötigen rem, ist dieser Wert h1nur für große Bildschirme gerechtfertigt . Mit können @mediaSie dies jedoch problemlos auf mobile Geräte ausweiten.

Ein Hack, wie man HTML-Text mit CSS ersetzt

Daniel Danielecki
quelle