Come posso sostituire il testo con CSS?


321

Come posso sostituire il testo con CSS usando un metodo come questo:

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

Invece di ( img[src*="IKON.img"] ), devo usare qualcosa che può sostituire il testo.

Devo usarlo [ ]per farlo funzionare.

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

Devo sostituire " Fatti ".


Ad essere onesti, potrebbe essere meglio usare JavaScript per questo.
Sir

L'uso di Javascript richiede il caricamento del DOM, quindi è presente un FOUC. Voglio fare questo per sostituire il testo con il contenuto estratto dalla stringa di query evitando un FOUC senza dover generare il lato server HTML (consentendo in tal modo l'HTML di essere memorizzato nella cache in modo aggressivo e servito da un CDN).
nemequ

32
La domanda è come farlo con i CSS. Io sto usando un CMS che consente solo me per cambiare il CSS, che è il motivo per cui sono arrivato a questa pagina, mentre googling per la risposta, e non un altro. Questo è il motivo per cui rispondiamo alla domanda che è stata posta invece di chiedere perché la situazione del richiedente non è diversa.
felwithe

Risposte:


291

O forse potresti avvolgere 'Fatti' intorno a <span>come segue:

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

Quindi utilizzare:

.pvw-title span {
  display: none;
}
.pvw-title:after {
  content: 'whatever it is you want to add';
}

52
Bello, ma questa è una modifica all'HTML piuttosto che al solo CSS.
Mikemaccana,

22
A volte è la tua unica opzione
locrizak

4
span {display: none; } dovrebbe anche nascondere l'elemento pseudo. Dovresti usare la visibilità: nascosto invece
xryl669,

2
display: nessuno; e visibilità: nascosto; entrambi nascondono lo pseudo elemento
Facundo Colombier,

10
@Mathew sta nascondendo l'intervallo ma aggiungendo lo pseudo elemento al div, quindi lo pseudo elemento non deve essere nascosto (utilizzando la visibilità o la proprietà display)
dewtea

249

Obbligatorio : questo è un trucco: CSS non è il posto giusto per farlo, ma in alcune situazioni - ad esempio, hai una libreria di terze parti in un iframe che può essere personalizzata solo dai CSS - questo tipo di hack è l'unica opzione .

È possibile sostituire il testo tramite CSS. Sostituiamo un pulsante verde con "ciao" con un pulsante rosso che dice "arrivederci" , usando CSS.

Prima:

inserisci qui la descrizione dell'immagine

Dopo:

inserisci qui la descrizione dell'immagine

Vedi http://jsfiddle.net/ZBj2m/274/ per una demo live:

Ecco il nostro pulsante verde:

<button>Hello</button>

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

Ora nascondiamo l'elemento originale, ma aggiungiamo un altro elemento a blocchi in seguito:

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

Nota:

  • Abbiamo esplicitamente bisogno di contrassegnarlo come elemento a blocchi, gli elementi "after" sono in linea per impostazione predefinita
  • Dobbiamo compensare l'elemento originale regolando la posizione dello pseudo-elemento.
  • Dobbiamo nascondere l'elemento originale e visualizzare l'elemento pseudo utilizzando visibility. Nota display: nonesull'elemento originale non funziona.

2
Questo non funziona in ie 10, hai idea di come modificarlo per farlo?
Solmead,

49
display: none;non funziona perché ::aftersignifica davvero "all'interno di questo elemento, ma alla fine", nel caso qualcuno fosse curioso.
Ry-

4
Sfortunatamente, il pulsante "modificato" non funziona più come un pulsante. È un buon esempio, solo che non si applica a un pulsante.
xryl669,

1
display: nessuno; e visibilità: nascosto; entrambi nascondono lo pseudo elemento
Facundo Colombier,

Come mai quando lo faccio sostituisce l'elemento ma il testo è tutto maiuscolo e non può essere modificato in minuscolo?
Jpaji Rajnish,

159

Se sei disposto a utilizzare pseudo elementi e lascia che inseriscano contenuti, puoi procedere come segue. Non presuppone la conoscenza dell'elemento originale e non richiede markup aggiuntivi.

.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 */
}

Esempio JSFiddle


1
Questa risposta funziona in punti in cui un numero delle altre risposte non è presente, ad esempio nodi di testo all'interno di un <th>elemento.
Chris Kerekes,

5
Funziona bene Nel mio caso, line-height: 0e color: transparentsull'elemento principale e reimpostare quei valori sullo pseudo fare il lavoro (non armeggiare con text-indent)
dontGoPlastic

1
Non dovrebbe essere line-height: normalinvece di initial?
Benjamin,

1
il motivo per usare il rientro del testo è che se il testo originale è più lungo, l'elemento rimane la dimensione del vecchio testo, non si riduce alla dimensione del nuovo testo (supponendo che sia quello che vuoi)
Chris Janssen

Il rientro del testo: -9999px; funziona su IE. Considerando che la visibilità: nascosta; il metodo non funziona su IE.
Tom Stermitz,

57

Basato sulla risposta di mikemaccana , questo ha funzionato per me

button {
  position: absolute;
  visibility: hidden;
}

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

