最近项目中遇到点击一个图标执行某些操做的功能,原本很简单就能实现,但图标倒是::after
伪元素实现的,在印象中好像不能直接对伪元素进行dom
操做,可项目中有全部页面都是经过伪元素来展现图标的,将全部页面中图标改为DOM
元素也不太可行。
在网上查了下,大部分都是介绍经过event
对象获取鼠标指针坐标的方式判断点击的区域是否为伪元素所在的区域,但这很烦麻烦。
下面整理出几种简便方式实现 click
伪元素时进行事件处理,附上例子代码。html
首先 HTML 结构是这样的dom
<section> <span>按钮文字</span> </section>
经过CSS3
的pointer-events
特性来实现。
CSS 代码url
<style> *{margin: 0; padding:0;} section{ border: 1px solid #abc; border-radius: 5px; background-color: #def; font-family: Microsoft YaHei; height: 40px; box-sizing: border-box; cursor: pointer; font-size: 16px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); pointer-events: none; /* 关键点在这里,元素禁止响应鼠标事件 */ } section::after{ content: ''; border-left: 1px solid #abc; display: inline-block; width: 24px; height: 100%; background-size: contain; background-position: center; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABEklEQVRoQ+2X3Q3CMAyE3Y3YBDZAbOBRzAaMwkiMgCqlUoX4SX13qiKcl77Uzn13ddpONviaBtdvBbB3gpVAJQA6UI8QaCBcXgnAFoINKgHQQLhcmoC738zsHhHzVbJkAE38uam+qCAkAC/iF+clEHSAD+JlEFSAH+IlEDSATvF0CArARvFUCBggKZ4GAQG4+8HMTuABHxHxyPaAALKbMusKgOlmptd/J9CG+JhxblVz3XWIhz5GFxeTEJSPO9oMbISgiJ8NpAHMzTohaOLpAB0QVPESgC8QdPEygDcQEvFSgBXEmD/14Mutu5x6CnXvSryxAIhmplpVAinbiEWVANHMVKtKIGUbsagSIJqZajV8Ak/MSlox+m54VQAAAABJRU5ErkJggg==); pointer-events: auto; /* 关键点在这里,伪元素覆盖父元素的 pointer-events: none ,响应鼠标事件 */ } section span{ display: inline-block; height: 100%; vertical-align: top; line-height: 40px; padding-left: 10px; } </style>
JavaScript 代码spa
<script> document.querySelector('section').addEventListener('click', ()=>{ console.log('只有点击伪元素才能触发click'); }); </script>
经过阻止事件冒泡的方式实现
CSS基础代码同上,将 pointer-events: none;
和 pointer-events: auto;
。3d
<script> document.querySelector('section').addEventListener('click', ()=>{ // 由于其余子元素事件冒泡被阻止了,因此点击section的时候,只剩下伪元素覆盖区域进入到事件监听中 console.log('只有伪元素才能触发click'); }); document.querySelector('span').addEventListener('click', ev=>{ // 阻止文字元素的事件冒泡 ev.stopPropagation(); }); </script>
经过
event
对象的指针坐标来判断点击的是否在伪元素范围内,这种方式网上不少,你们去度娘一下就有了。
最后就是,实在不行就不要使用 ::after
了,换成实际 dom
节点吧,啊O(∩_∩)O哈哈~指针