Mein Code lautet:
p {
position: relative;
background-color: blue;
}
p:before {
content: '';
position: absolute;
left:100%;
width: 10px;
height: 100%;
background-color: red;
}
Bitte sehen Sie diese Geige: http://jsfiddle.net/ZWw3Z/5/
Ich möchte ein Klickereignis nur für das Pseudoelement (das rote Bit) auslösen. Das heißt, ich möchte nicht, dass das Klickereignis auf dem blauen Bit ausgelöst wird.
javascript
jquery
css
Zufälliges Blau
quelle
quelle
Antworten:
Das ist nicht möglich; Pseudoelemente sind überhaupt nicht Teil des DOM, daher können Sie keine Ereignisse direkt an sie binden, sondern nur an ihre übergeordneten Elemente.
Wenn Sie nur einen Klick-Handler für den roten Bereich haben müssen, müssen Sie ein untergeordnetes Element wie a
span
erstellen, es direkt nach dem öffnenden<p>
Tag platzieren, Stile aufp span
anstelle von anwendenp:before
und daran binden.quelle
pointer-events
Werten für das Element selbst und sein Pseudoelement möglich istpointer-events
Laut dem von Ilya geposteten jsfiddel scheint der Trick für IE9 nicht zu funktionieren.Eigentlich ist es möglich. Sie können überprüfen, ob sich die angeklickte Position außerhalb des Elements befand, da dies nur geschieht, wenn
::before
oder::after
geklickt wurde.In diesem Beispiel wird nur das Element rechts überprüft, dies sollte jedoch in Ihrem Fall funktionieren.
JSFiddle
quelle
:after
, überprüfen,if (e.clientX > span.offsetLeft + span.offsetHeight)
da diese Browser nicht über diee.offsetX
Eigenschaft verfügen . Geige: jsfiddle.net/Noitidart/wC2p7/18$('a:after').on('click', fn)
aber ich sehe das nicht wirklich: p::before
oder::after
innerhalb des Elements positioniert ist.In modernen Browsern können Sie es mit der Eigenschaft css für Zeigerereignisse versuchen (dies führt jedoch dazu, dass Mausereignisse auf dem übergeordneten Knoten nicht erkannt werden können):
Wenn das Ereignisziel Ihr "p" -Element ist, wissen Sie, dass es Ihr "p: before" ist.
Wenn Sie weiterhin Mausereignisse auf dem Haupt-P erkennen müssen, können Sie die Möglichkeit in Betracht ziehen, Ihre HTML-Struktur zu ändern. Sie können ein Span- Tag und den folgenden Stil hinzufügen :
Die Ereignisziele sind jetzt sowohl die Elemente "span" als auch "p: before".
Beispiel ohne jquery: http://jsfiddle.net/2nsptvcu/
Beispiel mit jquery: http://jsfiddle.net/0vygmnnb/
Hier ist die Liste der Browser, die Zeigerereignisse unterstützen: http://caniuse.com/#feat=pointer-events
quelle
Meine Antwort funktioniert für alle, die auf einen bestimmten Bereich der Seite klicken möchten. Das hat bei mir auf meiner absolut positionierten: nachher funktioniert
Dank dieses Artikels wurde mir klar, dass ich (mit jQuery) verwenden kann
e.pageY
unde.pageX
anstatt mir Sorgen ume.offsetY/X
unde.clientY/X
Probleme zwischen Browsern zu machen.Ich mochte diese
event.pageY
Idee, weil sie immer dieselbe sein würde, da sie relativ zum Dokument war . Ich kann es mit dem übergeordneten Element von my: after mit offset () vergleichen, das sein X und Y auch relativ zum Dokument zurückgibt.Daher kann ich auf der gesamten Seite eine Reihe von "anklickbaren" Regionen erstellen, die sich nie ändern.
Hier ist meine Demo zum Codepen .
oder wenn zu faul für Codepen, hier ist die JS:
* Ich habe mich nur um die Y-Werte für mein Beispiel gekümmert.
quelle
Das funktioniert bei mir:
quelle
Kurze Antwort:
Ich hab es gemacht. Ich habe eine Funktion für den dynamischen Gebrauch für all die kleinen Leute da draußen geschrieben ...
Arbeitsbeispiel, das auf der Seite angezeigt wird
Arbeitsbeispiel Protokollierung an der Konsole
Lange Antwort:
... hat es immer noch getan.
Ich habe eine Weile dafür gebraucht, da ein Pseudo-Element nicht wirklich auf der Seite ist. Während einige der obigen Antworten in EINIGEN Szenarien funktionieren, sind ALLE nicht dynamisch und funktionieren in einem Szenario, in dem ein Element sowohl in Größe als auch in Position unerwartet ist (z. B. absolut positionierte Elemente, die einen Teil des übergeordneten Elements überlagern). Meins nicht.
Verwendung:
Wie es funktioniert:
Es erfasst die Positionen Höhe, Breite, oben und links (basierend auf der Position vom Rand des Fensters entfernt) des übergeordneten Elements und erfasst die Positionen Höhe, Breite, oben und links (basierend auf der Kante des übergeordneten Containers) ) und vergleicht diese Werte, um festzustellen, wo sich das Pseudo-Element auf dem Bildschirm befindet.
Anschließend wird verglichen, wo sich die Maus befindet. Solange sich die Maus im neu erstellten Variablenbereich befindet, wird true zurückgegeben.
Hinweis:
Es ist ratsam, das übergeordnete Element RELATIV zu positionieren. Wenn Sie ein absolut positioniertes Pseudo-Element haben, funktioniert diese Funktion nur, wenn es basierend auf den Abmessungen des Elternteils positioniert ist (also muss das Elternteil relativ sein ... vielleicht würde auch klebrig oder fest funktionieren ... ich weiß nicht).
Code:
Unterstützung:
Ich weiß nicht ... es sieht so aus, als wäre es dumm und gibt manchmal gerne Auto als berechneten Wert zurück. Es scheint in allen Browsern gut zu funktionieren, wenn die Abmessungen in CSS festgelegt sind. Also ... stellen Sie Ihre Höhe und Breite auf Ihre Pseudo-Elemente ein und verschieben Sie sie nur nach oben und links. Ich empfehle es für Dinge zu verwenden, bei denen Sie damit einverstanden sind, dass es nicht funktioniert. Wie eine Animation oder so. Chrome funktioniert ... wie gewohnt.
quelle
event
wird jedes Mal, wenn ein Ereignis ausgelöst wird, durch eine Ereignishandlerfunktion geleitet. Wie klicken oder tippen. Wenn wir die.click()
Funktion verwenden, warten wir auf das Klickereignis. Wir könnten spezifizieren und sagen.click(function(e){...})
, dass ein Ereignis sein soll,e
aber es ist auch akzeptabel, es nur zu verwendenevent
.event
undefiniert ist.event
undefiniert ist. Es funktioniert jedoch in Chrome und Edge.Fügen Sie im Click-Ereignis eine Bedingung hinzu, um den anklickbaren Bereich einzuschränken.
DEMO
quelle
Dies ist eine bearbeitete Antwort von Fasoeu mit den neuesten CSS3 und JS ES6
Demo ohne Verwendung von JQuery bearbeitet .
Kürzestes Beispiel für Code:
Erläuterung:
pointer-events
Steuern Sie die Erkennung von Ereignissen, entfernen Sie empfangende Ereignisse vom Ziel, aber empfangen Sie weiterhin von Pseudoelementen. Klicken Sie auf::before
und::after
Sie werden immer wissen, was Sie auf Pseudoelemente klicken. Wenn Sie jedoch noch klicken müssen, fügen Sie den gesamten Inhalt ein in verschachtelten Elementen (span
im Beispiel), aber da wir keine zusätzlichen Stile anwenden möchten,display: contents;
werden Sie zu einer sehr praktischen Lösung, die von den meisten Browsern unterstützt wird .pointer-events: none;
wie bereits in Original - Beitrag erwähnt auch allgemein unterstützt .Der JavaScript-Teil wird ebenfalls weitgehend unterstützt
Array.from
undfor...of
muss jedoch nicht im Code verwendet werden.quelle
Keine dieser Antworten ist zuverlässig, und meine wird nicht viel zuverlässiger sein.
Abgesehen von den Vorsichtsmaßnahmen, wenn Sie in das glückliche Szenario geraten, in dem das Element, auf das Sie klicken möchten, nicht aufgefüllt ist (so dass der gesamte "innere" Raum des Elements vollständig von Unterelementen bedeckt ist), dann sind Sie es kann das Ziel des Klickereignisses mit dem Container selbst vergleichen. Wenn es übereinstimmt, bedeutet dies, dass Sie auf ein: vor oder: nach Element geklickt haben.
Natürlich wäre dies mit beiden Typen (vorher und nachher) nicht möglich, aber ich habe es als Hack / Speed-Fix implementiert und es funktioniert sehr gut, ohne eine Reihe von Positionsprüfungen, die abhängig von etwa einer Million verschiedener Faktoren ungenau sein können .
quelle
Nein, aber so kannst du es machen
Fügen Sie in der HTML-Datei diesen Abschnitt hinzu
In CSS können Sie dies tun
} Hoffe es wird dir helfen
quelle