§ Posizionamento assoluto

un elemento posizionato in modo assoluto viene rimosso dal flusso e quindi non occupa spazio quando si posizionano altri elementi.


2
Per me questa risposta è stata superiore alle altre perché funziona con una sostituzione del testo all'interno della stessa riga, ovvero non impone un'interruzione di riga nel testo (per la mia particolare combinazione di HTML e CSS).
pag

30

Questo è semplice, breve ed efficace. Non è necessario alcun HTML aggiuntivo.

.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 */
    }

Ho dovuto farlo per sostituire il testo del collegamento, diverso da casa, per pangrattato WooCommerce

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

22

Non puoi, beh, puoi.

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

Questo inserirà il contenuto dopo il contenuto corrente dell'elemento. In realtà non lo sostituisce, ma puoi scegliere un div vuoto e utilizzare CSS per aggiungere tutto il contenuto.

Ma mentre più o meno puoi, non dovresti. Il contenuto effettivo deve essere inserito nel documento. La proprietà content è pensata principalmente per il markup di piccole dimensioni, come le virgolette attorno al testo che dovrebbero apparire tra virgolette.


Sono molto sicuro di aver usato un codice per sostituire il testo con il tipo di quel metodo. '<Div class = "pvw-title"> Facts </div> <div class = "pvw-title"> Facts </ div> 'Non posso usare: dopo, perché ho preso più di una classe div con lo stesso nome :(
MokiTa

Quanto è ampiamente compatibile per i browser? E sospetto che JavaScript sarà una scelta migliore a lungo termine per questo tipo di flessibilità.
Sir

I browser moderni lo supportano. Non sono sicuro delle versioni precedenti di IE, ma immagino che si possano cercare su quirksmode.com. -edit- Può: quirksmode.org/css/user-interface/content.html
GolezTrol

15

Prova a usare :beforee :after. Uno inserisce il testo dopo il rendering dell'HTML e l'altro inserisce prima del rendering dell'HTML. Se si desidera sostituire il testo, lasciare vuoto il contenuto del pulsante.

Questo esempio imposta il testo del pulsante in base alla dimensione della larghezza dello schermo.

<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>

Pulsante di testo:

  1. Con :before

    grande schermoxxx

    grande schermo

  2. Con :after

    schermo xxxbig

    grande schermo


11

Se vuoi solo mostrare testi o immagini diversi, mantieni il tag vuoto e scrivi il tuo contenuto in più attributi di dati come quello <span data-text1="Hello" data-text2="Bye"></span>. Visualizzali con una delle pseudo classi:before {content: attr(data-text1)}

Ora hai un sacco di modi diversi per passare da uno all'altro. Li ho usati in combinazione con media query per un approccio di design reattivo per cambiare i nomi della mia navigazione in icone.

dimostrazione ed esempi di jsfiddle

Potrebbe non rispondere perfettamente alla domanda, ma ha soddisfatto le mie esigenze e forse anche altre.


10

Ho avuto più fortuna a impostare l' font-size: 0elemento esterno e font-sizeil :afterselettore su tutto ciò di cui avevo bisogno.


1
Funziona bene Ecco una demo .
Arthur,

9

Questo ha funzionato per me con il testo incorporato. È stato testato su Firefox, Safari, Chrome e Opera.

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

2
Non funziona per me in almeno IE 9 a 11 a causa di essa ignorando la "visibilità: visibile" sul: dopo l'elemento: stackoverflow.com/questions/17530947/...
thenickdude

8

Uso questo trucco:

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

L'ho persino usato per gestire l'internazionalizzazione delle pagine semplicemente cambiando una classe di base ...

.translate-es .welcome {
    text-indent: -999px;
}
.translate-es .welcome:after {
    text-indent: 0px;
    float: left;
    content: '¡Bienvenidos!';
}

3
Questo è problematico per gli utenti con screen reader. Se non modifichi la non-visibilità / visibilità dell'elemento e non fornisci alcun suggerimento per l'aria, il tuo testo "invisibile" potrebbe essere comunque letto da uno screen reader.
Conspicuous Compiler

8

Sostituzione del testo con pseudo-elementi e visibilità CSS

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

3

Utilizzando uno pseudo elemento, questo metodo non richiede la conoscenza dell'elemento originale e non richiede alcun markup aggiuntivo.

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

2

Questo implementa una casella di controllo come pulsante che mostra Sì o No a seconda del suo stato "controllato". Quindi dimostra un modo per sostituire il testo utilizzando CSS senza dover scrivere alcun codice.

Si comporterà comunque come una casella di controllo per quanto riguarda la restituzione (o non la restituzione) di un valore POST, ma dal punto di vista del display sembra un pulsante di attivazione / disattivazione.

I colori potrebbero non essere di tuo gradimento, sono solo lì per illustrare un punto.

L'HTML è:

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

... e il CSS è:

/* --------------------------------- */
/* 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;
}

L'ho provato solo su Firefox, ma è CSS standard, quindi dovrebbe funzionare altrove.


2

A differenza di quello che vedo in ogni altra risposta, non è necessario utilizzare pseudo elementi per sostituire il contenuto di un tag con un'immagine

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

    div.pvw-title { /* No :after or :before required */
        content: url("your URL here");
    }

