J'ai un div
qui a background:transparent
, avec border
. En dessous div
, j'ai plus d'éléments.
Actuellement, je peux cliquer sur les éléments sous-jacents lorsque je clique en dehors de la superposition div
. Cependant, je ne peux pas cliquer sur les éléments sous-jacents lorsque je clique directement sur la superposition div
.
Je veux pouvoir cliquer dessus div
pour pouvoir cliquer sur les éléments sous-jacents.
Aussi agréable à savoir ...
Vous pouvez désactiver les événements de pointeur dans un élément parent (probablement un div transparent) mais le garder activé pour ses éléments enfants.
Cela est utile si vous travaillez avec plusieurs calques div qui se chevauchent, où vous voulez pouvoir cliquer sur les éléments enfants, tout en ne faisant réagir les calques parents sur aucun événement de souris.
Pour cela, tous les divs parentaux obtiennent
pointer-events: none
et ses enfants cliquables reçoivent des événements de pointeur réactivés parpointer-events: auto
la source
Autoriser l'utilisateur à cliquer sur un
div
élément sous-jacent dépend du navigateur. Tous les navigateurs modernes, y compris Firefox, Chrome, Safari et Opera, comprennentpointer-events:none
.Pour IE, cela dépend de l'arrière-plan. Si l'arrière-plan est transparent, le clic fonctionne sans que vous ayez besoin de faire quoi que ce soit. D'un autre côté, pour quelque chose comme
background:white; opacity:0; filter:Alpha(opacity=0);
, IE a besoin d'un transfert d'événement manuel.Voir un test JSFiddle et des événements de pointeur CanIUse .
la source
J'ajoute cette réponse parce que je ne l'ai pas vue ici en entier. J'ai pu le faire en utilisant elementFromPoint. Donc en gros:
Dans mon cas, le div superposé est absolument positionné - je ne sais pas si cela fait une différence. Cela fonctionne sur IE8 / 9, Safari Chrome et Firefox au moins.
la source
la source
$('#elementontop)
devrait peut -être l'être$('#elementontop')
?J'avais besoin de le faire et j'ai décidé d'emprunter cette voie:
la source
Je travaille actuellement avec des ballons de discours en toile. Mais comme le ballon avec le pointeur est enveloppé dans un div, certains liens en dessous ne sont plus capables de cliquer. Je ne peux pas utiliser extjs dans ce cas. Voir l'exemple de base pour mon tutoriel de bulle de discours nécessite HTML5
J'ai donc décidé de collecter toutes les coordonnées du lien à l'intérieur des ballons dans un tableau.
J'appelle cette fonction sur chaque (nouveau) ballon. Il saisit les coordonnées des coins gauche / haut et droit / bas d'un link.class - en plus l'attribut de nom pour quoi faire si quelqu'un clique sur ces coordonnées et j'ai adoré définir un 1 ce qui signifie qu'il n'a pas été cliqué sur jet . Et décompressez ce tableau dans le tableau de clics. Vous pouvez également utiliser push.
Pour travailler avec ce tableau:
Cette fonction vérifie les coordonnées d'un événement de clic de corps ou s'il a déjà été cliqué et renvoie l'attribut de nom. Je pense qu'il n'est pas nécessaire d'aller plus loin, mais vous voyez que ce n'est pas si compliqué. L'espoir était enlish ...
la source
cela ne fonctionne pas de cette façon. la solution consiste à vérifier manuellement les coordonnées du clic de la souris par rapport à la zone occupée par chaque élément.
la zone occupée par un élément peut être trouvée en 1. obtenant l'emplacement de l'élément par rapport au coin supérieur gauche de la page, et 2. la largeur et la hauteur. une bibliothèque comme jQuery rend cela assez simple, bien que cela puisse être fait en js ordinaire. l'ajout d'un gestionnaire d'événements
mousemove
sur l'document
objet fournira des mises à jour continues de la position de la souris en haut et à gauche de la page. décider si la souris se trouve sur un objet donné consiste à vérifier si la position de la souris se situe entre les bords gauche, droit, supérieur et inférieur d'un élément.la source
Non, vous ne pouvez pas cliquer sur un élément. Vous pouvez obtenir les coordonnées du clic et essayer de déterminer quel élément se trouvait sous l'élément cliqué, mais cela est vraiment fastidieux pour les navigateurs qui n'en ont pas
document.elementFromPoint
. Ensuite, vous devez toujours émuler l'action par défaut de cliquer, ce qui n'est pas nécessairement trivial selon les éléments que vous avez en dessous.Étant donné que vous avez une zone de fenêtre entièrement transparente, vous feriez probablement mieux de l'implémenter en tant qu'éléments de bordure séparés autour de l'extérieur, laissant la zone centrale libre de toute obstruction afin que vous puissiez vraiment simplement cliquer directement.
la source
Une autre idée à essayer (situationnellement) serait de:
Des pensées?
la source
Je pense que vous pouvez envisager de modifier votre balisage. Si je ne me trompe pas, vous souhaitez mettre un calque invisible au-dessus du document et votre balisage invisible peut précéder l'image de votre document (est-ce correct?).
Au lieu de cela, je vous propose de mettre l'invisible juste après l'image du document mais en changeant la position en absolu.
Notez que vous avez besoin d'un élément parent pour avoir position: relative et vous pourrez ensuite utiliser cette idée. Sinon, votre couche absolue sera placée juste dans le coin supérieur gauche.
J'espère que cela t'aides. Voir ici pour plus d'informations sur le positionnement CSS.
la source
Il suffit d'enrouler la
a
balise autour de tous les extraits HTML, par exempledans mon exemple, ma classe de sous-titres a des effets de survol, avec des événements de pointeur: aucun; tu vas juste perdre
Envelopper le contenu gardera vos effets de survol et vous pouvez cliquer sur toute l'image, div incluse, salut!
la source
Vous pouvez placer une superposition AP comme ...
il suffit de le mettre là où vous ne voulez pas, c'est-à-dire cliked. Fonctionne en tout.
la source
Un moyen plus simple consisterait à aligner l'image d'arrière-plan transparente à l'aide des URI de données comme suit:
la source
Je pense que le
event.stopPropagation();
devrait également être mentionné ici. Ajoutez ceci à la fonction Click de votre bouton.Empêche l'événement de se propager dans l'arborescence DOM, empêchant les gestionnaires parents d'être notifiés de l'événement.
la source
Ce n'est pas une réponse précise à la question, mais peut aider à trouver une solution de contournement.
J'avais une image que je cachais lors du chargement de la page et que j'affichais lorsque j'attendais un appel AJAX puis que je me cachais à nouveau cependant ...
J'ai trouvé le seul moyen d'afficher mon image lors du chargement de la page, puis de la faire disparaître et de pouvoir cliquer sur les éléments où l'image se trouvait avant de la cacher, c'était de mettre l'image dans un DIV, de faire la taille du DIV 10x10 pixels ou petit assez pour l'empêcher de provoquer un problème, puis masquer le div contenant. Cela a permis à l'image de déborder de la div lorsqu'elle était visible et lorsque la div était cachée, seule la zone des div était affectée par l'impossibilité de cliquer sur les objets en dessous et non par toute la taille de l'image que la DIV contenait et affichait.
J'ai essayé toutes les méthodes pour masquer l'image, y compris CSS display = none / block, opacity = 0, cachant l'image avec hidden = true. Tous ont entraîné la dissimulation de mon image, mais la zone où elle était affichée pour agir comme s'il y avait une couverture sur le truc en dessous, donc les clics et ainsi de suite n'agiraient pas sur les objets sous-jacents. Une fois que l'image était à l'intérieur d'un minuscule DIV et que j'ai caché le minuscule DIV, toute la zone occupée par l'image était claire et seule la minuscule zone sous le DIV que j'ai cachée a été affectée mais comme je l'ai rendue suffisamment petite (10x10 pixels), le problème a été corrigé (en quelque sorte).
J'ai trouvé que c'était une solution de contournement pour ce qui devrait être un problème simple, mais je n'ai pas trouvé de moyen de masquer l'objet dans son format natif sans conteneur. Mon objet était sous la forme de etc. Si quelqu'un a une meilleure solution, faites-le moi savoir.
la source