Як можна замінити текст на CSS?


321

Як можна замінити текст на CSS, використовуючи такий метод:

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

Замість ( img[src*="IKON.img"] ) мені потрібно використовувати щось, що може замінити текст.

Мені доводиться використовувати, [ ]щоб він працював.

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

Мені потрібно замінити " Факти ".


Якщо чесно, можливо, найкраще використовувати для цього javascript.
Сер

Використання Javascript вимагає завантаження DOM, тому існує FOUC. Я хочу зробити це, щоб замінити текст вмістом, вилученим із рядка запиту, уникаючи FOUC без необхідності генерувати HTML-серверну сторону (тим самим дозволяючи HTML агресивно кешувати та подавати з CDN).
nemequ

32
Питання в тому, як це зробити з CSS. Я маю в використанні CMS , який тільки дозволяє мені змінити CSS, тому я приїхав на цій сторінці , а вдаючись до допомоги для відповіді, а не інший. Ось чому ми відповідаємо на запитання, яке було задано, а не запитувати, чому ситуація з боку запитувача не відрізняється.
Felwithe

Відповіді:


291

А може бути, ви можете обернути "Факти" навколо а <span>так:

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

Потім використовуйте:

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

52
Приємно, але це зміна HTML, а не лише CSS.
mikemaccana

22
Іноді його єдиний варіант
locrizak

4
span {дисплей: немає; } також повинен приховувати псевдоелемент. Ви повинні використовувати видимість: приховано замість цього
xryl669

2
дисплей: немає; та видимість: приховано; обидва приховують псевдо-елемент
Факундо Коломб'є

10
@Mathew приховує проміжок, але додає псевдоелемент у div, тому псевдоелемент не слід приховувати (або за допомогою властивості видимості чи відображення)
dewtea

249

Обов’язково : це хак: CSS - це не правильне місце для цього, але в деяких ситуаціях - наприклад, у вас є бібліотека третьої сторони в iframe, який може бути налаштований лише CSS - такий вид зламу є єдиним варіантом .

Ви можете замінити текст за допомогою CSS. Давайте замінимо зелену кнопку на "привіт" на червону кнопку, яка говорить "до побачення" , використовуючи CSS.

Перед:

введіть тут опис зображення

Після:

введіть тут опис зображення

Дивіться http://jsfiddle.net/ZBj2m/274/ для демонстрації наживо:

Ось наша зелена кнопка:

<button>Hello</button>

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

Тепер приховаємо початковий елемент, але додамо потім ще один блок-елемент:

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

Примітка:

  • Нам явно потрібно позначати це як елемент блоку, елементи "після" вбудовані за замовчуванням
  • Нам потрібно компенсувати вихідний елемент, регулюючи положення псевдоелемента.
  • Ми повинні приховати оригінальний елемент і відобразити псевдоелемент за допомогою visibility. Примітка display: noneщодо оригінального елемента не працює.

2
Це не працює в 10, будь-яка ідея, як його змінити, щоб це зробити?
Solmead

49
display: none;не працює, тому що ::afterнасправді означає "всередині цього елемента, але в кінці", на випадок, коли комусь було цікаво.
Ри-

4
На жаль, "модифікована" кнопка вже не працює як кнопка. Це хороший приклад, просто він не стосується кнопки.
xryl669

1
дисплей: немає; та видимість: приховано; обидва приховують псевдо-елемент
Факундо Коломб'є

Як при цьому, коли я це роблю, він замінює елемент, але текст - це всі літери, і його неможливо змінити на малі?
Jpaji Rajnish

159

Якщо ви готові використовувати псевдоелементи та дозволяєте їм вставляти вміст, ви можете зробити наступне. Він не передбачає знання оригінального елемента та не потребує додаткової розмітки.

.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


1
Ця відповідь працює там, де ряд інших відповідей не такі, як текстові вузли всередині <th>елемента.
Кріс Керекес

