Ich versuche, das :after
CSS-Pseudoelement für ein input
Feld zu verwenden, aber es funktioniert nicht. Wenn ich es mit a benutze span
, funktioniert es OK.
<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>
Dies funktioniert (setzt den Smiley nach "buu!" Und vor "etwas mehr")
<span class="mystyle">buuu!</span>a some more
Dies funktioniert nicht - es färbt nur someValue in Rot, aber es gibt keinen Smiley.
<input class="mystyle" type="text" value="someValue">
Was mache ich falsch? soll ich einen anderen Pseudo-Selektor verwenden?
Hinweis: Ich kann keine span
um meine herum hinzufügen input
, da diese von einem Steuerelement eines Drittanbieters generiert wird.
html
css
pseudo-element
css-content
Matra
quelle
quelle
border-color
von zu änderninput
. Ich finde es aufmerksamkeitsstarker.Antworten:
:after
und:before
werden in Internet Explorer 7 und darunter für keine Elemente unterstützt.Es ist auch nicht für ersetzte Elemente wie Formularelemente (Eingaben) und Bildelemente vorgesehen .
Mit anderen Worten, mit reinem CSS ist das unmöglich .
Wenn Sie jedoch jquery verwenden , können Sie verwenden
API-Dokumente auf .after
Zum Anhängen Ihrer Inhalte mit Javascript. Dies funktioniert in allen Browsern.
quelle
:after
im Allgemeinen, obwohl es weder:before
noch:after
Eingaben unterstützt.:after
und:before
Pseudo-Elemente verstehe , können sie nur auf Container-Elemente gesetzt werden. Warum? Weil sie innerhalb dieses bestimmten Elements angehängt werden .input
ist kein Container.button
Zum Beispiel können Sie sie daher anziehen. Funktioniert wie erwartet. Die Spezifikation sagt tatsächlich: vor und nach dem Dokumentbauminhalt eines Elements. Sie sagt ausdrücklich INHALT . Ein Element muss also ein Container sein.:before
und:after
in einem Container rendernund <Eingabe> darf keine anderen Elemente enthalten.
Pseudoelemente können nur auf Containerelementen definiert werden (oder besser gesagt nur unterstützt werden). Weil die Art und Weise, wie sie gerendert werden, als untergeordnetes Element im Container selbst liegt.
input
kann keine anderen Elemente enthalten, daher werden sie nicht unterstützt. Einbutton
Formularelement, das auch ein Formularelement ist, unterstützt sie, da es sich um einen Container mit anderen Unterelementen handelt.Wenn Sie mich fragen, ob einige Browser tut diese beiden Pseudo-Elemente auf Nicht-Container - Elemente angezeigt werden , ist es ein Fehler und ein Nicht-Standard - Konformität. Die Spezifikation spricht direkt über den Elementinhalt ...
W3C-Spezifikation
Wenn wir die Spezifikation sorgfältig lesen, heißt es tatsächlich, dass sie in ein enthaltendes Element eingefügt werden :
Sehen? ein Dokumentenbaum des Elements Inhalt . So wie ich es verstehe, bedeutet dies innerhalb eines Containers.
quelle
[required]::before { content "*"; color: red; }
: P<input type="submit" value="Send"/>
, verwenden Sie<button type="submit">Send</button>
stattdessen. Die Präsentation ist identisch, aber das<button>
ist ein Container und unterstützt:before
und:after
.<hr />
? Ich dachte, es sei kein Containerelement, aber es könnte rendern:after
und:before
jsfiddle.net/Uf88j/1p
undh1
befindet sich der Inhalt innerhalb des Tags, sodass auch Vorher / Nachher im Tag angezeigt wird. Mit Elementen wieinput
undhr
,: vor und: nach würde immer noch vor oder nach dem Inhalt erscheinen, aber es ist kein Container beteiligt (speziell fürinput
). Eingabe: markiert: Vorher wird häufig verwendet, um Kontrollkästchen anzuzeigen, die über CSS aktiviert werden.Seltsamerweise funktioniert es mit einigen Arten von Eingaben. Zumindest in Chrome,
funktioniert gut, genauso wie
Es ist nur
type=text
und einige andere, die nicht funktionieren.quelle
Hier ist ein anderer Ansatz (vorausgesetzt, Sie haben die Kontrolle über den HTML-Code): Fügen Sie
<span></span>
direkt nach der Eingabe ein Leerzeichen hinzu und zielen Sie darauf ab, dass in CSSinput.mystyle + span:after
Ich verwende diesen Ansatz in AngularJS, da
.ng-invalid
Klassen automatisch zu<input>
Formularelementen und zum Formular hinzugefügt werden , nicht jedoch zum<label>
.quelle
input:hover+span:after{color: blue}
. Upvote.:before
und:after
werden in einem Container angewendet, dh Sie können ihn für Elemente mit einem End-Tag verwenden.Nebenbei bemerkt, Elemente, die sich selbst schließen (wie z. B. img / hr / input), werden auch als "Ersetzte Elemente" bezeichnet, da sie durch ihren jeweiligen Inhalt ersetzt werden. "Externe Objekte" für das Fehlen eines besseren Begriffs. Eine bessere Lektüre hier
quelle
Ich habe das verwendet
background-image
, um den roten Punkt für die erforderlichen Felder zu erstellen.Blick auf Codepen
quelle
Sie können kein Pseudoelement in ein Eingabeelement einfügen, sondern ein Schattenelement wie einen Platzhalter!
Um es in anderen Browsern verwenden arbeiten
:-moz-placeholder
,::-moz-placeholder
und:-ms-input-placeholder
in verschiedenen Selektoren . Die Selektoren können nicht gruppiert werden, da der Selektor die gesamte Anweisung ungültig macht, wenn ein Browser sie nicht erkennt.UPDATE : Der obige Code funktioniert nur mit CSS-Vorprozessoren (SASS, WENIGER ...), ohne dass Vorprozessoren Folgendes verwenden:
quelle
glyphicon-search
Markup anzeigen wollten, ohne es zu berühren.Pseudoelemente wie
:after
,:before
sind nur für Containerelemente. Elemente, die an einer einzelnen Stelle wie usw. beginnen und schließen<input/>
,<img>
sind keine Containerelemente, und daher werden Pseudoelemente nicht unterstützt. Wenn Sie ein Pseudoelement auf ein Containerelement wie anwenden<div>
und den Code überprüfen (siehe Bild), können Sie verstehen, was ich meine. Tatsächlich wird das Pseudoelement innerhalb des Containerelements erstellt. Dies ist bei<input>
oder nicht möglich<img>
quelle
Eine funktionierende Lösung in reinem CSS:
Der Trick besteht darin, anzunehmen, dass nach dem Textfeld ein dom-Element steht.
(*) Begrenzte Lösung:
In den meisten Fällen kennen wir unseren Code, sodass diese Lösung effizient und zu 100% aus CSS und zu 0% aus jQuery besteht.
quelle
input#myTextField ~ span:before {
viel besser, aber span sollte eine Klasse haben, um wirklich expliziter zu sein wie.tick
oder.icon
Ich fand diesen Beitrag, da ich das gleiche Problem hatte. Dies war die Lösung, die für mich funktioniert hat. Im Gegensatz zum Ersetzen des Eingabewerts entfernen Sie ihn einfach und positionieren absolut einen Bereich dahinter, der dieselbe Größe hat. Auf den Bereich kann eine
:before
Pseudoklasse mit der Symbolschrift Ihrer Wahl angewendet werden.quelle
Das größte Missverständnis hier ist die Bedeutung der Wörter
before
undafter
. Sie beziehen sich nicht auf das Element selbst, sondern auf den Inhalt des Elements. Istelement:before
also vor dem Inhalt undelement:after
ist nach dem Inhalt, aber beide befinden sich immer noch im ursprünglichen Element.Das
input
Element hat keinen Inhalt in der CSS-Ansicht und daher keinen:before
oder:after
Pseudoinhalt. Dies gilt für viele andere leere oder ersetzte Elemente.Es gibt kein Pseudoelement, das sich außerhalb des Elements bezieht .
In einem anderen Universum könnten diese Pseudoelemente etwas anderes genannt worden sein, um diese Unterscheidung klarer zu machen. Und vielleicht hat jemand sogar ein Pseudoelement vorgeschlagen, das wirklich außerhalb des Elements liegt. Bisher ist dies in diesem Universum nicht der Fall.
quelle
hr
war aus CSS-Sicht immer mehrdeutig, obwohl Sie dies eher in der Diskussion über Farben sehen.Gemäß einem Hinweis in der CSS 2.1-Spezifikation definiert die Spezifikation „die Interaktion von: vorher und: nachher mit ersetzten Elementen (wie IMG in HTML) nicht vollständig. Dies wird in einer zukünftigen Spezifikation genauer definiert. “ Obwohl
input
es sich nicht mehr wirklich um ein ersetztes Element handelt, hat sich die Grundsituation nicht geändert: Die Auswirkung von:before
und:after
auf sie ist nicht spezifiziert und hat im Allgemeinen keine Auswirkung.Die Lösung besteht darin, einen anderen Ansatz für das Problem zu finden, das Sie auf diese Weise angehen möchten. Das Einfügen von generiertem Inhalt in ein Texteingabesteuerelement wäre sehr irreführend: Für den Benutzer scheint es Teil des Anfangswertes im Steuerelement zu sein, es kann jedoch nicht geändert werden. Es scheint also etwas zu sein, das zu Beginn des Steuerelements erzwungen wurde Kontrolle, aber es würde nicht als Teil der Formulardaten übermittelt.
quelle
input
Elemente zu verwenden, nur nicht spezifiziert und browserabhängig.Wie andere erklärt,
input
sind s irgendwie-ersetzt Leere Elemente, so werden die meisten Browser erlauben nicht , dass Sie zu generieren::before
noch::after
pseudo-Elemente in ihnen.Allerdings ist die CSS - Arbeitsgruppe unter Berücksichtigung ausdrücklich erlaubt
::before
und::after
falls dasinput
hatappearance: none
.Von https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,
quelle
versuchen Sie es als nächstes:
quelle
Sie müssen eine Art Wrapper um die Eingabe haben, um ein Vorher- oder Nachher-Pseudoelement zu verwenden. Hier ist eine Geige, die ein Vorher auf dem Wrapper-Div einer Eingabe hat und dann das Vorher in die Eingabe einfügt - oder zumindest so aussieht. Offensichtlich ist dies eine Problemumgehung, aber zur Not effektiv und eignet sich für die Reaktion. Sie können dies leicht zu einem After machen, wenn Sie andere Inhalte einfügen müssen.
Geige arbeiten
Dollarzeichen in einer Eingabe als Pseudoelement : http://jsfiddle.net/kapunahele/ose4r8uj/1/
Der HTML:
Das CSS:
quelle
Wenn Sie versuchen, ein Eingabeelement mit: vor und: nach zu formatieren, versuchen Sie wahrscheinlich, die Auswirkungen anderer Bereiche, Bereiche oder sogar Elemente in Ihrem CSS-Stapel nachzuahmen.
In der Antwort von Robert Koritnik heißt es: Vorher und Nachher können nur auf Containerelemente angewendet werden, und Eingabeelemente sind keine Container.
In HTML 5 wurde jedoch das Schaltflächenelement eingeführt , das ein Container ist und sich wie ein Eingabeelement [type = "submit | reset"] verhält.
quelle
Zusammenfassung
Es funktioniert nicht mit
<input type="button">
, aber es funktioniert gut mit<input type="checkbox">
.Geige : http://jsfiddle.net/gb2wY/50/
HTML :
CSS :
quelle
:before
und:after
funktioniert nur für Knoten, die untergeordnete Knoten haben können, da sie einen neuen Knoten als ersten oder letzten Knoten einfügen.quelle
Ich habe festgestellt, dass Sie es so machen können:
Code-Snippet anzeigen
Sie benötigen ein div-Elternteil, das die Auffüllung und das: after übernimmt. Das erste übergeordnete Element muss relativ sein und das zweite div sollte absolut sein, damit Sie die Position des After festlegen können.
quelle
Ich habe eine andere Idee, stattdessen dies zu verwenden:
quelle