Bagaimana saya bisa mengganti teks dengan CSS?

321

Bagaimana saya bisa mengganti teks dengan CSS menggunakan metode seperti ini:

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

Alih-alih ( img[src*="IKON.img"] ), saya harus menggunakan sesuatu yang bisa menggantikan teks.

Saya harus menggunakannya [ ]untuk membuatnya bekerja.

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

Saya perlu mengganti " Fakta ".

MokiTa
sumber
Sejujurnya mungkin lebih baik menggunakan javascript untuk ini.
Sir
Menggunakan Javascript membutuhkan DOM untuk dimuat, jadi ada FOUC. Saya ingin melakukan ini untuk mengganti teks dengan konten yang diekstraksi dari string kueri sambil menghindari FOUC tanpa harus membuat sisi server HTML (sehingga memungkinkan HTML untuk di-cache secara agresif dan disajikan dari CDN).
nemequ
32
Pertanyaannya adalah bagaimana melakukannya dengan CSS. Saya sedang menggunakan CMS yang hanya memungkinkan saya untuk mengubah CSS, yang mengapa saya tiba di ini halaman sementara googling untuk jawabannya, dan tidak satu yang berbeda. Itulah sebabnya kami menjawab pertanyaan yang diajukan alih-alih bertanya mengapa situasi si penanya tidak berbeda.
felwithe

Jawaban:

291

Atau mungkin Anda bisa membungkus putaran 'Fakta' <span>sebagai berikut:

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

Kemudian gunakan:

.pvw-title span {
  display: none;
}
.pvw-title:after {
  content: 'whatever it is you want to add';
}
Matthew Cachia
sumber
52
Bagus, tapi itu perubahan ke HTML daripada hanya CSS.
mikemaccana
22
Terkadang ini satu-satunya pilihan Anda
locrizak
4
span {display: none; } juga harus menyembunyikan elemen pseudo. Anda harus menggunakan visibilitas: disembunyikan
xryl669
2
display: tidak ada; dan visibilitas: tersembunyi; keduanya menyembunyikan elemen semu
Facundo Colombier
10
@Mathew menyembunyikan bentang tetapi menambahkan elemen pseudo ke div, sehingga elemen pseudo tidak boleh disembunyikan (baik dengan menggunakan visibilitas atau properti tampilan)
dewtea
249

Wajib : Ini adalah retasan: CSS bukan tempat yang tepat untuk melakukan ini, tetapi dalam beberapa situasi - misalnya, Anda memiliki perpustakaan pihak ketiga dalam iframe yang hanya dapat dikustomisasi oleh CSS - retasan semacam ini adalah satu-satunya pilihan .

Anda dapat mengganti teks melalui CSS. Mari kita ganti tombol hijau dengan 'halo' dengan tombol merah yang bertuliskan 'selamat tinggal' , menggunakan CSS.

Sebelum:

masukkan deskripsi gambar di sini

Setelah:

masukkan deskripsi gambar di sini

Lihat http://jsfiddle.net/ZBj2m/274/ untuk demo langsung:

Inilah tombol hijau kami:

<button>Hello</button>

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

Sekarang mari kita sembunyikan elemen asli, tetapi tambahkan elemen blok lain setelahnya:

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

catatan:

  • Kami secara eksplisit perlu menandai ini sebagai elemen blok, elemen 'setelah' sebaris secara default
  • Kita perlu mengkompensasi elemen asli dengan menyesuaikan posisi elemen semu.
  • Kita harus menyembunyikan elemen asli dan menampilkan elemen pseudo menggunakan visibility. Catatan display: nonepada elemen asli tidak berfungsi.
mikemaccana
sumber
2
Ini tidak berfungsi dalam 10 yaitu, ada ide bagaimana memodifikasinya untuk melakukannya?
Solmead
49
display: none;tidak berfungsi karena ::afterbenar-benar berarti "di dalam elemen ini, tetapi pada akhirnya", kalau-kalau ada yang penasaran.
Ry-
4
Sayangnya, tombol "modifikasi" tidak berfungsi seperti tombol lagi. Ini contoh yang bagus, hanya saja itu tidak berlaku untuk tombol.
xryl669
1
display: tidak ada; dan visibilitas: tersembunyi; keduanya menyembunyikan elemen semu
Facundo Colombier
Kenapa ketika saya melakukan ini menggantikan elemen tetapi teks semua huruf besar dan tidak dapat diubah menjadi huruf kecil?
Jpaji Rajnish
159

