Mon code est:
p {
position: relative;
background-color: blue;
}
p:before {
content: '';
position: absolute;
left:100%;
width: 10px;
height: 100%;
background-color: red;
}
Veuillez voir ce violon: http://jsfiddle.net/ZWw3Z/5/
Je voudrais déclencher un événement de clic uniquement sur le pseudo-élément (le bit rouge). Autrement dit, je ne veux pas que l'événement click soit déclenché sur le bit bleu.
javascript
jquery
css
Randomblue
la source
la source
Réponses:
Ce n'est pas possible; les pseudo-éléments ne font pas du tout partie du DOM, vous ne pouvez donc pas leur lier directement des événements, vous ne pouvez les lier qu'à leurs éléments parents.
Si vous ne devez avoir un gestionnaire de clic que sur la région rouge, vous devez créer un élément enfant, comme un
span
, le placer juste après la<p>
balise d' ouverture , appliquer des styles à lap span
place dep:before
, et y lier.la source
pointer-events
valeurs pour l'élément lui-même et son pseudo-élément: jsfiddle.net/ZWw3Z/70pointer-events
ne semble pas faire l'affaire pour IE9, selon le jsfiddel que Ilya a publié.En fait, c'est possible. Vous pouvez vérifier si la position cliquée était en dehors de l'élément, car cela ne se produira que si
::before
ou::after
été cliqué.Cet exemple vérifie uniquement l'élément à droite, mais cela devrait fonctionner dans votre cas.
JSFiddle
la source
:after
vous passez la souris, vous devez vérifierif (e.clientX > span.offsetLeft + span.offsetHeight)
que ces navigateurs n'ont pas lae.offsetX
propriété. Violon: jsfiddle.net/Noitidart/wC2p7/18$('a:after').on('click', fn)
mais je ne vois pas vraiment ce qui se passe: p::before
ou::after
est positionné à l'intérieur de l'élément.Sur les navigateurs modernes, vous pouvez essayer avec la propriété css pointer-events (mais cela conduit à l'impossibilité de détecter les événements de souris sur le nœud parent):
Lorsque la cible de l'événement est votre élément "p", vous savez que c'est votre "p: avant".
Si vous avez encore besoin de détecter des événements de souris sur le p principal, vous pouvez envisager la possibilité de modifier votre structure HTML. Vous pouvez ajouter une balise span et le style suivant:
Les cibles d'événement sont désormais les éléments "span" et "p: before".
Exemple sans jquery: http://jsfiddle.net/2nsptvcu/
Exemple avec jquery: http://jsfiddle.net/0vygmnnb/
Voici la liste des navigateurs prenant en charge les événements de pointeur: http://caniuse.com/#feat=pointer-events
la source
Ma réponse fonctionnera pour tous ceux qui souhaitent cliquer sur une zone définitive de la page. Cela a fonctionné pour moi sur mon positionnement absolu: après
Grâce à cet article , j'ai réalisé (avec jQuery) que je peux utiliser
e.pageY
ete.pageX
au lieu de m'inquiétere.offsetY/X
et dee.clientY/X
passer d'un navigateur à l'autre.J'ai aimé cette
event.pageY
idée car elle serait toujours la même, car elle était relative au document . Je peux le comparer à l'élément parent de my: after en utilisant offset (), qui renvoie ses X et Y également par rapport au document.Par conséquent, je peux proposer une gamme de régions "cliquables" sur la page entière qui ne change jamais.
Voici ma démo sur codepen .
ou si trop paresseux pour codepen, voici le JS:
* Je ne me souciais que des valeurs Y pour mon exemple.
la source
Cela fonctionne pour moi:
la source
Réponse courte:
Je l'ai fait. J'ai écrit une fonction pour une utilisation dynamique pour tous les petits gens là-bas ...
Exemple de travail qui s'affiche sur la page
Exemple de travail de connexion à la console
Longue réponse:
... Je l'ai toujours fait.
Il m'a fallu un certain temps pour le faire, car un élément pseudo n'est pas vraiment sur la page. Bien que certaines des réponses ci-dessus fonctionnent dans CERTAINS scénarios, elles ne parviennent PAS toutes à la fois à être dynamiques et à fonctionner dans un scénario dans lequel un élément est à la fois inattendu en taille et en position (comme des éléments positionnés en absolu superposant une partie de l'élément parent). La mienne non.
Usage:
Comment ça fonctionne:
Il saisit la hauteur, la largeur, le haut et la gauche (en fonction de la position éloignée du bord de la fenêtre) de l'élément parent et saisit la hauteur, la largeur, le haut et la gauche (en fonction du bord du conteneur parent) ) et compare ces valeurs pour déterminer où se trouve l'élément pseudo à l'écran.
Il compare ensuite où se trouve la souris. Tant que la souris se trouve dans la plage de variables nouvellement créée, elle renvoie true.
Remarque:
Il est judicieux de positionner l'élément parent RELATIVE. Si vous avez un élément psuedo positionné en absolu, cette fonction ne fonctionnera que si elle est positionnée en fonction des dimensions du parent (donc le parent doit être relatif ... peut-être collant ou fixe fonctionnerait aussi ... je ne sais pas).
Code:
Soutien:
Je ne sais pas .... on dirait que c'est stupide et aime parfois retourner auto comme valeur calculée parfois. IL SEMBLE BIEN FONCTIONNER DANS TOUS LES NAVIGATEURS SI LES DIMENSIONS SONT RÉGLÉES EN CSS. Alors ... réglez votre hauteur et votre largeur sur vos éléments de pédale et déplacez-les uniquement en haut et à gauche. Je recommande de l'utiliser sur des choses qui ne vous conviennent pas. Comme une animation ou quelque chose. Chrome fonctionne ... comme d'habitude.
la source
event
est transmis via une fonction de gestionnaire d'événements chaque fois qu'un événement est déclenché. Comme cliquer ou taper. Lorsque nous utilisons la.click()
fonction, nous attendons l'événement click. Nous pourrions spécifier et dire.click(function(e){...})
que l'événement doit être,e
mais il est également acceptable de simplement l'utiliserevent
.event
n'est pas défini.event
n'est pas défini. Cela fonctionne cependant dans Chrome et Edge.Ajoutez une condition dans l'événement Click pour restreindre la zone cliquable.
DEMO
la source
Ceci est la réponse éditée par Fasoeu avec les derniers CSS3 et JS ES6
Démo éditée sans utiliser JQuery.
Exemple de code le plus court:
Explication:
pointer-events
contrôler la détection des événements, supprimer les événements de réception de la cible, mais continuer à recevoir des pseudo-éléments permet de cliquer sur::before
et::after
vous saurez toujours sur quoi vous cliquez sur le pseudo-élément, mais si vous devez toujours cliquer, vous mettez tout le contenu dans un élément imbriqué (span
dans l'exemple), mais parce que nous ne voulons pas appliquer de styles supplémentaires,display: contents;
devenez une solution très pratique et prise en charge par la plupart des navigateurs .pointer-events: none;
comme déjà mentionné dans le message d'origine également largement pris en charge .La partie JavaScript est également largement utilisée
Array.from
etfor...of
n'est cependant pas nécessaire à utiliser dans le code.la source
Aucune de ces réponses n'est fiable et la mienne ne sera pas beaucoup plus fiable.
Mises en garde de côté, si vous entrez dans le scénario chanceux où l'élément sur lequel vous essayez de cliquer n'a pas de remplissage (de sorte que tout l'espace "intérieur" de l'élément est complètement couvert par des sous-éléments), alors vous peut comparer la cible de l'événement click au conteneur lui-même. S'il correspond, cela signifie que vous avez cliqué sur un élément: avant ou: après.
Évidemment, cela ne serait pas possible avec les deux types (avant et après), mais je l'ai implémenté comme un hack / speed fix et cela fonctionne très bien, sans un tas de vérification de position, ce qui peut être inexact en fonction d'environ un million de facteurs différents .
la source
Non, mais tu peux faire comme ça
Dans le fichier html ajoutez cette section
En CSS, vous pouvez faire comme ça
} J'espère que cela vous aidera
la source