2
A partire da CSS2, contentsi applica solo a :beforee :after. CSS3 lo estende a tutto, ma il modulo Contenuto generato è ancora in bozza, quindi ogni utilizzo è altamente dipendente dal browser.
mrec,


1

Questo non è davvero possibile senza trucchi. Ecco un modo che funziona sostituendo il testo con un'immagine di testo.

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

Questo tipo di cose viene in genere fatto con JavaScript. Ecco come si può fare con jQuery:

$('.pvw-title').text('new text');

3

1
Questo è l'unico modo in cui penso possa funzionare: .pvw-title span [style * = "color: # 000, dimensione carattere: 14px;"] {visibilità: nascosto; } .pvw-title span [style * = "color: # 000; font-size: 14px;"]: after {visibilità: visibile; color: # 000; font-size: 14px; contenuto: "Test"; } ma, dato che entrambi usano lo stesso stile, non posso farlo ..: /
MokiTa

perché lo selezioneresti in base al colore / carattere?
Nathan Manousos,

Vorrei selezionarlo in base all'intero stile, quindi posso modificare quel titolo specifico e non entrambi, poiché entrambi hanno lo stesso nome "div".
MokiTa,

1

Ho avuto un problema in cui dovevo sostituire il testo del collegamento, ma non potevo usare JavaScript né modificare direttamente il testo di un collegamento ipertestuale in quanto compilato da XML. Inoltre, non potevo usare gli pseudo elementi o non sembravano funzionare quando li avevo provati.

Fondamentalmente, ho messo il testo che volevo in un arco e ho messo il tag di ancoraggio sotto di esso e ho avvolto entrambi in un div. Fondamentalmente ho spostato il tag di ancoraggio tramite CSS e poi ho reso il carattere trasparente. Ora quando passi con il mouse sopra l'arco, "agisce" come un collegamento. Un modo davvero disordinato per farlo, ma è così che puoi avere un link con testo diverso ...

Questo è un violino di come ho risolto questo problema

Il mio 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>

Il mio CSS

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

Il CSS dovrà cambiare in base alle tue esigenze, ma questo è un modo generale di fare ciò che stai chiedendo.


1
@AlmightPerché sospetto che questo sia stato sottoposto a downgrade poiché questa soluzione richiede la modifica del markup e sospetto che se l'OP potesse modificare il markup, cambierebbe direttamente il testo. In altre parole, il PO richiedeva una soluzione solo CSS
dannie.f,

1

Ho trovato una soluzione come questa in cui una parola, "Scura", verrebbe abbreviata in "D" su una larghezza dello schermo inferiore. Fondamentalmente devi solo rendere la dimensione del carattere del contenuto originale 0 e avere la forma abbreviata come pseudo elemento.

In questo esempio la modifica avviene invece al passaggio del mouse:

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>


1

Dopo otto anni, ho dovuto affrontare la stessa sfida quando cercavo di utilizzare l' estensione del browser Stylish per cambiare qualcosa su un sito Web (non mio). E questa volta l'ho fatto funzionare guardando il codice sorgente usando "inspect element" e ho creato il codice CSS basato su quello.

Questo è quello che sembrava prima:

<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>

Questo è lo stesso pezzo di HTML e CSS che ho usato per modificare lo stile:

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>

Puoi eseguire il codice sopra e vedrai che funziona (testato in Chrome).


Questo è semplicemente quello che volevo nei giorni in cui ho posto questa domanda.

Stavo usando una specie di blog / Myspace della community cose simili di e l'unica cosa che hai avuto quando hai disegnato il tuo profilo era il loro editor CSS, ed è per questo che volevo selezionarlo in base allo stile.

Ho trovato la risposta qui:


0

Il modo per farlo funzionare è aggiungere l'altezza della linea al contenuto CSS. Questo renderà il blocco visibile sopra il nascosto, quindi non nasconderà il testo modificato.

Esempio con utilizzo prima :

.pvw-title span {
  display: none;
}

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

0

Bene, come molti hanno detto questo è un trucco. Tuttavia, vorrei aggiungere un hack più aggiornato, che sfrutta flexboxe rem, ad esempio

  • Non vuoi posizionare manualmente questo testo da modificare, ecco perché ti piacerebbe trarne vantaggio flexbox
  • Non si desidera utilizzare paddinge / o marginutilizzare esplicitamente il testo px, che per schermi di dimensioni diverse su dispositivi e browser diversi potrebbe fornire output diversi

Ecco la soluzione, in breve si flexboxassicura che sia automaticamente posizionata perfettamente e che remsia un'alternativa più standardizzata (e automatizzata) per i pixel.

CodeSandbox con il codice qui sotto e l'output in una forma di screenshot, per favore leggi un notesotto il codice!

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

Nota: per tag diversi potrebbero essere necessari valori diversi di rem, questo è stato giustificato per h1e solo su schermi di grandi dimensioni. Tuttavia con @mediate potresti facilmente estenderlo ai dispositivi mobili.

Un trucco su come sostituire il testo HTML tramite CSS

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.