最近項目中遇到點擊一個圖標執行某些操做的功能,原本很簡單就能實現,但圖標倒是::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哈哈~指針