Jika Anda ingin menggunakan elemen semu dan membiarkannya memasukkan konten, Anda dapat melakukan hal berikut. Itu tidak mengasumsikan pengetahuan tentang elemen asli dan tidak memerlukan markup tambahan.

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

Contoh JSFiddle

James van Dyke
sumber
1
Jawaban ini berfungsi di tempat-tempat yang tidak dijawab oleh sejumlah jawaban lain seperti simpul teks di dalam <th>elemen.
Chris Kerekes
5
Ini bekerja dengan baik. Dalam kasus saya, line-height: 0dan color: transparentpada elemen utama dan mengatur ulang nilai-nilai pada pseudo melakukan pekerjaan (tidak mengotak-atik text-indent)
dontGoPlastic
1
Bukankah seharusnya line-height: normalbukan initial?
Benjamin
1
alasan untuk menggunakan indentasi teks adalah bahwa jika teks asli lebih panjang, elemen tetap menjadi ukuran teks lama, tidak menyusut ke ukuran teks baru (dengan asumsi itulah yang Anda inginkan)
Chris Janssen
Indentasi teks: -9999px; bekerja di IE. Sedangkan visibilitas: disembunyikan; Metode tidak bekerja di IE.
Tom Stermitz
57

Berdasarkan jawaban mikemaccana , ini berhasil untuk saya

button {
  position: absolute;
  visibility: hidden;
}

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

§ Penentuan posisi absolut

suatu elemen yang diposisikan secara absolut dikeluarkan dari aliran dan dengan demikian tidak memakan ruang ketika menempatkan elemen-elemen lain.

Steven Penny
sumber
2
Bagi saya, jawaban ini lebih unggul daripada yang lain karena ia bekerja dengan penggantian teks dalam baris yang sama, yaitu, itu tidak memaksa jeda baris dalam teks (untuk kombinasi khusus saya HTML dan CSS).
hal
30

Ini sederhana, singkat, dan efektif. Tidak diperlukan HTML tambahan.

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

Saya harus melakukan ini untuk mengganti teks tautan, selain rumah, untuk remah roti WooCommerce

Sass / Kurang

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

Anda tidak bisa, yah, Anda bisa.

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

Ini akan menyisipkan konten setelah konten elemen saat ini. Ini tidak benar-benar menggantikannya, tetapi Anda dapat memilih untuk div kosong, dan menggunakan CSS untuk menambahkan semua konten.

Tetapi sementara Anda sedikit banyak bisa, Anda tidak seharusnya melakukannya. Konten yang sebenarnya harus dimasukkan dalam dokumen. Properti konten terutama ditujukan untuk markup kecil, seperti tanda kutip di sekitar teks yang akan muncul dikutip.

GolezTrol
sumber
Saya sangat yakin bahwa saya menggunakan kode untuk mengganti teks dengan jenis metode itu .. '<div class = "pvw-title"> Fakta </div> <div class = "pvw-title"> Fakta </ div> 'Saya tidak bisa menggunakan: setelah, karena saya mendapat lebih dari satu kelas div dengan nama yang sama :(
MokiTa
Seberapa luas kompatibilitas itu untuk browser? Dan saya menduga javascript akan menjadi pilihan jangka panjang yang lebih baik untuk fleksibilitas semacam ini.
Sir
Browser modern mendukungnya. Saya tidak yakin tentang versi IE yang lebih lama, tapi saya rasa itu bisa dilihat di quirksmode.com. -edit- Ini dapat: quirksmode.org/css/user-interface/content.html
GolezTrol
15

Coba gunakan :beforedan :after. Satu memasukkan teks setelah HTML di-render, dan yang lainnya memasukkan sebelum HTML di-render. Jika Anda ingin mengganti teks, biarkan konten tombol kosong.

Contoh ini menetapkan teks tombol sesuai dengan ukuran lebar layar.

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

Teks tombol:

  1. Dengan :before

    screenxxx besar

    layar lebar

  2. Dengan :after

    layar xxxbig

    layar lebar

cinta hidup
sumber
11

Jika Anda hanya ingin menampilkan teks atau gambar yang berbeda, biarkan tag kosong dan tulis konten Anda di beberapa atribut data seperti itu <span data-text1="Hello" data-text2="Bye"></span>. Tampilkan dengan salah satu kelas pseudo:before {content: attr(data-text1)}

Sekarang Anda memiliki banyak cara berbeda untuk beralih di antara mereka. Saya menggunakannya dalam kombinasi dengan permintaan media untuk pendekatan desain responsif untuk mengubah nama navigasi saya menjadi ikon.

demonstrasi dan contoh jsfiddle

Ini mungkin tidak menjawab pertanyaan dengan sempurna, tetapi memuaskan kebutuhan saya dan mungkin orang lain juga.

Robbendebiene
sumber
10

Saya memiliki lebih beruntung pengaturan font-size: 0dari unsur luar, dan font-sizedari :afterpemilih untuk apa pun yang diperlukan.

Jerome
sumber
1
Ini bekerja dengan baik. Ini demo .
Arthur
9

Ini bekerja untuk saya dengan teks sebaris. Itu diuji di Firefox, Safari, Chrome, dan 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;
}
Noel Williams
sumber
2
Tidak berfungsi untuk saya dalam setidaknya IE 9 hingga 11 karena mengabaikan "visibilitas: terlihat" pada elemen: after: stackoverflow.com/questions/17530947/…
thenickdude
8

