Gibt es eine Möglichkeit, CSS-Pseudoelemente wie ::before
und ::after
(und die alte Version mit einem Semikolon) mit jQuery auszuwählen / zu bearbeiten?
In meinem Stylesheet gilt beispielsweise die folgende Regel:
.span::after{ content:'foo' }
Wie kann ich mit jQuery 'foo' in 'bar' ändern?
javascript
jquery
css
jquery-selectors
pseudo-element
JBradwell
quelle
quelle
Antworten:
Sie können den Inhalt auch mit einem Datenattribut an das Pseudoelement übergeben und dann mit jQuery Folgendes bearbeiten:
In HTML:
In jQuery:
In CSS:
Wenn Sie verhindern möchten, dass der 'andere Text' angezeigt wird, können Sie dies mit der folgenden Lösung von seucolega kombinieren:
In HTML:
In jQuery:
In CSS:
quelle
attr
Funktion für diecontent
Eigenschaft zu verwenden? Ich bin überrascht, dass ich noch nie davon gehört habe ...attr()
, schade, dass ich es nicht mit anderen Eigenschaften als verwenden konntecontent
. Demoattr()
über CSS2 hinaus implementiert wurde , während in CSS2 selbstattr()
nur für diecontent
Eigenschaft definiert wurde .:before
, unterstützt erattr()
in CSSSie würden denken, dies wäre eine einfach zu beantwortende Frage, mit allem anderen, was jQuery tun kann. Leider ist das Problem auf ein technisches Problem zurückzuführen: css: after und: before-Regeln sind nicht Teil des DOM und können daher nicht mit den DOM-Methoden von jQuery geändert werden.
Es gibt Möglichkeiten, diese Elemente mithilfe von JavaScript- und / oder CSS-Problemumgehungen zu bearbeiten. Welches Sie verwenden, hängt von Ihren genauen Anforderungen ab.
Ich werde mit dem beginnen, was allgemein als der "beste" Ansatz angesehen wird:
1) Hinzufügen / Entfernen einer vorgegebenen Klasse
Bei diesem Ansatz haben Sie bereits eine Klasse in Ihrem CSS mit einem anderen erstellt
:after
oder:before
Stil. Platzieren Sie diese "neue" Klasse später in Ihrem Stylesheet, um sicherzustellen, dass sie überschreibt:Dann können Sie diese Klasse einfach mit jQuery (oder Vanilla JavaScript) hinzufügen oder entfernen:
Code-Snippet anzeigen
:before
oder:after
nicht vollständig dynamisch ist2) Fügen Sie neue Stile direkt zum Stylesheet des Dokuments hinzu
Es ist möglich, JavaScript zu verwenden, um Stile direkt zum Dokument-Stylesheet hinzuzufügen, einschließlich
:after
und:before
Stile. jQuery bietet keine praktische Verknüpfung, aber zum Glück ist das JS nicht so kompliziert:Code-Snippet anzeigen
.addRule()
und die damit verbundenen.insertRule()
Methoden werden heute ziemlich gut unterstützt.Als Variation können Sie auch jQuery verwenden, um dem Dokument ein völlig neues Stylesheet hinzuzufügen, aber der erforderliche Code ist nicht sauberer:
Code-Snippet anzeigen
Wenn es darum geht, die Werte zu "manipulieren" und nicht nur zu ergänzen, können wir auch die vorhandenen oder Stile mit einem anderen Ansatz lesen
:after
:before
:Code-Snippet anzeigen
Wir können ersetzen
document.querySelector('p')
mit$('p')[0]
bei der Verwendung von jQuery, für etwas kürzer Code.3) Ändern Sie ein anderes DOM-Attribut
Sie können auch verwenden
attr()
in Ihrem CSS ein bestimmtes DOM - Attribut zu lesen. ( Wenn ein Browser dies unterstützt:before
, unterstützt er diesattr()
auch. ) Durch die Kombination mitcontent:
einem sorgfältig vorbereiteten CSS können wir den Inhalt (aber nicht andere Eigenschaften wie Rand oder Farbe) von:before
und:after
dynamisch ändern :JS:
Code-Snippet anzeigen
Dies kann mit der zweiten Technik kombiniert werden, wenn das CSS nicht im Voraus vorbereitet werden kann:
Code-Snippet anzeigen
attr
In CSS kann nur auf Inhaltszeichenfolgen angewendet werden, nicht auf URLs oder RGB-Farbenquelle
Obwohl sie von Browsern über CSS gerendert werden, als wären sie wie andere echte DOM-Elemente, sind Pseudoelemente selbst nicht Teil des DOM, da Pseudoelemente, wie der Name schon sagt, keine echten Elemente sind und Sie dies daher nicht können auswählen und bearbeiten sie direkt mit jQuery (oder beliebigen JavaScript - APIs für diese Angelegenheit, nicht einmal die Selectors API ). Dies gilt für alle Pseudoelemente, deren Stile Sie mit einem Skript ändern möchten, und nicht nur für
::before
und::after
.Sie können nur zur Laufzeit direkt über das CSSOM (think
window.getComputedStyle()
) auf Pseudoelementstile zugreifen , das von jQuery beyond nicht verfügbar gemacht wird. Diese.css()
Methode unterstützt auch keine Pseudoelemente .Sie können jedoch immer andere Wege finden, zum Beispiel:
Anwenden der Stile auf die Pseudoelemente einer oder mehrerer beliebiger Klassen und anschließendes Umschalten zwischen Klassen (siehe die Antwort von seucolega für ein kurzes Beispiel) - dies ist die idiomatische Methode, da einfache Selektoren verwendet werden (die Pseudoelemente nicht sind) Unterscheiden Sie zwischen Elementen und Elementzuständen, wie sie verwendet werden sollen
Manipulieren der Stile, die auf die Pseudoelemente angewendet werden, durch Ändern des Dokumentstylesheets, was viel mehr ein Hack ist
quelle
Sie können Pseudoelemente in jQuery nicht auswählen, da sie nicht Teil von DOM sind. Sie können dem Vaterelement jedoch eine bestimmte Klasse hinzufügen und seine Pseudoelemente in CSS steuern.
BEISPIEL
In jQuery:
In CSS:
quelle
Wir können uns auch auf benutzerdefinierte Eigenschaften (auch als CSS-Variablen bezeichnet) verlassen, um Pseudoelemente zu manipulieren. Wir können in der Spezifikation lesen, dass:
In Anbetracht dessen besteht die Idee darin, die benutzerdefinierte Eigenschaft innerhalb des Elements zu definieren, und das Pseudoelement erbt sie einfach. somit können wir es leicht modifizieren.
1) Inline-Stil verwenden :
2) Verwenden von CSS und Klassen
3) Verwenden von Javascript
4) Verwenden von jQuery
Es kann auch mit komplexen Werten verwendet werden:
Möglicherweise stellen Sie fest, dass ich die Syntax
var(--c,value)
in Betracht ziehe, bei dervalue
es sich um den Standardwert handelt und der auch als Fallback-Wert bezeichnet wird.Aus derselben Spezifikation können wir lesen:
Und später:
Wenn wir die benutzerdefinierte Eigenschaft nicht setzen ODER sie auf
initial
ODER setzen, enthält sie einen ungültigen Wert, wird der Fallback-Wert verwendet. Die Verwendung voninitial
kann hilfreich sein, wenn wir eine benutzerdefinierte Eigenschaft auf ihren Standardwert zurücksetzen möchten.verbunden
Wie speichere ich einen geerbten Wert in einer benutzerdefinierten CSS-Eigenschaft (auch bekannt als CSS-Variablen)?
Benutzerdefinierte CSS-Eigenschaften (Variablen) für das Box-Modell
Bitte beachten Sie, dass CSS-Variablen möglicherweise nicht in allen Browsern verfügbar sind, die Sie für relevant halten (z. B. IE 11): https://caniuse.com/#feat=css-variables
quelle
In Anlehnung an das, was Christian vorschlägt, könnten Sie auch Folgendes tun:
quelle
Hier ist die Möglichkeit, auf folgende Eigenschaften zuzugreifen: after und: before style, definiert in css:
quelle
Wenn Sie die sudo-Elemente :: before oder :: after vollständig über CSS bearbeiten möchten, können Sie dies JS tun. Siehe unten;
Beachten Sie, wie das
<style>
Element eine ID hat, mit der Sie es entfernen und erneut anhängen können, wenn sich Ihr Stil dynamisch ändert.Auf diese Weise wird Ihr Element mithilfe von JS genau so gestaltet, wie Sie es über CSS möchten.
quelle
Eine funktionierende, aber nicht sehr effiziente Möglichkeit besteht darin, dem Dokument eine Regel mit dem neuen Inhalt hinzuzufügen und mit einer Klasse darauf zu verweisen. Je nachdem, was benötigt wird, benötigt die Klasse möglicherweise eine eindeutige ID für jeden Wert im Inhalt.
quelle
Hier ist der HTML:
Berechneter Stil auf 'vorher' war
content: "VERIFY TO WATCH";
Hier sind meine beiden Zeilen von jQuery, die die Idee verwenden, eine zusätzliche Klasse hinzuzufügen, um speziell auf dieses Element zu verweisen, und dann ein Style-Tag (mit einem! Wichtigen Tag) anzuhängen, um das CSS des Inhaltswerts des sudo-Elements zu ändern:
$("span.play:eq(0)").addClass('G');
$('body').append("<style>.G:before{content:'NewText' !important}</style>");
quelle
Danke euch allen! Ich habe es geschafft zu tun, was ich wollte: D http://jsfiddle.net/Tfc9j/42/ hier werfen Sie einen Blick
ich wollte die opazität eines äußeren div haben, um sich von der opazität des inneren div zu unterscheiden und diese änderung mit einem klick irgendwo zu ändern;) danke!
quelle
append
, verwendenhtml
ist am besten zu verhindernSie können eine gefälschte Eigenschaft erstellen oder eine vorhandene verwenden und diese im Stylesheet des Pseudoelements erben .
Es scheint, dass es für die Eigenschaft "content" nicht funktioniert :(
quelle
Dies ist nicht praktisch, da ich dies nicht für den realen Gebrauch geschrieben habe, nur um Ihnen ein Beispiel dafür zu geben, was erreicht werden kann.
Dies fügt derzeit ein / oder ein Style-Element hinzu, das Ihre erforderlichen Attribute enthält, die sich auf das After-Pseudo-Element des Zielelements auswirken.
Dies kann als verwendet werden
und
Da nach: und vor: Pseudoelementen nicht direkt über DOM zugegriffen werden kann, ist es derzeit nicht möglich, die spezifischen Werte des CSS frei zu bearbeiten.
Mein Weg war nur ein Beispiel und es ist nicht gut zum Üben. Sie können ihn modifizieren, einige Ihrer eigenen Tricks ausprobieren und ihn für den realen Gebrauch korrigieren.
Also experimentiere selbst mit diesem und anderen!
Grüße - Adarsh Hegde.
quelle
Ich füge immer meine eigene Utils-Funktion hinzu, die so aussieht.
oder nutzen Sie die ES6-Funktionen:
quelle
Warum Klassen oder Attribute hinzufügen, wenn Sie nur a
style
an head anhängen können?quelle
Hier gibt es viele Antworten, aber keine Antwort hilft dabei, das CSS von
:before
oder:after
nicht einmal das akzeptierte zu manipulieren .Hier ist, wie ich es vorschlage. Nehmen wir an, Ihr HTML ist wie folgt:
Und dann setzen Sie sein: vorher in CSS und entwerfen es wie folgt:
Bitte beachten Sie, dass ich das
content
Attribut auch im Element selbst festgelegt habe, damit Sie es später problemlos entfernen können. Jetzt gibt es einebutton
Klicken, auf das Sie die Farbe von: before in green und die Schriftgröße in 30px ändern möchten. Sie können dies wie folgt erreichen:Definieren Sie ein CSS mit Ihrem gewünschten Stil für eine Klasse
.activeS
:Jetzt können Sie: before style ändern, indem Sie die Klasse wie folgt zu Ihrem: before-Element hinzufügen:
Wenn Sie nur Inhalte erhalten möchten
:before
, können Sie dies wie folgt tun:Wenn Sie den
:before
Inhalt von jQuery dynamisch ändern möchten , können Sie dies wie folgt erreichen:Wenn Sie oben auf die Schaltfläche "changeBefore" klicken, wird der
:before
Inhalt von#something
in "22 " geändert , was ein dynamischer Wert ist.Ich hoffe, es hilft
quelle
Ich habe in definierten Variablen verwenden ,
:root
innerhalbCSS
dem ändern:after
(das gleiche gilt für:before
) pseudo-Element , insbesondere die sie ändertbackground-color
Wert für einen gestyltanchor
durch definierte.sliding-middle-out:hover:after
und dencontent
Wert für die andereanchor
(#reference
) in der folgenden Demo , die JavaScript durch Verwendung von Zufall Farben erzeugt / jQuery:HTML
CSS
JS / jQuery
quelle
attr()
außer incontent
ist wirklich knapp. Sie können caniuse.com darauf überprüfen.:root
und die Unterstützung von CSS-Variablen ist besser, aber noch nicht so weit verbreitet, da die Unterstützung dafür ziemlich neu ist. (Überprüfen Sie auch den Support auf caniuse.com)Ich habe ein jQuery-Plugin erstellt, um CSS-Pseudoregeln hinzuzufügen, wie sie
.css()
für bestimmte Elemente verwendet werden.Verwendungszweck:
quelle
quelle
Sie können mein Plugin für diesen Zweck verwenden.
JQuery:
Die Werte sollten wie in der normalen Funktion von jQuery.css angegeben werden
Darüber hinaus können Sie auch den Wert des Pseudoelementparameters abrufen, wie in der normalen Funktion von jQuery.css:
JS:
Code-Snippet anzeigen
GitHub: https://github.com/yuri-spivak/managing-the-properties-of-pseudo-elements/
quelle
Jemand anderes hat das Anhängen an das head-Element mit einem vollständigen Stilelement kommentiert. Das ist nicht schlecht, wenn Sie es nur einmal ausführen, aber wenn Sie es mehr als einmal zurücksetzen müssen, erhalten Sie eine Menge Stilelemente. Um zu verhindern, dass ich ein leeres Stilelement im Kopf durch eine ID erstellt und das innerHTML davon wie folgt ersetzt habe:
Dann würde das JavaScript so aussehen:
In meinem Fall brauchte ich dies, um die Höhe eines Vorher-Elements basierend auf der Höhe eines anderen Elements festzulegen. Die Größe ändert sich beim Ändern der Größe, sodass ich sie
setHeight()
jedes Mal ausführen kann, wenn die Größe des Fensters geändert wird, und das ersetzt<style>
ordnungsgemäß ersetzt wird.Ich hoffe, das hilft jemandem, der feststeckte und versuchte, dasselbe zu tun.
quelle
Ich habe etwas anderes für dich, das einfach und effektiv ist.
quelle