Man sollte meinen, dass diese Frage einfach zu beantworten ist, mit allem, was jQuery sonst noch so kann. Leider liegt das Problem in einer technischen Frage begründet: css :after und :before Regeln sind nicht Teil des DOM, und kann daher nicht mit den DOM-Methoden von jQuery geändert werden.
Dort sind Es gibt verschiedene Möglichkeiten, diese Elemente mit JavaScript und/oder CSS zu manipulieren; welche Sie verwenden, hängt von Ihren genauen Anforderungen ab.
Ich werde mit dem Ansatz beginnen, der allgemein als der "beste" angesehen wird:
1) Hinzufügen/Entfernen einer vorgegebenen Klasse
Bei diesem Ansatz haben Sie bereits eine Klasse in Ihrem CSS mit einem anderen :after
o :before
Stil. Platzieren Sie diese "neue" Klasse später in Ihrem Stylesheet, um sicherzustellen, dass sie überschrieben wird:
p:before {
content: "foo";
}
p.special:before {
content: "bar";
}
Dann können Sie diese Klasse mit jQuery (oder Vanilla JavaScript) leicht hinzufügen oder entfernen:
$('p').on('click', function() {
$(this).toggleClass('special');
});
$('p').on('click', function() {
$(this).toggleClass('special');
});
p:before {
content: "foo";
color: red;
cursor: pointer;
}
p.special:before {
content: "bar";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
- Vorteile: Einfach mit jQuery zu implementieren; ändert schnell mehrere Stile auf einmal; erzwingt die Trennung von Belangen (Isolierung Ihrer CSS und JS von Ihrem HTML)
- Nachteile: CSS muss vorformuliert sein, so dass der Inhalt von
:before
o :after
nicht vollständig dynamisch ist
2) Neue Stile direkt zum Stylesheet des Dokuments hinzufügen
Es ist möglich, JavaScript zu verwenden, um Stile direkt in das Stylesheet des Dokuments einzufügen, einschließlich :after
y :before
Stile. jQuery bietet keine bequeme Abkürzung, aber zum Glück ist das JS nicht so kompliziert:
var str = "bar";
document.styleSheets[0].addRule('p.special:before','content: "'+str+'";');
var str = "bar";
document.styleSheets[0].addRule('p.special:before', 'content: "' + str + '";');
p:before {
content: "foo";
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p class="special">This is a paragraph</p>
<p>This is another paragraph</p>
.addRule()
und die damit verbundenen .insertRule()
Methoden sind heute recht gut unterstützt.
Als Variante können Sie auch jQuery verwenden, um dem Dokument ein völlig neues Stylesheet hinzuzufügen, aber der dafür erforderliche Code ist nicht sauberer:
var str = "bar";
$('<style>p.special:before{content:"'+str+'"}</style>').appendTo('head');
var str = "bar";
$('<style>p.special:before{content:"' + str + '"}</style>').appendTo('head');
p:before {
content: "foo";
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p class="special">This is a paragraph</p>
<p>This is another paragraph</p>
Wenn es darum geht, die Werte zu "manipulieren" und nicht nur zu addieren, können wir auch lesen die bestehenden :after
o :before
Stile mit einem anderen Ansatz:
var str = window.getComputedStyle(document.querySelector('p'), ':before')
.getPropertyValue('content');
var str = window.getComputedStyle($('p')[0], ':before').getPropertyValue('content');
console.log(str);
document.styleSheets[0].addRule('p.special:before', 'content: "' + str+str + '";');
p:before {
content:"foo";
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p class="special">This is a paragraph</p>
<p>This is another paragraph</p>
Wir können ersetzen document.querySelector('p')
con $('p')[0]
bei der Verwendung von jQuery, für etwas kürzeren Code.
- Vorteile: eine beliebige Zeichenfolge kann dynamisch in den Stil eingefügt werden
- Nachteile: die ursprünglichen Stile werden nicht verändert, sondern nur überschrieben; wiederholte (missbräuchliche) Verwendung kann das DOM beliebig groß werden lassen
3) Ändern Sie ein anderes DOM-Attribut
Sie können auch zu verwenden. attr()
in Ihrem CSS um ein bestimmtes DOM-Attribut zu lesen. ( Wenn ein Browser Folgendes unterstützt :before
unterstützt es attr()
auch. ) Durch die Kombination mit content:
in einem sorgfältig vorbereiteten CSS, können wir den Inhalt ändern (aber nicht andere Eigenschaften, wie Rand oder Farbe) von :before
y :after
dynamisch:
p:before {
content: attr(data-before);
color: red;
cursor: pointer;
}
JS:
$('p').on('click', function () {
$(this).attr('data-before','bar');
});
$('p').on('click', function () {
$(this).attr('data-before','bar');
});
p:before {
content: attr(data-before);
color: red;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
Dies kann mit der zweiten Technik kombiniert werden, wenn das CSS nicht im Voraus zubereitet werden kann:
var str = "bar";
document.styleSheets[0].addRule('p:before', 'content: attr(data-before);');
$('p').on('click', function () {
$(this).attr('data-before', str);
});
var str = "bar";
document.styleSheets[0].addRule('p:before', 'content: attr(data-before) !important;');
$('p').on('click', function() {
$(this).attr('data-before', str);
});
p:before {
content: "foo";
color: red;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
- Vorteile: Erzeugt keine endlosen zusätzlichen Stile
- Nachteile:
attr
in CSS kann nur für Inhaltsstrings gelten, nicht für URLs oder RGB-Farben