Saya menggunakan trik ini:

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

Saya bahkan menggunakan ini untuk menangani internasionalisasi halaman dengan hanya mengubah kelas dasar ...

.translate-es .welcome {
    text-indent: -999px;
}
.translate-es .welcome:after {
    text-indent: 0px;
    float: left;
    content: '¡Bienvenidos!';
}
Pete oke
sumber
3
Ini bermasalah untuk pengguna dengan pembaca layar. Jika Anda tidak mengubah disaply / visibilitas elemen dan tidak memberikan petunjuk aria, teks "tidak terlihat" Anda mungkin masih dibaca oleh pembaca layar.
Compiler mencolok
8

Penggantian teks dengan elemen semu dan visibilitas 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.";
}
Ahsan Aftab
sumber
3

Menggunakan elemen pseudo, metode ini tidak memerlukan pengetahuan tentang elemen asli dan tidak memerlukan markup tambahan.

#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
sumber
2

Ini mengimplementasikan kotak centang sebagai tombol yang menunjukkan Ya atau Tidak tergantung pada status 'dicentang'. Jadi itu menunjukkan satu cara mengganti teks menggunakan CSS tanpa harus menulis kode apa pun.

Itu masih akan berperilaku seperti kotak centang sejauh mengembalikan (atau tidak mengembalikan) nilai POST, tetapi dari sudut pandang tampilan sepertinya tombol toggle.

Warna mungkin tidak sesuai dengan keinginan Anda, mereka hanya ada di sana untuk menggambarkan suatu titik.

HTML-nya adalah:

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

... dan CSSnya adalah:

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

Saya hanya mencobanya di Firefox, tapi itu CSS standar sehingga harus bekerja di tempat lain.

Steve Douglas
sumber
2

Tidak seperti apa yang saya lihat di setiap jawaban lainnya, Anda tidak perlu menggunakan elemen semu untuk mengganti konten tag dengan gambar

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

    div.pvw-title { /* No :after or :before required */
        content: url("your URL here");
    }
Estecka
sumber
2
Pada CSS2, contenthanya berlaku untuk :beforedan :after. CSS3 meluas ke semuanya, tetapi modul Generated Content masih dalam status konsep, jadi setiap penggunaan sangat mungkin tergantung pada browser.
mrec
1
Apa itu "balise" ? Bukan " 1. (Sistem Kontrol Kereta Eropa) Sebuah suar elektronik atau transponder ditempatkan di antara rel sebuah railw " , saya kira. (Harap balas dengan mengedit pertanyaan Anda , bukan di sini dalam komentar).)
Peter Mortensen
1

Ini tidak mungkin tanpa trik. Berikut ini cara kerjanya dengan mengganti teks dengan gambar teks.

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

Jenis hal ini biasanya dilakukan dengan JavaScript. Inilah cara melakukannya dengan jQuery:

$('.pvw-title').text('new text');
Nathan Manousos
sumber
3
Saya tidak dapat menggunakan Javascript: /
MokiTa
1
Ini adalah satu-satunya cara saya pikir itu bisa berhasil: .pvw-title span [style * = "color: # 000, font-size: 14px;"] {visibility: hidden; } .pvw-title span [style * = "color: # 000; font-size: 14px;"]: after {visibility: visible; warna: # 000; ukuran font: 14px; konten: "Uji"; } tetapi, karena mereka berdua menggunakan gaya yang sama, saya tidak bisa melakukannya ..: /
MokiTa
mengapa Anda memilihnya berdasarkan warna / font?
Nathan Manousos
Saya akan memilihnya berdasarkan keseluruhan gaya, jadi saya dapat mengedit judul tertentu dan tidak keduanya, karena keduanya memiliki nama "div" yang sama.
MokiTa
1

Saya punya masalah ketika saya harus mengganti teks tautan, tetapi saya tidak bisa menggunakan JavaScript dan saya tidak bisa langsung mengubah teks hyperlink karena dikompilasi dari XML. Juga, saya tidak bisa menggunakan elemen pseudo, atau mereka tampaknya tidak berfungsi ketika saya mencobanya.

Pada dasarnya, saya meletakkan teks yang saya inginkan ke dalam rentang dan meletakkan tag jangkar di bawahnya dan membungkus keduanya menjadi div. Saya pada dasarnya memindahkan tag anchor ke atas melalui CSS dan kemudian membuat font transparan. Sekarang ketika Anda mengarahkan kursor, itu "bertindak" seperti sebuah tautan. Cara yang sangat aneh untuk melakukan ini, tetapi ini adalah bagaimana Anda dapat memiliki tautan dengan teks yang berbeda ...

Ini adalah biola bagaimana saya mengatasi masalah ini

HTML saya

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

CSS saya

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

CSS perlu diubah berdasarkan kebutuhan Anda, tetapi ini adalah cara umum untuk melakukan apa yang Anda minta.

Yang Maha Kuasa
sumber
1
@AlmightMengapa saya curiga ini diturunkan karena solusi ini membutuhkan modifikasi markup dan saya curiga jika OP dapat memodifikasi markup, dia hanya akan mengubah teks secara langsung. Dengan kata lain, OP membutuhkan solusi CSS saja
dannie.f
1

Saya menemukan solusi seperti ini di mana sebuah kata, "Gelap", akan disingkat menjadi "D" pada lebar layar yang lebih kecil. Pada dasarnya Anda hanya membuat ukuran font dari konten asli 0 dan memiliki bentuk singkat sebagai elemen pseudo.

Dalam contoh ini, perubahan terjadi pada hover:

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

Setelah delapan tahun, saya menghadapi tantangan yang sama ketika mencoba menggunakan ekstensi browser Stylish untuk mengubah sesuatu di situs web (bukan milik saya). Dan kali ini saya membuatnya bekerja dengan melihat kode sumber menggunakan "elemen inspeksi" dan membuat kode CSS berdasarkan itu.

Ini seperti apa itu sebelumnya:

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

Ini adalah bagian yang sama dari HTML dan CSS yang saya gunakan untuk memodifikasi gaya:

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>

Anda dapat menjalankan kode di atas dan Anda akan melihatnya berfungsi (diuji di Chrome).


Ini hanya apa yang saya inginkan pada masa ketika saya menanyakan pertanyaan ini.

Saya menggunakan semacam komunitas blog / Myspace hal serupa dan satu-satunya yang Anda miliki ketika menata profil Anda adalah editor CSS mereka, dan itulah sebabnya saya ingin memilihnya berdasarkan gaya.

Saya menemukan jawabannya di sini:

MokiTa
sumber
0

Cara untuk membuat pekerjaan ini adalah dengan menambahkan ketinggian baris ke konten CSS. Ini akan membuat blok terlihat di atas yang tersembunyi, sehingga ini tidak akan menyembunyikan teks yang diubah.

Contoh dengan penggunaan sebelumnya :

.pvw-title span {
  display: none;
}

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

Yah, seperti banyak yang bilang ini adalah hack. Namun, saya ingin menambahkan lebih banyak peretasan terkini, yang memanfaatkan flexboxdan rem, yaitu

  • Anda tidak ingin posisi teks ini diubah secara manual, itu sebabnya Anda ingin memanfaatkannya flexbox
  • Anda tidak ingin menggunakan paddingdan / atau marginmenggunakan teks secara eksplisit px, yang untuk ukuran layar berbeda pada perangkat dan browser yang berbeda mungkin memberikan hasil yang berbeda.

Inilah solusinya, singkatnya flexboxmemastikan bahwa itu diposisikan secara otomatis dengan sempurna dan remlebih terstandarisasi (dan otomatis) alternatif untuk piksel.

CodeSandbox dengan kode di bawah ini dan output dalam bentuk screenshot, silakan baca di notebawah kode!

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

Catatan: untuk tag yang berbeda Anda mungkin memerlukan nilai yang berbeda, tag remini telah dibenarkan untuk h1dan hanya pada layar besar. Namun dengan @mediaAnda dapat dengan mudah memperluas ini ke perangkat seluler.

Retasan cara mengganti teks HTML menggunakan CSS

Daniel Danielecki
sumber