5
Це добре працює. У моєму випадку, line-height: 0а color: transparentна головному елементі та скидання цих значень на псевдо виконують роботу (без text-indent
переборів

1
Чи не повинно бути line-height: normalзамість цього initial?
Бенджамін

1
Причина використання тексту-відступу полягає в тому, що якщо початковий текст довший, елемент залишається розміром старого тексту, не зменшуючись до розміру нового тексту (якщо припустити, що саме цього ви хочете)
Кріс Янссен

Текстовий відступ: -9999px; працює на IE. Тоді як видимість: прихована; метод не працює на IE.
Том Стерміц

57

Виходячи з відповіді mikemaccana , це працювало для мене

button {
  position: absolute;
  visibility: hidden;
}

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

§ Абсолютне позиціонування

елемент, який розташований абсолютно, виймається з потоку і, таким чином, не займає місця при розміщенні інших елементів.


2
Для мене ця відповідь була вищою за інших, оскільки вона працює із заміною тексту в одному рядку, тобто не примушує розрив рядка в тексті (для моєї конкретної комбінації HTML та CSS).
пгр

30

Це просто, коротко та ефективно. Додатковий HTML-код не потрібен.

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

Я повинен був зробити це для заміни тексту посилань, окрім домашнього, на сухарі WooCommerce

Сас / менше

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

Ти не можеш, ну, можеш.

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

Це буде вставляти вміст після поточного вмісту елемента. Він насправді не замінює його, але ви можете вибрати порожній div і скористатися CSS, щоб додати весь вміст.

Але хоч ти це можеш більше, чи не можеш. Фактичний зміст має бути введено в документ. Властивість вмісту в основному призначена для невеликої розмітки, як лапки навколо тексту, які мають бути цитованими.


Я дуже впевнений, що я використовував код для заміни тексту таким способом .. '<div class = "pvw-title"> Факти </div> <div class = "pvw-title"> Факти </ div> 'Я не можу використовувати: після, тому що я отримав більше одного класу div з такою ж назвою :(
MokiTa

Наскільки широко сумісна ця версія для браузерів? І я підозрюю, що javascript стане кращим вибором на довгостроковий період для такої гнучкості.
Сер

Сучасні браузери це підтримують. Я не впевнений у старших версіях IE, але я думаю, що їх можна шукати на quirksmode.com. -edit- Це може: quirksmode.org/css/user-interface/content.html
GolezTrol

15

Спробуйте використовувати :beforeта :after. Один вставляє текст після виведення HTML, а інший вставляє перед рендерінгом HTML. Якщо ви хочете замінити текст, залиште вміст кнопки порожнім.

Цей приклад встановлює текст кнопки відповідно до розміру ширини екрана.

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

Текст кнопки:

  1. З :before

    великий екранxxx

    великий екран

  2. З :after

    xxxbig екран

    великий екран


11

Якщо ви просто хочете показувати різні тексти чи зображення, тримайте тег порожнім і записуйте свій вміст у декілька подібних атрибутів даних<span data-text1="Hello" data-text2="Bye"></span> . Покажіть їх одним із псевдокласів:before {content: attr(data-text1)}

Тепер у вас є маса різних способів перемикання між ними. Я використовував їх у поєднанні з медіа-запитами для чуйного дизайнерського підходу, щоб змінити назви моєї навігації на іконки.

демонстрація jsfiddle та приклади

Це може не чудово відповісти на питання, але воно задовольнило мої потреби, а може, і інших.



9

Це працювало для мене з вбудованим текстом. Він був протестований у Firefox, Safari, Chrome та 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
Чи не працює для мене , принаймні , IE 9 по 11 з - за його ігнорування «видимість: видимий» на: після того, як елемент: stackoverflow.com/questions/17530947 / ...
thenickdude

8

Я використовую цю хитрість:

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

Я навіть використовував це для обробки інтернаціоналізації сторінок, просто змінивши базовий клас ...

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

3
Це проблематично для користувачів, які мають зчитувачі екранів. Якщо ви не зміните невтішно / видимість елемента і не надаєте аріївних підказів, ваш "невидимий" текст все ще може читатись на екрані.
Помітний укладач

8

Заміна тексту на псевдоелементи та видимість 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

Використовуючи псевдоелемент, цей метод не вимагає знання оригінального елемента та не потребує додаткової розмітки.

#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

Це реалізує прапорець як кнопку, яка показує або Так, ні Ні, залежно від стану "галочки". Таким чином, він демонструє один із способів заміни тексту за допомогою CSS без необхідності писати будь-який код.

Він все ще буде вести себе як прапорець, наскільки повертає (або не повертає) значення POST, але з точки зору відображення це виглядає як кнопка перемикання.

Кольори можуть вам не сподобатися, вони лише там, щоб проілюструвати точку.

HTML:

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

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

Я спробував це лише на Firefox, але це стандартний CSS, тому він повинен працювати в іншому місці.


2

На відміну від того, що я бачу в кожній іншій відповіді, вам не потрібно використовувати псевдоелементи, щоб замінити вміст тегу на зображення

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

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

2
Що стосується CSS2, contentстосується лише :beforeта :after. CSS3 поширює його на все, але модуль згенерованого контенту все ще знаходиться в статусі чернетки, тому велике ймовірність будь-якого використання залежить від браузера.
mrec


1

Це справді неможливо без хитрощів. Ось спосіб, який працює, замінивши текст на зображення тексту.

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

Цей тип речі зазвичай робиться за допомогою JavaScript. Ось як це можна зробити за допомогою jQuery:

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

3
Я також не можу використовувати Javascript: /
MokiTa

1
Це єдиний спосіб, на який я думаю, що це може працювати: .pvw-title span [style * = "color: # 000, font-size: 14px;"] {видимість: приховано; } .pvw-title span [style * = "color: # 000; font-size: 14px;"]: після {видимість: видно; колір: # 000; розмір шрифту: 14px; зміст: "Тест"; } але, оскільки вони обидва використовують один і той же стиль, я не можу це зробити ..: /
MokiTa

чому б ви вибрали його на основі кольору / шрифту?
Натан Манусос

Я б вибрав його виходячи з усього стилю, тому я можу відредагувати цю конкретну назву, а не обидва, оскільки обидва мають однакове ім'я "div".
MokiTa

1

У мене виникла проблема, коли мені довелося замінити текст посилання, але я не зміг використовувати JavaScript, а також не зміг безпосередньо змінити текст гіперпосилання, оскільки він був складений з XML. Крім того, я не міг використовувати псевдоелементи, або вони, схоже, не спрацювали, коли я їх спробував.

В основному я помістив потрібний текст в проліт і поклав під нього тег прив’язки і загорнув обох у діву. Я в основному перемістив тег прив’язки вгору через CSS, а потім зробив шрифт прозорим. Тепер, коли ви наведіть курсор на проміжок, він "діє" як посилання. По-справжньому хакітський спосіб зробити це, але саме так ви можете мати посилання з різним текстом ...

Це загадка про те, як я обійшов цю проблему

Мій 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>

Мій CSS

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

CSS потрібно буде змінити, виходячи з ваших вимог, але це загальний спосіб робити те, що ви просите.


1
@AlmightЧому я підозрюю, що це було знято з огляду на те, що це рішення вимагає зміни розмітки, і я підозрюю, що ОП може змінити розмітку, він / вона просто змінить текст безпосередньо. Іншими словами, ОП вимагало лише рішення CSS
dannie.f

1

Я знайшов таке рішення, де слово "Темне" було б скорочено до просто "D" на меншій ширині екрана. В основному ви просто зробите розмір шрифту оригінального вмісту 0 і маєте скорочену форму як псевдоелемент.

У цьому прикладі зміна відбувається на наведення курсора замість цього:

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

Після восьми років я зіткнувся з тим же завданням, коли намагався використовувати Стильний розширення браузера щоб щось змінити на веб-сайті (не моє). І цього разу я змусив його працювати, переглянувши вихідний код за допомогою "перевірити елемент" та створив на основі цього CSS-код.

Це те, що виглядало раніше:

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

Це той самий фрагмент HTML і CSS, який я використовував для зміни стилю:

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>

Ви можете запустити код вище, і ви побачите, що він працює (перевірено в Chrome).


Це просто те, що я хотів ще в ті часи, коли я задавав це питання.

Я використовував якийсь блог спільноти / Myspace подібні речі в і єдине, що ви мали під час створення свого профілю, був їх редактор CSS, і саме тому я хотів обрати його на основі стилю.

Тут я знайшов відповідь:


0

Спосіб зробити цю роботу - додати висоту рядка до вмісту CSS. Це зробить блок, який можна побачити над прихованим, таким чином, це не приховає змінений текст.

Приклад із використанням до :

.pvw-title span {
  display: none;
}

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

0

Ну, як багато хто казав, це хак. Однак я хотів би додати більш сучасний хак, який використовує перевагу flexboxі rem, тобто

  • Ви не хочете вручну розміщувати цей текст, щоб його змінювали, саме тому ви хочете скористатися flexbox
  • Ви не хочете використовувати paddingта / або marginвикористовувати текст, явно використовуючи px, що для різних розмірів екрана на різних пристроях та браузерах може давати різний вихід

Ось рішення, коротше кажучи, flexboxгарантує, що воно автоматично розташоване ідеально та remє більш стандартизованою (і автоматизованою) альтернативою пікселів.

CodeSandbox з кодом нижче та виводимо у вигляді скріншота, будь ласка, прочитайте noteнижче код!

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

Примітка: для різних тегів вам можуть знадобитися різні значення rem, це було виправдано h1і лише на великих екранах. Однак з @mediaвами можна легко поширити це на мобільні пристрої.

Злом, як замінити текст HTML за допомогою CSS

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.